我们有一个在Glassfish 3.1上运行的Java EE应用程序需要接受来自用Java编写的遗留系统的通知。此遗留系统提供了一个JAR文件,应该由希望订阅系统通知的任何外部应用程序使用。
在Java SE应用程序中使用时,库的工作方式如下:
我们希望在Java EE中重现相同的方式,只要系统发送通知就调用EJB方法。
JCA是否可行?单例EJB如何初始化库并将自己注册为侦听器?
很难找到关于这个主题的好例子,所以如果你有任何指导,我将不胜感激。
答案 0 :(得分:6)
理论上,JCA确实是用于此的专用API。
如果应用程序是EAR并且EJB类存在于纯EJB模块中,则允许EJB执行的操作存在相当多的限制。 JCA可以专门做那些不允许EJB做的事情(反射,静态字段,创建线程,加载本机库等)。
缺点是JCA是一个“精心”未充分记录的API,更倾向于由您描述的此类遗留系统的供应商使用,而不是“普通”应用程序员。如果你想采用JCA方式,一个信息来源可能是Quartz源代码,其中包含inbound JCA resource adapter for Quartz。
应仔细注意将Singleton直接注册为听众。遗留库应该引用Singleton的代理类,而不是实际的实现(即不要将this
传递给遗留库。)
另一种选择可能是提供一个实现所需接口的常规类并向遗留库注册。收到通知后,它可以从JNDI查找JMS连接工厂和队列,然后发送消息驱动Bean正在侦听的JMS消息。