[英]How to embed third party code in a Java EE Environment where EJB3 is used
我正在编写一个在GlassFish 2.1.1上运行的Web应用程序。 该应用程序实际上仅包含一个无状态会话bean,该会话bean使用第三方lib中的类。 此类的实例是服务,它们在运行时期间创建许多自管理线程。 我在EJB限制中读到,在EJB中创建线程不是一个好主意。
我对Java EE和EJB还是很陌生,但是我想知道如何在EJB环境中使用不是为EJB开发的第三方库。 我想知道如何以保存方式将这个简单的单例第三方服务嵌入到我的Java EE应用程序中。
我唯一的想法是在servlet中实例化服务,并通过方法调用将实例传递给EJB。 这会是更好的方法吗?
在此先感谢亚历克斯
有关我的项目的更多详细信息:
我必须使用的库肯定不是针对EJB容器的。 但是,我没有选择。 我也改变了我的设计,我试图简要解释一下。 我的Web应用程序的主要目的是处理作业。 基本上,它类似于CI服务器hudson。 这些工作是另外一些事情,然后再建立任务。 但是,可以通过Web GUI启动作业。 如果用户按下“开始”按钮,则仅将具有状态的条目插入数据库表中。 数据库表用作执行队列。 另一个bean,TimerBean将定期检查数据库并调用enginge(这是我的第三方库)来处理此作业。 作业处理与客户端解耦,不需要事务。
此类的实例是服务,在运行时会创建很多自管理线程
看到这一点,应该在您的头部熄灭一个红色的大警示灯。 这仅表明您的库可能不是与EJB一起使用的理想选择,并且在继续进行集成之前,您应该彻底了解它的工作方式。
您可能要问的其他一些问题:
由于您的库可能会尝试将其自身扩展到环境,因此,一个预防措施可能是确保通过单例EJB对其进行访问(这至少会增加在单个VM上正确运行的机会)。 要在GF 2.1上实现此目的,您需要在sun-ejb-jar.xml
:
<ejb>
<ejb-name>MyEJB</ejb-name>
<jndi-name>ejb/MyEJB</jndi-name>
<bean-pool>
<steady-pool-size>1</steady-pool-size>
<max-pool-size>1</max-pool-size>
</bean-pool>
</ejb>
你可以在你的ininialize库@PostConstruct
的方法MyEJB
,无需使用特殊的Servlet它。
这只是解决方案的草图,一切都取决于库的实际工作方式。
强烈建议不要产生自己的线程,但是如果您根本不使用事务并且您的应用程序确实可以运行,请不要担心太多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.