Java: 互联网可能中断时在线更新数据的最佳实践
Java: best practice to update data online when internet can be interrupted
我有 2 个应用程序:
- 桌面版 (java)
- 网络(symfony)
我在桌面应用程序中有一些数据必须与网络应用程序中的数据一致。
所以基本上我从桌面应用程序向 Web 应用程序发送 POST
请求以更新在线数据。
但问题是,当我发送请求时,互联网并不总是可用,同时我也无法阻止用户更新桌面数据
到目前为止,这就是我的想法,以确保在互联网可用时同步数据。
如果没有,我希望你们让我走上正确的道路,以专业的方式实现我的目标。
任何关于此类主题的 link 将不胜感激。
在这种情况下,有用的模式是假设默认情况下发送数据是异步的。收集后的数据存储在某个中间结构中,等待合适的时刻发送。我认为队列可能很有用,因为它可以作为数据库的后端,并防止在发送服务器发生故障时丢失数据。单独的线程(例如作业)检查队列中的数据,如果存在,则读取它们并尝试发送。如果发送正确执行,则数据将从队列中删除。如果发生故障,数据将保留在队列中,并尝试在下一次发送它们。
这是一个典型的场景,当你想在一个事务中向一个非事务性的外部系统发送消息,你需要保证数据会尽快传输到外部系统而不会丢失。
我想到了 2 个解决方案,也许第二个更适合您的架构。
用例 1)
您可以使用死信模式的消息队列+重新传递限制设置。在这种情况下,您需要有一个应用程序服务器。
Here您可以阅读有关死信模式的详细信息。
This 文档解释了重新传递限制在 Weblogic 服务器上的工作原理。
用例 2)
您可以在 destop 应用程序的数据库中创建一个接口 table。然后将您的原始数据插入数据库并将新记录插入接口 table 以及(所有在同一事务中)。您想要 POST 的数据也需要插入到接口 table 中。接口table中新记录的状态标志可以是“ARRIVED”。然后在您的桌面应用程序中创建一个独立的计时器,它会定期搜索界面 table 中状态为“ARRIVED”的记录。这个计时器控制的进程将尝试 POST 数据到 web 服务。如果 HTTP 响应为 200,则将记录的状态更新为“SENT”。
引导可以像魅力一样工作。
你可以通过多种方式解决它。这里给出2种方式:
1.You可以用circuit breaker pattern
。您可以从 here
- 您可以使用 JMS 概念来管理它。