サーブレットで作成された新しいスレッドに、サーブレット/CDI コンテキストが含まれていないことがわかりました。この問題を実験するために、HelloWorld サーブレット (以下を参照) を作成しました。以下の例では、新しいスレッド (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;
}
}
}
私はオンラインで検索しましたが、それが可能であると言うよりも良い参考文献を見つけることができませんでした. 誰かが私を助けたり、新しいスレッドにコンテキストを挿入/渡すための良いポインタを提供してくれたりしたら、それは素晴らしいことです。