Java-ee中的串行执行

时间:2014-04-21 13:16:03

标签: java jms executorservice java-ee-7

我有一些应该串行处理的传入并发请求。我试图通过将请求转换为消息并发布到jms队列来实现此目的。然后使用mdb处理队列。

使用特定于供应商的配置,我知道我可以将mdb限制为一个实例,但是解决此问题的推荐和可移植方式是什么?

编辑:忘了提及我真的不需要jms(可靠性等)的功能。

1 个答案:

答案 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();