2008-11-21 76 views
8

我試圖在我們的EJB3應用程序中使用this method來接收郵件。總之,這意味着與以下注釋創建一個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

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

<?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文件中添加此或使用create-JVM選項的asadmin命令工具。 – 2014-05-12 08:28:49

2

從JBoss AS 5.1起,至少可以使用AOP來配置@ActivationConfigProperties。我通過查看jboss提供的示例發現了這個問題here。如果您不希望您的用戶名和密碼可用於系統屬性中的整個容器,或者如果您像我一樣,永遠不會,我永遠不會重複,想要在其中部署帶有用戶名/密碼的工件,這非常有用。任何如何,這裏是JIST ...

註釋這樣的MDB ...

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

然後,$ {}任何與-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>