需要帮助java web app设计来执行后台任务

时间:2010-12-12 22:03:19

标签: java multithreading web-applications concurrency thread-safety

我有一个安装在台式PC上的本地Web应用程序,它需要定期通过Web服务与远程服务器同步。

我有一个“事务”表,用于存储已在本地处理并需要发送到远程服务器的事务,此表还包含从远程服务器检索的事务(已远程处理)并且需要要在本地执行(它们已使用Web服务调用检索)...事务按时间顺序执行,以确保以正确的顺序处理它们。

交易类型的一个例子是来自商店的项目的“贷款”和“退货”,例如视频租赁商店。例如,某些东西可能在本地借出并远程返回,反之亦然,或任何一系列的贷款/退货事件。

还有其他信息从远程服务器检索以更新本地记录。

当用户在本地执行任务时,我会实时更新本地数据库,并将事务添加到表中,以便与远程服务器进行后台处理。

处理后台任务的最佳方法是什么。我尝试使用在HTTPSessionListener中创建的Thread,并在删除会话时使用interrupt(),但我不认为这是最安全的方法。我也尝试使用会话属性作为锁定机制,但这也不是最好的方法。

我也想知道你怎么知道线程何时完成它的运行,以避免同时运行另一个线程。或者线程在完成之前是否已经抛弃。

我已经提出了另一个建议,使用Quartz调度程序,我还没有详细阅读这种方法。我将在实践中购买Java Concurrency的副本,但在我遇到它之前,我想要一些关于最佳方法的想法的帮助。

BTW我没有使用网络应用框架。

感谢。

2 个答案:

答案 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框架,因为它具有与调度相关的大多数功能。它具有在数据库,并发处理等中存储作业的功能。

请尝试此解决方案

  1. 创建一个表,该表存储一些标记为“Y”或“N”的标记,映射到某个可识别字段,默认值为“N”
  2. 为每个回程安排一份工作,同时给予自己的工作,如果标志是'Y'
  3. 则执行
  4. 返回时将标志更改为“N”,然后触发您要执行的过程