0

我试图了解在 JBoss 4.3 中运行的一些 EJB 3 代码。

我们已经在 J​​Boss 中配置了一个带有一些 MDB 配置的 ejb3-interceptors-aop.xml 文件,然后我们有了 MDB Java 类。

我想了解的是 MDB 何时以及如何“绑定”到 MQ?也就是说,MDB 何时/如何开始监听 MQ 队列?

JBoss 是否在启动时读取 ejb3-interceptors-aop.xml 文件,然后在启动时找到 AspectDomain 注释等于“GatewayMDB”并“绑定”到 MQ 队列的类?


ejb3-interceptors-aop.xml 中的 XML:

   <domain name="GatewayMDB">
      <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))">
         <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
      </bind>
      <bind pointcut="execution(public * *->*(..))">
         <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>
         <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
      </bind>
      <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)">
         @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000)
      </annotation>
      <annotation expr="!class(@org.jboss.annotation.ejb.DefaultActivationSpecs)">
         @org.jboss.annotation.ejb.DefaultActivationSpecs ({@javax.ejb.ActivationConfigProperty(propertyName = "channel", propertyValue = "SYSTEM.DEF.SVRCONN"), @javax.ejb.ActivationConfigProperty(propertyName = "hostName", propertyValue = "10.10.10.10"), @javax.ejb.ActivationConfigProperty(propertyName = "queueManager", propertyValue = "QM"), @javax.ejb.ActivationConfigProperty(propertyName = "port", propertyValue = "1419"),@javax.ejb.ActivationConfigProperty(propertyName = "transportType", propertyValue = "CLIENT")})
      </annotation>
   </domain>

MDB 类:

@MessageDriven(name = "BridgeMDB", activationConfig = {
        @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "TO.WLS.LQUEUE.BG"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "maxPoolDepth", propertyValue = "1") })
@ResourceAdapter("wmq.jmsra.rar")
@AspectDomain("GatewayMDB") 
@Interceptors(SpringBeanAutowiringInterceptor.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class BridgeMDB implements MessageListener {
    private static Logger logger = Logger.getLogger(BridgeMDB.class);


    @Autowired
    private MessageProcessor messageProcessor;
    @Autowired
    private MessageTranslator messageTranslator;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void onMessage(Message message) {
        ...
    }

}
4

2 回答 2

0

为了清楚地理解这个过程,最好的办法是阅读 JCA 规范。这是一个清晰易懂的规范。

IBM 提供了部署到 JBoss 的 JCA 适配器。当 JBoss 部署您的 MDB 时,“激活规范”将传递给 IBM JCA。然后,IBM JCA 为 MDB 实例创建托管连接工厂。请注意,这与 JBoss 服务器配置中配置的任何连接工厂是分开且不同的。

激活规范的一部分是 JMS 会话的数量。IBM JCA 创建和管理这些会话。IBM JCA 还在这些会话上创建 JMS 消息侦听器。

当接收到消息时,IBM JCA 创建消息驱动上下文,从 JBoss 托管实例池请求 MDB 实例,将消息驱动上下文提供给 MDB 实例并调用 MDB onMessage() 方法。

于 2015-02-15T15:10:11.060 回答
0

免责声明:这是一个假设,因为我不知道 jboss 代码。


在java中处理类文件的常用方法是通过类路径读取它们(在这种情况下它将在加载时)并为每个类构造某种元数据。

然后,当应用程序引导时,容器将读取类的元数据数据以连接/注入/配置在类中定义的适当属性。

至于 xml,大部分 jboss 配置是静态的 AFAIK,即,您必须重新启动应用服务器才能使更改生效。

所以总而言之,我会说你的观察是正确的。

于 2009-11-03T12:15:26.423 回答