1

我有一个要求

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

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

问题是“背压”,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?

如果这是不可能的,那么使用带有睡眠的普通旧无限循环然后调用和 EJB(依次调用 dataCleanser)和事务超时有什么缺点?

不利的一面是,我知道这变成了单线程,而且我不会像使用计时器那样进行 10 次并行执行。

4

1 回答 1

2

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

@Resource
private TimerService timerService;

如果有多个 EJB 需要调度,这可以在超类中,方法如下:

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

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

于 2016-02-04T08:49:39.593 回答