Java 如何稳健地实现REST服务,检索DB记录,然后在返回之前清除它们?

Java 如何稳健地实现REST服务,检索DB记录,然后在返回之前清除它们?,java,rest,persistence,Java,Rest,Persistence,场景想象一个REST服务返回一个事物列表(例如通知) 使用情况客户端将持续轮询REST服务。REST服务从数据库检索记录。如果记录可用,它们将转换为JSON并返回给客户端。同时,从数据库中清除检索到的记录 问题如果REST端点在将结果写回客户端时遇到问题,您如何处理该问题?到那时,记录已被删除。这可能是一个可行的解决方案。 REST服务可以查询数据库中的通知列表。 它通过在数据库中设置标志来标记列表中的每个项目。 然后,它将所有这些通知记录传递给客户端 如果服务器已成功将结果发送到客户端,则会删

场景想象一个REST服务返回一个事物列表(例如通知)

使用情况客户端将持续轮询REST服务。REST服务从数据库检索记录。如果记录可用,它们将转换为JSON并返回给客户端。同时,从数据库中清除检索到的记录


问题如果REST端点在将结果写回客户端时遇到问题,您如何处理该问题?到那时,记录已被删除。

这可能是一个可行的解决方案。 REST服务可以查询数据库中的通知列表。 它通过在数据库中设置标志来标记列表中的每个项目。 然后,它将所有这些通知记录传递给客户端

如果服务器已成功将结果发送到客户端,则会删除所有标记的记录

在失败的情况下,标记的记录将被取消标记,以便在随后的轮询间隔期间传递这些记录


我希望你明白我的意思。

这可能是一个可行的解决方案。 REST服务可以查询数据库中的通知列表。 它通过在数据库中设置标志来标记列表中的每个项目。 然后,它将所有这些通知记录传递给客户端

如果服务器已成功将结果发送到客户端,则会删除所有标记的记录

在失败的情况下,标记的记录将被取消标记,以便在随后的轮询间隔期间传递这些记录


我希望你明白我的意思。

删除记录永远是一个危险的提议。您可以改为在数据上包含一个timestamp列。然后让您的RESTURL包含一个“new-since”时间戳。返回上该时间戳的所有记录


如果通知太大,您可以设置一个自动任务来清除超过一个小时的记录,或者任何适合您的时间间隔。

删除记录始终是一个危险的建议。您可以改为在数据上包含一个timestamp列。然后让您的RESTURL包含一个“new-since”时间戳。返回上该时间戳的所有记录


如果通知太大,您可以设置一个自动任务来清除超过一个小时的记录,或者任何适合您的时间间隔。

在读取access后删除DB记录听起来很奇怪。可能出现的问题立即浮现在脑海中:网络故障阻止客户端读取数据,多个客户端导致彼此看到不完整的列表,等等

宁静的问候可能是这样的:

  • 为每个通知指定一个特定的URI。允许获取和删除这些URI。一旦成功接收并处理了通知,客户端可能会触发记录删除
  • 为当前通知的集合提供URI。根据GET请求提供通知数据列表(ID、URI、时间戳、(可选:)内容)。请看一看Atom协议,了解一些想法。可选:允许POST添加新通知
通过这种方法,所有的阅读请求都保持简单。您可以在代理和客户机上使用常用的HTTP缓存机制来提高性能


无论如何:删除数据库条目是服务器上的状态更改。您不能在GET请求时执行此操作。所以帖子将是你的主要选择。但是这对你没有多大帮助,因为交流可能仍然不可靠。与REST相比,轮询qith帖子闻起来更像Web服务。

在读取access后删除DB记录听起来很奇怪。可能出现的问题立即浮现在脑海中:网络故障阻止客户端读取数据,多个客户端导致彼此看到不完整的列表,等等

宁静的问候可能是这样的:

  • 为每个通知指定一个特定的URI。允许获取和删除这些URI。一旦成功接收并处理了通知,客户端可能会触发记录删除
  • 为当前通知的集合提供URI。根据GET请求提供通知数据列表(ID、URI、时间戳、(可选:)内容)。请看一看Atom协议,了解一些想法。可选:允许POST添加新通知
通过这种方法,所有的阅读请求都保持简单。您可以在代理和客户机上使用常用的HTTP缓存机制来提高性能


无论如何:删除数据库条目是服务器上的状态更改。您不能在GET请求时执行此操作。所以帖子将是你的主要选择。但是这对你没有多大帮助,因为交流可能仍然不可靠。与REST相比,轮询qith帖子闻起来更像Web服务。

我们使用特殊的时间戳参数完成了这项工作

请求

  • 请求timestamp.min,返回所有项目和服务器时间戳
  • 从服务器请求时间戳,从hat时间戳返回项目,并删除prevoius,返回服务器时间戳
    请注意,这一切都是我们用post完成的。这意味着实际上我们发送了命令(而不是查询get)。

    我们使用了特殊的时间戳参数

    请求

  • 请求timestamp.min,返回所有项目和服务器时间戳
  • 从服务器请求时间戳,从hat时间戳返回项目,并删除prevoius,返回服务器时间戳
    请注意,这一切都是我们用post完成的。这意味着实际上我们发送了命令(而不是查询get)。

    添加一个标志实际上并不能解决问题,因为对客户端的响应失败(即服务器发送了响应,但它从未到达客户端)仍然会导致从客户端角度丢失通知。是的,我明白你的意思。这里的问题是从