我有要求
来,增加吞吐量,我实现了每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次并行执行,就像我对定时器一样。
答案 0 :(得分:2)
我在调度方面遇到了类似的问题,我决定每次逻辑结束时以编程方式重新安排回调,基于处理结果。您可以注入计时器服务:
@Resource
private TimerService timerService;
如果有多个需要调度的EJB,可以使用以下方法,这可以是超类:
protected void reschedule(long millis) {
timerService.createTimer(millis, null);
}
这样您就可以单独控制bean。我不会试图让它们相互控制,因为在具有多个JVM的集群中这将变得很困难。