2009-09-21 82 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()方法。