1

好的,所以我有一个 Java 应用程序正在部署到 JBoss。应用程序需要轮询外部 Web 服务以获取作业。每个作业都可以在自己的线程上运行。这将与带有处理消息的 mdb 池的 jms 队列非常相似。唯一真正的区别是工作队列是由一个安静的 web 服务提供的。所以我的问题是启动线程池的最佳方式是什么,或者 jboss 是否有更好的方式来做到这一点。JMS 不是一个选项。

4

1 回答 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 回答