Java EE服务器中的自有线程-最新技术
我知道这被认为是不好的做法,在某些情况下是被禁止的(ejb) 因此,有三个截然不同的问题:Java EE服务器中的自有线程-最新技术,java,multithreading,jakarta-ee,jsr,Java,Multithreading,Jakarta Ee,Jsr,我知道这被认为是不好的做法,在某些情况下是被禁止的(ejb) 因此,有三个截然不同的问题: 什么是最先进的技术,特别是它应该解决这个问题。这已经包含在某些应用服务器中了吗 禁止使用的规则涉及JavaEE容器。那雄猫呢?它不是一个功能齐全的JavaEE容器 我已经在网上搜索了很多关于这件事的资源,但它们主要是关于经验的博客和帖子,而且都很老了。您是否有一些链接,Sun/Oracle的官方链接会更好,它非常详细地解释了线程和JavaEE的情况。或者,如果SO政策不禁止,至少是一本好书 [更新] 对于
对于“own thread”,我的意思是使用java并发或经典的runnable接口来启动、等待等等。我想不出有多少情况下这是正确的做法 创建自己的线程时最大的问题之一是,根据您创建线程的方式,它们无法访问您首先使用容器的所有功能 我建议您尝试使用某种侦听器,然后在您喜欢的bean上调用
@Asynchronous
方法。请记住,为了使@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中的地图、队列和主题中删除事件,效果非常好
如果您仍然热衷于线程,下面的一篇文章将介绍一种非常干净的方法()
最新技术是什么,特别是JSR 236应该解决这个问题。这已经包含在某些应用服务器中了吗
JSR236(JavaEE的并发utils)最终成为JavaEE7的一部分。JavaEE7目前由GlassFish4实现,预计Wildfly 8(以前的JBossAS/EAP)将在明年初实现它
JSR236当前的一个缺点是不能定义自己的线程池;您必须使用应用服务器提供的规范,它(IMHO)严重影响规范的可用性。您可以使用专有方法绕过此限制,例如,通过与图形用户界面交互或修改应用程序安装目录中的某些文件(在大公司通常不允许这样做)
有关JSR 236的更多信息,请参阅。您的问题太广泛,因为有“三个不同的问题”。您是否建议重新措辞或删除一些要点?检查Glassfish是否支持JSR 236。试试看,把你的问题贴出来。第二个问题只适用于TomEE(Tomcat不是JavaEE容器),但这个问题并不局限于特定的容器。至于第三个,如果博客“相当”老的话“,我宁愿看
@Asynchronous
和/或MDB。@Leonardo forbidden是个大词。我们一直在JBoss和GlassFish等完整应用服务器中使用executor服务。请记住,这些线程是非托管的,如果您需要EJB,您需要从全局:
JNDI名称空间引导它。@Leonardo使用TomEE而不是Tomcat怎么样。>我想不出有多少情况下这是正确的做法
-这可能不是详细讨论这个问题的最佳场所,但是在大约10年的JavaEE开发中,我遇到了许多需要这样做的情况。您是对的,@Asynchronous
是一个非常可行的替代方案,但它只通过一个线程池运行。如果从第一个异步执行另一个@Asynchronous
,并等待结果,则可以使池死锁。因此,生产者/消费者管道不能安全地使用它来实现。JSR236认识到这一需求,但IMHO尚未完全交付。