2008-11-21 2 views
8

Я пытаюсь использовать this method для получения почты в нашем приложении EJB3. Короче говоря, это означает, что создание MDB со следующими примечаниями:Настраиваемые значения для аннотаций 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.

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

ответ

13

Вы можете экспортирование аннотаций минуты EJB-jar.xml, что развертывается в 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> 

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

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

+1

Для JBoss, необходимо также включить `<СПЕЦ-описатель-свойства-замены>` – eis 2014-01-09 14:06:38

+1

Для GlassFish добавить это в domain.xml файл или использовать создать-JVM-параметры команды в asadmin инструмент. – 2014-05-12 08:28:49

2

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

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

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

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