我学到的关于Java EE开发的第一件事就是我不应该在Java EE容器中生成我自己的线程.但是当我开始思考它时,我不知道原因.
你能清楚地解释为什么气馁吗?
我相信大多数企业应用程序都需要某种异步工作,如邮件守护进程,空闲会话,清理工作等.
因此,如果确实不应该生成线程,那么在需要时执行它的正确方法是什么?
今天有人告诉我"Java EE程序员不写文件".为什么我不能从Java EE容器中写入文件(例如从JBoss)?怎么了?
该应用程序具有CPU密集型长进程,当客户端请求时,该进程当前在一个服务器(EJB方法)上串行运行.
理论上可以(从概念的角度)将该进程拆分为N个块并并行执行它们,只要可以收集并连接所有并行作业的输出,然后再将其发送回发起进程的客户端.我想使用这种并行化来优化性能.
如何使用EJB实现此并行化?我知道我们不应该在EJB方法中创建线程.相反,我们应该发布消息驱动bean(MDB)消息(每个作业一个).但那时它不再是同步通话了.在这种情况下,同步似乎是一个要求,因为我需要在将所有作业的输出发送回客户端之前收集它们的输出.
这有解决方案吗?
有人告诉我,你不应该从在Tomcat下运行的webapp(或任何其他容器,大概是)开始你自己的线程
Runnable myRunnable = new Runnable() {
public void run() {
System.out.println("I'm running");
}
}
new Thread(myRunnable).start();
Run Code Online (Sandbox Code Playgroud)
或类似地:
ScheduledThreadPoolExecutor retrySchedulerService = new ScheduledThreadPoolExecutor(3);
retrySchedulerService.schedule(dlrRetryTask, 120, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
您应该从Tomcat知道的某些线程池中请求一个线程,而不是上述任何一个.这有什么道理,还是完全爆发?
我的技术栈包括
为了能够ManagedExecutorService更明智、更安全地使用和管理线程,我想包含此依赖项
我尝试以不同的方式将 bean 注入到不同范围的 bean(基于视图、会话、基于应用程序)中。
@Inject
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
@Resource
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
@Resource(lookup="java:comp/DefaultManagedExecutorService")
private javax.enterprise.concurrent.ManagedExecutorService service;
Run Code Online (Sandbox Code Playgroud)
似乎没有任何效果,异常消失
Run Code Online (Sandbox Code Playgroud)java.lang.RuntimeException: Error looking up java:comp/env/.../ManagedExecutorService in JNDI javax.naming.NameNotFoundException: Name [.../ManagedExecutorService] is not bound in this Context.
这可能是由于 bean 注册不当造成的。因为我没有找到。我扫描了整个类路径,但在ManagedExecutorService某处找不到任何定义或其任何实现的东西。
我试图自己注册它,context.xml但无济于事。我使用这个 TomEE 教程(天真地)假设我的非 EE Tomcat 的配置是相同的。
<Resource name="ManagedExecutorService"
type="javax.enterprise.concurrent.ManagedExecutorService" />
Run Code Online (Sandbox Code Playgroud)
<Resource id="ManagedExecutorService"
type="javax.enterprise.concurrent.ManagedExecutorService" />
Run Code Online (Sandbox Code Playgroud)
显然,事实并非如此。
我的问题是
是否可以在非 EE 服务器上设置并发实用程序,尤其是 …
我的weblogic服务器上需要一个自定义的threda; 我不能使用TimerEJB或Delayed MDB,因为我必须使用3d库.
我知道不鼓励应用服务器上的自定义线程 ; 这里有一篇相关文章(4岁):为什么不鼓励在Java EE容器中产生线程?
它仍然气馁吗?我可以使用ExecutorServiceQuartz吗?或者我只考虑commonj和工人经理?
我发现在servlet donot中创建的新线程包含servlet/CDI上下文.我创建了一个HelloWorld servlet(如下所示)来试验这个问题.在下面的示例中,您将看到我在新的Thread(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 …Run Code Online (Sandbox Code Playgroud) java ×7
java-ee ×2
tomcat ×2
apache-tomee ×1
architecture ×1
cdi ×1
commonj ×1
ejb ×1
futuretask ×1
java-ee-7 ×1
jboss ×1
servlets ×1
weblogic11g ×1