相关疑难解决方法(0)

为什么不鼓励在Java EE容器中生成线程?

我学到的关于Java EE开发的第一件事就是我不应该在Java EE容器中生成我自己的线程.但是当我开始思考它时,我不知道原因.

你能清楚地解释为什么气馁吗?

我相信大多数企业应用程序都需要某种异步工作,如邮件守护进程,空闲会话,清理工作等.

因此,如果确实不应该生成线程,那么在需要时执行它的正确方法是什么?

java multithreading java-ee

118
推荐指数
4
解决办法
5万
查看次数

Java EE程序员不会写入文件

今天有人告诉我"Java EE程序员不写文件".为什么我不能从Java EE容器中写入文件(例如从JBoss)?怎么了?

java jboss java-ee

14
推荐指数
4
解决办法
1万
查看次数

EJB如何并行化长时间CPU密集型流程?

该应用程序具有CPU密集型长进程,当客户端请求时,该进程当前在一个服务器(EJB方法)上串行运行.

理论上可以(从概念的角度)将该进程拆分为N个块并并行执行它们,只要可以收集并连接所有并行作业的输出,然后再将其发送回发起进程的客户端.我想使用这种并行化来优化性能.

如何使用EJB实现此并行化?我知道我们不应该在EJB方法中创建线程.相反,我们应该发布消息驱动bean(MDB)消息(每个作业一个).但那时它不再是同步通话了.在这种情况下,同步似乎是一个要求,因为我需要在将所有作业的输出发送回客户端之前收集它们的输出.

这有解决方案吗?

java architecture parallel-processing ejb

13
推荐指数
2
解决办法
1万
查看次数

在Tomcat下启动线程

有人告诉我,你不应该从在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知道的某些线程池中请求一个线程,而不是上述任何一个.这有什么道理,还是完全爆发?

java multithreading tomcat

9
推荐指数
1
解决办法
1万
查看次数

如何使并发实用程序 (JSR 236) 在普通的非 EE Tomcat 8 中工作?

我的技术栈包括

为了能够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)

似乎没有任何效果,异常消失

java.lang.RuntimeException:
    Error looking up java:comp/env/.../ManagedExecutorService in JNDI
javax.naming.NameNotFoundException:
    Name [.../ManagedExecutorService] is not bound in this Context.
Run Code Online (Sandbox Code Playgroud)

这可能是由于 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)

显然,事实并非如此。

我的问题是

  1. 是否可以在非 EE 服务器上设置并发实用程序,尤其是 …

java tomcat executorservice apache-tomee java-ee-7

5
推荐指数
0
解决办法
486
查看次数

Weblogic Server 11g上的自定义线程

我的weblogic服务器上需要一个自定义的threda; 我不能使用TimerEJB或Delayed MDB,因为我必须使用3d库.

我知道不鼓励应用服务器上的自定义线程 ; 这里有一篇相关文章(4岁):为什么不鼓励在Java EE容器中产生线程?

它仍然气馁吗?我可以使用ExecutorServiceQuartz吗?或者我只考虑commonj和工人经理?

java multithreading commonj weblogic11g

3
推荐指数
1
解决办法
5049
查看次数

将Context(CDI/servlet)注入新的FutureTask Thread

我发现在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 multithreading servlets futuretask cdi

2
推荐指数
1
解决办法
3259
查看次数