2012-07-18 65 views
1

我有一个无状态的EJB,并且有一个方法应该延迟调用不同的方法。 例如:延迟之后的Java EJB调用方法

EJB 1

public void start() 
{ 
    waitFor3Seconds(); 
    doSomething1(); 
    waitFor3Seconds(); 
    doSomething2(); 
    waitFor3Seconds(); 
    doSomething3(); 
} 

如何实现waitFor3Seconds()? 我不想使用Thread.sleep(),因为它阻塞。

+0

_Any_方法,你用于造成延迟将必然阻止执行,无状态会话EJB是严格同步 – 2012-07-18 22:46:06

回答

3

一个EJB不应该在加工过程中等待,它闻起来像糟糕的设计给我。也许你应该考虑异步处理? (也许使用MDB)。并请,拒用Thread.sleep()的诱惑,这就是EJB开发(重点煤矿)的restrictions之一:

具体来说,企业Bean不应该(...)创建或管理线程

另一种可能是为计划的许多任务需要的作业调度框架(比如,Quartz),设置岗位,开始一个接一个,在你的程序所需的时间。在您的示例中,需要三个作业:doSomething1(),doSomething2()doSomething3(),配置为以所需的延迟开始。

2

使用计时器服务在Java EE提供:

http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html#bnbpa

你需要看到标题为“创建程序定时器”

+0

我已经尝试创建一个计时器,但这是不可重用的,因为计时器将始终具有相同的onTimeout调用,而不是一个waitFor3Seconds()方法。 – sworded 2012-07-18 21:27:03

+0

创建3个不同的定时器,每个定时器都调用doSomething1(),doSomething2(),doSomething3()。如果事件依赖,则创建前一个定时器内的下一个定时器。 – 2012-07-18 21:28:04

+0

这工作,但不规模。超过10个定时器后它变得难以管理。 – sworded 2012-07-18 21:31:12

0

如何实现waitFor3Seconds()?我不想使用Thread.sleep(),因为它阻塞。

无论您要实现什么等待方法,您的EJB将被阻止—设计它将在方法返回后返回到免费EJB池。这就是为什么其他人建议使用异步处理。