我正在编写一个在GlassFish 2.1.1上运行的Web应用程序。该应用程序实际上只包含一个无状态会话bean,它使用来自第三方lib的类。这些类的实例是在运行时期间创建大量自我管理线程的服务。我在EJB限制中读到,在EJB中创建线程并不是一个好主意。
我是Java EE和EJB的新手,但我想知道如何在EJB环境中使用不是为EJB开发的第三方库。我想知道如何在保存方式中使用EJB在我的Java EE应用程序中嵌入这个简单单例的第三方服务。
我唯一的想法是在servlet中实例化服务,并通过方法调用将实例传递给EJB。这会是一个更好的方法吗?
提前谢谢 亚历关于我的项目的更多细节:
我必须使用的库肯定不是针对EJB容器的。但是,我没有选择。我也改变了我的设计,我试着简单解释一下。 我的webapplication的主要目的是处理作业。基本上它类似于CI服务器hudson。工作是其他事情,然后建立任务。但是,可以通过Web GUI启动作业。如果用户按下开始按钮,则只有具有状态的条目插入数据库表中。数据库表用作执行队列。另一个bean,TimerBean将定期检查数据库并调用enginge,这是我的thridparty lib来处理这个作业。作业处理与客户端分离,不需要任何事务处理。
答案 0 :(得分:0)
这些类的实例是在运行时期间创建大量自托管线程的服务
看到这个,一个巨大的红色警示灯应该在你脑海里消失。这只表明您的库可能不适合与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>
您可以使用@PostConstruct
MyEJB
方法初始化您的库,无需使用特殊的servlet。
这只是解决方案的草图,一切都取决于图书馆的真正运作方式。
答案 1 :(得分:-1)
强烈建议不要生成自己的主题,但如果你根本不使用交易并且你的应用程序确实有效,请不要太担心