4

我们有一个在 Glassfish 3.1 上运行的 Java EE 应用程序,它需要接受来自用 Java 编写的遗留系统的通知。这个遗留系统提供了一个 JAR 文件,任何希望订阅系统通知的外部应用程序都应该使用该文件。

在 Java SE 应用程序中使用时,该库的工作方式如下:

  1. 使用与遗留系统的连接参数初始化库
  2. 库连接到系统并监听通知
  3. 我们的应用程序通过实现一个接口来注册通知
  4. 每当收到通知时,就会调用实现类中的方法

我们希望在 Java EE 中重现相同的方式,即每当系统发送通知时调用 EJB 方法。

JCA是要走的路吗?单例 EJB 初始化库并将自己注册为侦听器怎么样?

关于这个主题的好例子很难找到,所以如果你有任何指导,我将不胜感激。

4

1 回答 1

6

从理论上讲,JCA 确实是为此使用的专用 API。

如果应用程序是 EAR 并且 EJB 类存在于纯 EJB 模块中,那么对于允许 EJB 执行的操作有相当多的限制。JCA 可以专门做那些 EJB 不允许做的事情(反射、静态字段、创建线程、加载本机库等)。

缺点是 JCA 是一个“仔细”记录不足的 API,它更适合您所描述的此类遗留系统的供应商使用,而不是“普通”应用程序程序员使用。如果您想采用 JCA 方式,信息来源可能是 Quartz 源代码,其中包含 Quartz 的入站 JCA 资源适配器

直接将 Singleton 注册为侦听器应该小心。遗留库应该获得对单例的代理类的引用,而不是实际的实现(即不要传递this给遗留库)。

另一种选择可能是提供一个实现所需接口并注册到遗留库的常规类。收到通知后,它可以从 JNDI 查找 JMS 连接工厂和队列,然后发送消息驱动 Bean 正在侦听的 JMS 消息。

于 2011-12-10T21:38:52.517 回答