JBoss EJB3 MDB配置
我试图理解JBoss4.3中运行的一些EJB3代码 我们在JBoss中配置了一个ejb3-interceptors-aop.xml文件和一些MDB配置,然后我们得到了MDB Java类 我想了解的是MDB何时以及如何“绑定”到MQ?也就是说,MDB何时/如何开始侦听MQ队列 JBoss是否在启动时读取ejb3-interceptors-aop.xml文件,然后找到AspectDomain注释等于“GatewayMDB”且在启动时“绑定”到MQ队列的类JBoss EJB3 MDB配置,jboss,ejb-3.0,message-queue,jboss-mdb,Jboss,Ejb 3.0,Message Queue,Jboss Mdb,我试图理解JBoss4.3中运行的一些EJB3代码 我们在JBoss中配置了一个ejb3-interceptors-aop.xml文件和一些MDB配置,然后我们得到了MDB Java类 我想了解的是MDB何时以及如何“绑定”到MQ?也就是说,MDB何时/如何开始侦听MQ队列 JBoss是否在启动时读取ejb3-interceptors-aop.xml文件,然后找到AspectDomain注释等于“GatewayMDB”且在启动时“绑定”到MQ队列的类 ejb3-interceptors-aop
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>
免责声明:这是一个假设,因为我不知道jboss代码
在java中处理类文件的常用方法是通过类路径读取它们(在本例中是在加载时),并为每个类构造某种元数据 然后,当应用程序引导时,容器将读取类的元数据,以连接/注入/配置在类中定义的适当属性 至于xml,jboss的大部分配置都是静态的,也就是说,您必须重新启动应用服务器才能使更改生效
总而言之,我认为您的观察是正确的。为了清楚地理解这个过程,您最好阅读JCA规范。这是一个清晰易懂的规范 IBM提供了部署到JBoss的JCA适配器。当JBoss部署MDB时,一个“激活规范”被传递给IBMJCA。然后,IBMJCA为MDB实例创建一个托管连接工厂。请注意,这与JBoss服务器配置中配置的任何连接工厂都是不同的 激活规范的一部分是JMS会话的数量。IBMJCA创建并管理这些会话。IBMJCA还可以在这些会话上创建JMS消息侦听器 当收到消息时,IBM JCA创建消息驱动上下文,从JBoss托管实例池请求MDB实例,向MDB实例提供消息驱动上下文,并调用MDB onMessage()方法
@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) {
...
}
}