在另一个Java VM实例上启动一个线程并异步执行逻辑

时间:2017-11-29 06:57:01

标签: java asynchronous java-ee transactions

背景

  • 我正在开发一个在JavaEE应用服务器上运行的Web应用程序。

    • 此应用程序服务器具有“线程取消”功能。它终止长时间运行(20分钟或更长)的线程,以防止由死锁或无限循环引起的资源不足。
    • 此应用程序服务器禁止在servlet上创建子线程(此应用程序服务器可以编写一些日志以进行故障分析,但这些日志在子线程上无法正常工作)。
  • 我的应用程序有一些耗时的业务逻辑(例如,所有用户的打印明细账单)。这种逻辑是从网页上的按钮启动的。

    • 某些业务逻辑需要30分钟或更长时间才能完成(这足以让浏览器获得超时错误)。
    • 只有先前的交易成功完成后才能执行这些逻辑(例如,如果付款未成功记录到DB,则不应打印账单)。
      • 我知道我可以使用消息传递API(例如,带有JMS API的ActiveMQ具有事务功能)。但我想避免使用这些解决方案,因为在某些情况下,RDBMS和JMS之间的全局事务将会中断。

问题

我认为我必须在另一个Java VM上的线程上运行这些逻辑。 如何在另一个Java VM实例上启动线程,并异步执行逻辑?

2 个答案:

答案 0 :(得分:0)

我认为你不能直接在另一个JVM中启动一个线程。由于您没有使用消息队列,所以我可以考虑使用RMI在另一个JVM上的另一个进程上调用方法,这反过来可以为您启动该线程。

答案 1 :(得分:0)

经过进一步调查,我发现JDBC Support feature in Spring Integration涵盖了我的要求。 您可以INSERT使用出站通道适配器向RDBMS请求异步业务逻辑执行,并使用入站通道适配器在另一个JVM上运行业务逻辑。