gpt4 book ai didi

java - 将上下文(CDI/servlet)注入(inject)新的 FutureTask 线程

转载 作者:行者123 更新时间:2023-12-02 09:06:56 24 4
gpt4 key购买 nike

我发现在 servlet 中创建的新线程不包含 servlet/CDI 上下文。我创建了一个 HelloWorld servlet(如下所示)来尝试解决这个问题。在下面的示例中,您将看到我正在新线程(FutureTask)中运行“doIt()”函数。但它返回 NULL,但是当我直接调用 'doIt()' 方法时,BeanManager 不为 NULL。

/**
* Servlet implementation class HelloWorld
*/
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;

private static Logger logger = Logger.getLogger(HelloWorld.class
.getName());

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();

writer.println("<html>");
writer.println("<head><title>Hello World Servlet</title></head>");
writer.println("<body>");
writer.println("<h1>Context injection into Thread Experiment</h1>");
try {
// 1. This is NOT working
new Thread(testTask).start();
testTask.get(5000, TimeUnit.SECONDS);

// 2. This is working
//doIt();

} catch (Exception e) {
e.printStackTrace();
}

writer.println("<body>");
writer.println("</html>");
writer.close();
}

Runnable runnable = new Runnable() {
@Override
public void run() {
try {
doIt();
} catch (Exception e) {
e.printStackTrace();
}
}
};

FutureTask<Object> testTask = new FutureTask<Object>(runnable, null);

protected void doIt() throws Exception {
if(getBeanManager() == null) {
throw new Exception( "BEAN MANAGER IS NULL");
}
}

public static BeanManager getBeanManager() {
try {
InitialContext initialContext = new InitialContext();
return (BeanManager) initialContext.lookup("java:comp/BeanManager");
} catch (NamingException e) {
logger.info("Couldn't get BeanManager through JNDI");
return null;
}
}
}

我在网上搜索但找不到比说这是可能的更好的引用。如果有人可以帮助我或为我提供一些将上下文注入(inject)/传递到新线程的好指针,那就太好了。

最佳答案

如果您使用 EJB 3.1 和 Java EE 6 或更高版本,则符号 @Asynchronous方法上使其在单独的线程中运行并负责管理资源等。

如果您需要更多控制,正如 Kalpesh Soni 指出的那样,this answer describes如何使用ManagedExecutorService ,如果您有 Java EE 7 或更高版本。

此外,我不确定您是否真的需要 getBeanManager() 静态方法 - 不仅仅是 @EJB BeanManager beanManager; (或 @注入(inject))就足够了吗?

关于java - 将上下文(CDI/servlet)注入(inject)新的 FutureTask 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385802/

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