gpt4 book ai didi

java - EJB 3.1 : Kick off asynchronous task in stateless bean

转载 作者:行者123 更新时间:2023-12-02 03:55:49 24 4
gpt4 key购买 nike

我有一个@Stateless bean,其中的方法需要快速返回状态,但在后台线程中执行长时间运行的任务。我的方法是执行以下操作:

创建一个线程池来执行这些任务,并将线程池设为成员变量:

final ExecutorService m_threadPool = Executors.newFixedThreadPool(5 /* Get from config*/, new ThreadFactory()
{
public Thread newThread(final Runnable r) {
return new Thread(r, "NotificationInputHandler Thread");
}
});

将我的服务方法分为两部分:1)createStatus 和 2)performBigTask

public Result process(final List<String> input) {
final Result status = createStatus(input)
m_threadPool.submit(new Runnable() {
public void run() {
performBigTask(input);
}
});
return status;
}

我的问题是:1. 可以用更好的方式做到这一点吗?2. 我在 JBoss 7 上运行。是否有应用程序服务器提供的线程池我可以注入(inject)而不是实例化自己的线程池?

最佳答案

您可以使用 @Asynchronous ,让另一个无状态 session B bean 来完成您的大任务,并使用 @Asynchronous 注释其方法,然后让您原始 session Bean 让我们在返回状态之前调用它 A 调用

B:

@Asynchronous
public Future<SomeResult> performBigTask(List<String> input){
/*run your big task*/
return new Asynchronous<SomeResult>(bigTaskResult);}

答:

@EJB B b;
public Result process(final List<String> input) {
final Result status = createStatus(input)
Future<SomeResult>result= b.performBigTask(input);
//check if every thing went well or what ever logic you have
return status;
}

如果你想了解如何操纵 Future,这里有一个链接 oracle tutorial

关于java - EJB 3.1 : Kick off asynchronous task in stateless bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35463819/

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