【问题标题】:Batch job is stuck at STARTING when submited from a JMS Listener onMessage()从 JMS 侦听器 onMessage() 提交时,批处理作业卡在 STARTING
【发布时间】:2017-12-05 23:14:02
【问题描述】:

我正在尝试根据 JSR 352 规范使用从 JMS MessageListener 中的 onMessage(...) 方法中的 BatchRuntime 获得的 JobOperator 启动批处理作业。

JobOperator jobOperator = BatchRuntime.getJobOperator();
Properties props = new Properties();
props.setProperty("sourceFile", "data_file.csv");
jobOperator.start("batchTask", props);

结果是作业执行卡在STARTING。当我尝试从同一个线程停止任务时,它同样卡在 STOPPING。

从一个普通的HttpServlet 开始同一个作业,它会立即运行到完成。为什么会这样?

【问题讨论】:

  • 当您说 MessageListener 时,您是指除 MDB 之外的其他东西吗?如果是这样,那可能就是问题所在。

标签: java jms glassfish-4.1 activemq-artemis jsr352


【解决方案1】:

您应该使用 MDB 在 EE 应用程序服务器中使用 JMS 消息,而不是您自己的 MessageListener。 (见here。)

批处理需要在托管线程上运行,以便 EE 上下文可用,以便 EE API(例如用作批处理“线程池”的 ManagedExecutorService)能够正常运行。

在使用非托管线程时,除了批处理(以及可能的其他应用服务器功能)之外,其他 EE API 也会存在潜在问题,这就是 MDB 是此处必要方法的原因。

【讨论】:

  • 谢谢 Scott,我对 EE 环境的理解确实存在差距。我的 MessageListener 以 @javax.inject.Singleton 实例运行。你的三个段落也回答了我心中的更多问题。
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2021-08-01
  • 2018-04-30
相关资源
最近更新 更多