Конфигурируемые значения для аннотаций MDB - PullRequest
8 голосов
/ 21 ноября 2008

Я пытаюсь использовать этот метод для получения почты в нашем приложении 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...
    }
}

У меня это работает, но ситуация далеко не идеальная: имя хоста, имя пользователя и пароль жестко закодированы. Если не использовать ant и build.properties для замены этих значений перед компиляцией, я не знаю, как их экстернализовать.

Было бы идеально использовать MBean, но я понятия не имею, как получить значения из MBean в конфигурацию MDB.

Как мне это сделать?

Ответы [ 2 ]

13 голосов
/ 03 декабря 2008

Вы можете перенести аннотации в файл ejb-jar.xml, который вы развертываете в META-INF вашего файла jar, следующим образом:

<?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>

Затем вы можете установить значение mdb.user.name в качестве системного свойства как часть командной строки для вашего сервера приложений, используя -Dmdb.user.name = theUserName, и оно будет волшебным образом получено mdb.

Надеюсь, это поможет.

2 голосов
/ 09 марта 2011

Начиная с JBoss AS 5.1, по крайней мере, вы можете использовать AOP для настройки @ActivationConfigProperties. Я обнаружил это, посмотрев примеры, которые jboss предоставляет здесь . Это полезно, если вы не хотите, чтобы ваши имя пользователя и пароли были доступны для всего контейнера в системном свойстве, или если вы похожи на меня и никогда, повторяю НИКОГДА, не хотите развертывать артефакт с именем пользователя / паролем в нем. Как бы то ни было, вот Jist ...

Аннотировать MDB, как это ...

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

Затем добавьте $ {what} -aop.xml в каталог deploy с внутренними компонентами, как показано ниже. Я оставил там исходные комментарии на случай, если 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>
...