繁体   English   中英

如何在使用EJB3的Java EE环境中嵌入第三方代码

[英]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(这是我的第三方库)来处理此作业。 作业处理与客户端解耦,不需要事务。

  1. 它是否在方法调用之间保持状态? 是的,我必须保留当前作业才能取消执行。 我已经解决了一个静态变量。 我知道这也是我在EJB中不应该做的事情,但是EJB将永远不会用于集群。
  2. 它访问文件,打开连接吗? 第三方库读取和写入文件。
  3. 它是否使用类变量等共享资源来同步线程? 我不知道第三方库的内部结构,但我想是的!

此类的实例是服务,在运行时会创建很多自管理线程

看到这一点,应该在您的头部熄灭一个红色的大警示灯。 这仅表明您的库可能不是与EJB一起使用的理想选择,并且在继续进行集成之前,您应该彻底了解它的工作方式。

您可能要问的其他一些问题:

  1. 它是否在方法调用之间保持状态?
  2. 它访问文件,打开连接吗?
  3. 它是否使用类变量等共享资源来同步线程?

由于您的库可能会尝试将其自身扩展到环境,因此,一个预防措施可能是确保通过单例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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM