Java ee 6 WebSphere8中带线程睡眠的无限循环与EJB3.1计时器:背压

Java ee 6 WebSphere8中带线程睡眠的无限循环与EJB3.1计时器:背压,java-ee-6,ejb-3.1,websphere-8,ejb-timer,Java Ee 6,Ejb 3.1,Websphere 8,Ejb Timer,我有一个要求 读取数据库表 处理数据(数据清理器) 为了提高吞吐量,我实现了EJB定时器(非持久性),每5分钟(其中10个)唤醒一次,并完成上述工作 问题是“背压”,dataCleanser有时可能需要12分钟(进行外部API调用),当这种情况发生时,Websphere会报告挂起的线程 在这些情况下,我希望通过编程减少计时器的数量(比如从10个减少到5个)。 我只能在计时器返回时报告其成功执行或异常或超时的状态 这样我可以控制背压。 在Websphere 8中是否有这样做的方法? 用另一种方

我有一个要求

  • 读取数据库表
  • 处理数据(数据清理器)
为了提高吞吐量,我实现了EJB定时器(非持久性),每5分钟(其中10个)唤醒一次,并完成上述工作

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

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

这样我可以控制背压。
在Websphere 8中是否有这样做的方法?

用另一种方式问这个问题
-EJB计时器(不支持事务)能否调用另一个具有事务超时的EJB?
-这些超时可以在调用计时器代码中捕获吗?

如果这是不可能的,那么将普通的无限循环与sleep一起使用,然后在事务超时的情况下调用EJB(反过来调用dataCleanser)有什么坏处呢


缺点之一是,我知道这会变成单线程,我不知道如何像使用计时器那样进行10次并行执行。

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

@Resource
私人TimerService TimerService;
如果有多个EJB需要调度,则可以在超类中进行调度,方法如下:

受保护的无效重新调度(长毫秒){
timerService.createTimer(毫秒,空);
}

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

经过一些实验,我发现如果你有10个计时器,例如,无论每个计时器完成工作需要多少时间,下一个“tik”都不会发生,直到工作完成。因此,将始终有10个计时器,并且“tik”的数量将始终是正常的(即它们不会堆积起来)