代码之家  ›  专栏  ›  技术社区  ›  Sietse

MDB注释的可配置值

  •  8
  • Sietse  · 技术社区  · 17 年前

    我想用 this method 用于在我们的EJB3应用程序中接收邮件。简而言之,这意味着创建具有以下注释的MDB:

    @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "mailServer", propertyValue = "imap.company.com"),
        @ActivationConfigProperty(propertyName = "mailFolder", propertyValue = "INBOX"),
        @ActivationConfigProperty(propertyName = "storeProtocol", propertyValue = "imap"),
        @ActivationConfigProperty(propertyName = "debug", propertyValue = "false"),
        @ActivationConfigProperty(propertyName = "userName", propertyValue = "username"),
        @ActivationConfigProperty(propertyName = "password", propertyValue = "pass") })
    @ResourceAdapter("mail-ra.rar")
    @Name("mailMessageBean")
    public class MailMessageBean implements MailListener {
        public void onMessage(final Message msg) {
           ...snip...
        }
    }
    

    2 回复  |  直到 16 年前
        1
  •  13
  •   Brett Hannah    17 年前

    您可以将注释外部化到ejb-jar.xml中,该ejb-jar.xml部署在jar文件的META-INF中,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <ejb-jar version="3.0">
        <enterprise-beans>
            <message-driven>
                <ejb-name>YourMDB</ejb-name>
                <ejb-class>MailMessageBean</ejb-class>        
                <activation-config>
                    <activation-config-property>
                       <activation-config-property-name>username</activation-config-property-name>
                       <activation-config-property-value>${mdb.user.name}</activation-config-property-value>
                    </activation-config-property>
    ...
    ...
                </activation-config>
            </message-driven>
        </enterprise-beans>
    

    然后,您可以使用-Dmdb.user.name=username将mdb.user.name值设置为系统属性,作为应用程序服务器命令行的一部分,mdb将神奇地获取该值。

        2
  •  2
  •   Joseph Valerio    15 年前

    至少从JBossAS5.1开始,您可以使用AOP配置@ActivationConfigProperties。我通过查看jboss提供的示例发现了这一点 here

    像这样注释mdb。。。

    ...
    @MessageDriven
    @AspectDomain("TestMDBean")
    public class TestMDBean implements MessageListener {
    ...
    

    然后将${whatever}-aop.xml添加到deploy dir,其内部结构如下所示。我在那里留下了最初的评论,以防Jaikiran做了上面提到的更改。。。

    <?xml version="1.0" encoding="UTF-8"?>
    <aop xmlns="urn:jboss:aop-beans:1.0">
       <!-- TODO: Jaikiran - These interceptor declarations need not be here since they 
       are already declared through the ejb3-interceptors-aop.xml. Duplicating them leads to
       deployment errors. However, if this custom-ejb3-interceptors-aop.xml needs to be 
       independent, then we must find a better way of declaring these. Right now, commenting these
       out, can be looked at later. -->
       <!--    
       <interceptor class="org.jboss.ejb3.AllowedOperationsInterceptor" scope="PER_VM"/>
       <interceptor class="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" scope="PER_VM"/>
       <interceptor factory="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory" scope="PER_CLASS"/>
       <interceptor class="org.jboss.ejb3.stateless.StatelessInstanceInterceptor" scope="PER_VM"/>
    
       <interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/>
       <interceptor factory="org.jboss.aspects.tx.TxInterceptorFactory" scope="PER_CLASS_JOINPOINT"/>
       -->
       <domain name="TestMDBean" extends="Message Driven Bean" inheritBindings="true">
          <annotation expr="!class(@org.jboss.ejb3.annotation.DefaultActivationSpecs)">
             @org.jboss.ejb3.annotation.DefaultActivationSpecs (value={@javax.ejb.ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), @javax.ejb.ActivationConfigProperty(propertyName="destination", propertyValue="queue/MyQueue"), @javax.ejb.ActivationConfigProperty(propertyName="user", propertyValue="testusr"), @javax.ejb.ActivationConfigProperty(propertyName="password", propertyValue="testpwd")})
          </annotation>
       </domain>
    </aop>
    
    推荐文章