2008-11-21 12 views
8

मैं अपने ईजेबी 3 ऐप में मेल प्राप्त करने के लिए this method का उपयोग करने का प्रयास कर रहा हूं। संक्षेप में, जो निम्न एनोटेशन के साथ एक एमडीबी बनाने का अर्थ है:एमडीबी एनोटेशन के लिए कॉन्फ़िगर करने योग्य मान

@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... 
    } 
} 

मैं इस काम के लिए है, लेकिन स्थिति आदर्श से कम है: होस्ट नाम, उपयोगकर्ता नाम और पासवर्ड हार्डकोडेड हैं। संकलन से पहले उन मानों को प्रतिस्थापित करने के लिए चींटी और build.properties का उपयोग करने से कम, मुझे नहीं पता कि उन्हें कैसे बाहरी बनाना है।

एमबीन का उपयोग करना आदर्श होगा, लेकिन मुझे नहीं पता कि एमबीबी से एमडीबी कॉन्फ़िगरेशन में मूल्य कैसे प्राप्त करें।

मुझे यह कैसे करना चाहिए?

उत्तर

13

आप इस प्रकार EJB-jar.xml है कि आप अपने जार फ़ाइल का META-INF में तैनात में एनोटेशन externalise कर सकते हैं:

<?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 सेट कर सकते हैं .Dmdb.user.name = theUserName का उपयोग करके आपके एप्लिकेशन सर्वर पर कमांड लाइन के हिस्से के रूप में सिस्टम प्रॉपर्टी के रूप में .name मान और यह जादुई रूप से mdb द्वारा उठाया जाएगा।

उम्मीद है कि मदद करता है।

+1

JBoss के लिए, आप भी 'सक्षम करने के लिए <कल्पना-वर्णनकर्ता-संपत्ति बदलने> जरूरत' – eis

+1

glassfish के लिए आप domain.xml फ़ाइल में इस जोड़ सकते हैं या का उपयोग बनाने-JVM-विकल्प asadmin में कमान उपकरण। –

+0

यह तंत्र जेईई मानक में नहीं है। – weberjn

2

कम से कम जेबॉस एएस 5.1 के रूप में, आप @ एक्टिवेशन कॉन्फिगप्रॉपर्टीज को कॉन्फ़िगर करने के लिए एओपी का उपयोग कर सकते हैं। मैंने उदाहरणों को देखकर यह खोज लिया कि jboss here प्रदान करता है। यह उपयोगी है यदि आप अपने उपयोगकर्ता नाम और पासवर्ड को सिस्टम कंटेनर में पूरे कंटेनर में उपलब्ध नहीं करना चाहते हैं, या यदि आप मेरे जैसे हैं और कभी नहीं, मैं कभी भी दोहराना नहीं चाहता हूं, इसमें उपयोगकर्ता नाम/पासवर्ड के साथ एक आर्टिफैक्ट को तैनात करना चाहते हैं। किसी भी कैसे, यहाँ jist है ...

इस तरह mdb पर टिप्पणी करें ...

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

फिर नीचे की तरह internals के साथ तैनाती निर्देशिका करने के लिए एक $ {जो} -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> 
+0

क्या आपने इसे संदेश लिस्टनर के बजाय जेबॉस मेल लिस्टनर के साथ करने की कोशिश की है? –

+0

हम वसंत में इसे कैसे कर सकते हैं? – Prateek

संबंधित मुद्दे

 संबंधित मुद्दे