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

时间:2012-02-03 14:44:11

标签: java thread-safety ejb

我正在编写一个在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来处理这个作业。作业处理与客户端分离,不需要任何事务处理。

  1. 它是否在方法调用之间保持状态?  是的,我必须保留当前的工作才能取消执行。我用静态变量解决了这个问题。我知道这也是我不应该在EJB中做的事情,但EJB绝不会用于集群。
  2. 是否可以访问文件,打开连接? 第三方库读写文件。
  3. 是否使用共享资源(如类)同步线程 变量?我不知道第三方图书馆的内部,但我想,是的!

2 个答案:

答案 0 :(得分:0)

  

这些类的实例是在运行时期间创建大量自托管线程的服务

看到这个,一个巨大的红色警示灯应该在你脑海里消失。这只表明您的库可能不适合与EJB一起使用,在继续集成之前,您应该知道彻底它的工作原理。

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

  1. 是否在方法调用之间保持状态?
  2. 是否可以访问文件,打开连接?
  3. 是否使用共享资源同步线程,如类变量?
  4. 由于您的库可能尝试将自身扩展到环境,因此一个预防措施可能是确保通过单例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)

强烈建议不要生成自己的主题,但如果你根本不使用交易并且你的应用程序确实有效,请不要太担心