好的,所以我有一个 Java 应用程序正在部署到 JBoss。应用程序需要轮询外部 Web 服务以获取作业。每个作业都可以在自己的线程上运行。这将与带有处理消息的 mdb 池的 jms 队列非常相似。唯一真正的区别是工作队列是由一个安静的 web 服务提供的。所以我的问题是启动线程池的最佳方式是什么,或者 jboss 是否有更好的方式来做到这一点。JMS 不是一个选项。
问问题
3160 次
1 回答
1
从理论上讲,您不应该在 Java EE 容器中管理自己的线程(实际上,如果您不使用 EJB、JPA 或任何其他容器功能,它会更加轻松)。
在 Java EE 6 (JBoss 7) 中,您可以使用 Java EE 的特性来做到这一点;您需要通过新的@Asynchronous EJB 调用来利用计时器功能。唯一的问题是您没有异步调用的持久性,如果它失败(处理期间服务器崩溃),则作业将丢失。
如果您需要确保工作已完成,唯一的 Java EE 方法是持久性 JMS(甚至是使用计时器 EJB 填充的本地方法)
示例:
@Singleton
@Startup
public class Pool{
@Inject
private AsyncBean aBean;
@Resource
private TimerService timerService;
@Timeout
public void pull(){
try{
// for performance you may get several job and launch several async job
job = getJob() // make your REST call to get the job
// make sure you realy get a job
aBean.async(job)
}finally{
//recreate the timer
timerService.createSingleActionTimer(100, new TimerConfig("timer name", false));
}
}
@PostConstruct
void init(){
timerService.createSingleActionTimer(100, new TimerConfig("timer name", false));
// as timer is created at each start up no need to persist it.
}
}
异步 bean:
@Stateless
public class AsyncBean{
@Asynchronous
public void async(Job job){
// do your stuff
}
}
于 2012-07-27T18:22:22.680 回答