【问题标题】:Threading in JBossJBoss 中的线程
【发布时间】:2013-05-03 14:58:40
【问题描述】:

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

【问题讨论】:

    标签: multithreading jboss


    【解决方案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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多