我有一些应该串行处理的传入并发请求。我试图通过将请求转换为消息并发布到jms队列来实现此目的。然后使用mdb处理队列。
使用特定于供应商的配置,我知道我可以将mdb限制为一个实例,但是解决此问题的推荐和可移植方式是什么?
编辑:忘了提及我真的不需要jms(可靠性等)的功能。
答案 0 :(得分:1)
假设你有这样的工作。
class LogJob implements Runnable{
private final String name;
public LogJob(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(" Starting ."+name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(" End ."+name);
}
}
它只是显示开始和结束Job。放置睡眠进行演示
创建工作列表
ArrayList<LogJob> jobs = new ArrayList<LogJob>();
for ( int i=0;i<10;i++){
LogJob job = new LogJob("Job"+i);
jobs.add(job);
}
让我们看看如何串行处理
ExecutorService singleThread = Executors.newSingleThreadExecutor();
for (Iterator<LogJob> iterator = jobs.iterator(); iterator.hasNext();) {
singleThread.execute(iterator.next());
}
singleThread.shutdown();
这将提供输出。
Starting .Job0
End .Job0
Starting .Job1
End .Job1
Starting .Job2
End .Job2
Starting .Job3
End .Job3
Starting .Job4
End .Job4
Starting .Job5
End .Job5
Starting .Job6
End .Job6
Starting .Job7
End .Job7
Starting .Job8
End .Job8
Starting .Job9
End .Job9
<强>更新强>
根据评论中的对话,我开始知道你必须在Java-EE环境中使用它。
正如你所说,你必须使用ManagedExecutorService
。你怎么不需要使用singleton Ejb和ConcurrentLinkedQueue。
您可以将Jobs实现为Callable,并且可以使用Future.get()
阻止进一步处理String name = managedService.submit(iterator.next()).get();
来自API
If you would like to immediately block waiting for a task,
you can use constructions of the form result = exec.submit(aCallable).get();