【发布时间】:2013-05-03 14:58:40
【问题描述】:
好的,我有一个 Java 应用程序正在部署到 JBoss。应用程序需要轮询外部 Web 服务以获取作业。每个作业都可以在自己的线程上运行。这将与带有处理消息的 mdb 池的 jms 队列非常相似。唯一真正的区别是工作队列由宁静的 Web 服务提供。所以我的问题是启动线程池的最佳方式是什么,或者 jboss 是否有更好的方式来做到这一点。 JMS 不是一个选项。
【问题讨论】:
标签: multithreading jboss
好的,我有一个 Java 应用程序正在部署到 JBoss。应用程序需要轮询外部 Web 服务以获取作业。每个作业都可以在自己的线程上运行。这将与带有处理消息的 mdb 池的 jms 队列非常相似。唯一真正的区别是工作队列由宁静的 Web 服务提供。所以我的问题是启动线程池的最佳方式是什么,或者 jboss 是否有更好的方式来做到这一点。 JMS 不是一个选项。
【问题讨论】:
标签: multithreading jboss
理论上您不应该在 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
}
}
【讨论】: