3

我知道这被认为是不好的做法,在某些情况下是被禁止的(ejb)。

因此,存在三个不同的问题:

  1. 什么是最先进的技术,特别是应该解决这个问题的JSR 236 。这是否已经包含在某些应用程序服务器中?

  2. 禁止规则涉及 Java EE 容器。雄猫呢?它不是一个功能齐全的 Java EE 容器。

  3. 我已经在网上搜索过,发现很多资源都在谈论这件事,但主要是关于经验的博客和帖子,而且都是相当古老的。你有一些链接吗,来自 Sun/Oracle 的官方链接会更好,它非常详细地解释了线程和 Java EE 的情况。或者至少,如果 SO 政策没有禁止它,这是一本好书。

[更新]

对于“自己的线程”,我的意思是使用 java 并发或带有 start、wait 等的经典可运行接口。

4

2 回答 2

2

什么是最先进的技术,特别是应该解决这个问题的 JSR 236。这是否已经包含在某些应用程序服务器中?

JSR 236(Java EE 的并发工具)最终成为 Java EE 7 的一部分。Java EE 7 目前由 GlassFish 4 实现,预计 Wildfly 8(以前的 JBoss AS/EAP)将在明年初实现它。

JSR 236 当前的一个缺点是您无法定义自己的线程池;您必须与应用程序服务器提供的有关(恕我直言)严重影响规范的可用性。您可以使用专有方法解决此限制,例如,可能通过与图形 UI 交互或通过修改应用程序安装目录中的某些文件(在大公司中通常不允许这样做)。

有关 JSR 236 的一些其他资源,请参阅此内容。

于 2013-09-15T13:53:28.363 回答
0

我想不出有多少场合这是正确的做法。

创建自己的线程时最大的问题之一是,根据您创建线程的方式,它们首先无法访问您使用容器的所有功能。

我建议您尝试使用某种侦听器,然后@Asynchronous在您最喜欢的 bean 上调用方法。请记住,为了@Asynchronous工作,它必须通过代理调用,否则容器对调用一无所知,最终成为同一线程中的普通方法调用。

class MyListener {
    private MyBean proxy;

    MyListener(MyBean proxy) {
        this.proxy = proxy;
    }

    void handler(MyEvent event) {
        proxy.handler(event);
    }
}

@ApplicationScoped
public class MyBean {

    private MyBean proxy;

    @PostConstruct
    private void init() {
        // Use JNDI or BeanManager to get a proxy to this bean
        proxy = ??
    }

    @Asynchronous
    void handler(MyEvent event) {
    }
}

现在,即使您使用的侦听器不遵守容器线程规则,您仍然可以在处理程序中使用容器功能。我使用它来从 Hazelcast 中的地图、队列和主题中删除事件,并且效果很好。

如果您仍然热衷于做线程,这里有一篇文章解释了一种非常简洁的方法(http://www.adam-bien.com/roller/abien/entry/conveniently_transactionally_and_legally_starting)。

于 2013-09-12T21:17:33.823 回答