具有线程休眠的无限循环与EJB中的EJB 3.1计时器:背压

时间:2016-02-04 08:41:59

标签: java-ee-6 ejb-3.1 websphere-8 ejb-timer

我有要求

  • 阅读数据库表
  • 处理数据(dataCleanser)

来,增加吞吐量,我实现了每5分钟唤醒一次的EJB定时器(非持久性)(其中10个)并完成上述工作。

问题是'背压',dataCleanser有时需要12分钟(进行外部API调用),当发生这种情况时,Websphere会报告一个挂起的线程。

在这些情况下,我想以编程方式减少计时器的数量(比如10到5)。 我只能在计时器返回时报告其成功执行或异常或超时的状态

这样我可以控制背压。 is there anyway to do that in Websphere 8?

以另一种方式提出问题

- can the EJB timers(with transaction_not_supported) invoke another EJB that have transaction timeouts? - can those timeouts be caught in the calling timer code?

如果不可能,那么使用带有sleep的普通旧无限循环,然后使用事务超时调用和EJB(进而调用dataCleanser)会有什么缺点?

缺点之一,我知道这会变成单线程,我不知道如何进行10次并行执行,就像我对定时器一样。

1 个答案:

答案 0 :(得分:2)

我在调度方面遇到了类似的问题,我决定每次逻辑结束时以编程方式重新安排回调,基于处理结果。您可以注入计时器服务:

@Resource
private TimerService timerService;

如果有多个需要调度的EJB,可以使用以下方法,这可以是超类:

protected void reschedule(long millis) {
    timerService.createTimer(millis, null);
}

这样您就可以单独控制bean。我不会试图让它们相互控制,因为在具有多个JVM的集群中这将变得很困难。