生产者使用Java EE中的BlockingQueues作为后台任务

时间:2014-04-21 17:33:56

标签: multithreading java-ee producer-consumer

我想在我的网络应用中将生产者消费者模式作为后台任务我需要自动启动/停止预定的投注并执行相关任务(列出交易和其他内容)。

这将全天候运行(当没有产生任何东西时会阻止/停止?)。

这是使用新的EJB异步方法的实现(因此不需要使用线程池并将任务创建为类)

这是一个合适的解决方案吗?实现我可以在管理面板中管理的bean,并在需要时启动和停止监视。

@Singleton
@Stateless
@ManagedBean
public class BetManagerBean{

    private BlockingQueue nonStartedBetsQueue_ = new ...;
    private BlockingQueue startedBetsQueue_ = new ...;
    private BlockingQueue finishedBetsQueue_ = new ...;
    private boolean monitoring_ = false;
    private int delay_ = 10000;

    @Inject
    BetDao betDao;


    public boolean getMonitoring(){
        return monitoring_;
    }
    public void setMonitoring(boolean monitoring){
        monitoring_ = monitoring;
    }


    public void startMonitoring(){
        if(monitoring_ == false){
            setMonitoring(true);
            fetchesNonStartedBets();
            monitorNonStartedBets();
            monitorStartedBets();
            monitorFinishedBets();
        }
    }

    public void stopMonitoring(){
        setMonitoring(false);
    }

    @Async
    private void fetchesNonStartedBets(){
        while(monitoring_){
            List<BetEntity> nonStartedBets = betDao.getNonStartedBets();
            for(BetEntity bet : nonStartedBets){
                nonStartedBetsQueue_.put(bet);
            }
            Thread.getCurrentThread.sleep(delay_);
        }
    }

    @Async
    private void monitorNonStartedBets(){
        while(monitoring_){
            BetEntity bet = nonStartedBetsQueue_.take();    
            if(checkBetStart(bet)){
                betsToRemove.add(bet);
                bet = initiateBet(bet);
                startedBetQueue_.put(bet);
                betDao.updateBet(bet);
            }
            else{
                nonStartedBetsQueue_.put(bet); //Reput it in the queue
            }
        }
    }

    @Async
    private void monitorStartedBets(){
        while(monitoring_){
            BetEntity bet = startedBetsQueue_.take();
            bet = updateBet(bet);
            if(checkBetFinish(bet)){
                bet = closeBet(bet);
                finishedBetsQueue_.put(bet);
                betDao.updateBet(bet);
            }
            else{
                 startedBetsQueue_.put(bet); //Reput it in the queue
            }
        }
    }

    @Async
    private void monitorFinishedBets(){
        while(monitoring_){
            BetEntity bet = finishedBetsQueue_.take();
            manageBet(bet); //do some stuff....
        }
    }


}

我等待您的意见或建议,随时纠正我想要的任何内容。

谢谢!

0 个答案:

没有答案