我想在我的网络应用中将生产者消费者模式作为后台任务。 我需要自动启动/停止预定的投注并执行相关任务(列出交易和其他内容)。
这将全天候运行(当没有产生任何东西时会阻止/停止?)。
这是使用新的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....
}
}
}
我等待您的意见或建议,随时纠正我想要的任何内容。
谢谢!