我有一些传入的并发请求,它们应该以串行方式处理。我试图通过将请求转换为消息并将其发送到jms队列来实现这一点。然后使用mdb处理队列。
使用特定于供应商的配置,我知道我可以将mdb限制为一个实例,但建议使用什么可移植的方法来解决此问题?
编辑:忘记提到我并不真正需要jms的特性(可靠性等)。
发布于 2014-04-21 22:28:52
假设你有这样的Job。
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);
}
}它只是显示开始和结束作业。放置睡眠以进行演示
创建作业列表
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。然而,你不需要使用单例Ejb和ConcurrentLinkedQueue。
您可以将作业实现为可调用的,并且可以使用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();https://stackoverflow.com/questions/23198220
复制相似问题