2009-09-21 85 views
0

我想了解一些在JBoss 4.3中运行的EJB 3代码。JBoss EJB3 MDB配置

我们已经在JBoss中配置了ejb3-interceptors-aop.xml文件,并配置了一些MDB配置,然后我们获得了MDB Java类。

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

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


XML在EJB3拦截器-aop.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) { 
     ... 
    } 

} 

回答

0

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


的处理类文件在Java中常见的方式是通过类路径读取它们(在这种情况下,将在加载时)和构建某种元数据为每个类。

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

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

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

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()方法。