gpt4 book ai didi

java - Java-ee 中的串行执行

转载 作者:行者123 更新时间:2023-12-01 13:06:51 24 4
gpt4 key购买 nike

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

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

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

最佳答案

假设你有这样的工作。

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);
}
}

它只是显示开始和结束作业。为演示放置 sleep

创建职位列表

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

关于java - Java-ee 中的串行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com