我有一个安装在台式PC上的本地Web应用程序,它需要定期通过Web服务与远程服务器同步。
我有一个“事务”表,用于存储已在本地处理并需要发送到远程服务器的事务,此表还包含从远程服务器检索的事务(已远程处理)并且需要要在本地执行(它们已使用Web服务调用检索)...事务按时间顺序执行,以确保以正确的顺序处理它们。
交易类型的一个例子是来自商店的项目的“贷款”和“退货”,例如视频租赁商店。例如,某些东西可能在本地借出并远程返回,反之亦然,或任何一系列的贷款/退货事件。
还有其他信息从远程服务器检索以更新本地记录。
当用户在本地执行任务时,我会实时更新本地数据库,并将事务添加到表中,以便与远程服务器进行后台处理。
处理后台任务的最佳方法是什么。我尝试使用在HTTPSessionListener中创建的Thread,并在删除会话时使用interrupt(),但我不认为这是最安全的方法。我也尝试使用会话属性作为锁定机制,但这也不是最好的方法。
我也想知道你怎么知道线程何时完成它的运行,以避免同时运行另一个线程。或者线程在完成之前是否已经抛弃。
我已经提出了另一个建议,使用Quartz调度程序,我还没有详细阅读这种方法。我将在实践中购买Java Concurrency的副本,但在我遇到它之前,我想要一些关于最佳方法的想法的帮助。
BTW我没有使用网络应用框架。
感谢。
答案 0 :(得分:3)
最安全的是创建一个由容器管理的应用程序范围的线程池。怎么做取决于使用的容器。如果您的容器不支持它(例如Tomcat)或者您希望与容器无关,那么基本方法是实现ServletContextListener
,在提供ExecutorService
API的Java 1.5的帮助下创建线程池在启动时并在关机时杀死线程池。如果您还没有使用Java 1.5或想要更多抽象,那么您也可以使用Spring's TaskExecutor
有一个关于concurrency utilities的Java EE提案,但它尚未进入Java EE 6。
答案 1 :(得分:1)
最好使用Quartz Scheduling框架,因为它具有与调度相关的大多数功能。它具有在数据库,并发处理等中存储作业的功能。
请尝试此解决方案