java annotations ejb-3.0 jboss-mdb
aquí

java - Valores configurables para anotaciones MDB



annotations ejb-3.0 (2)

Estoy tratando de usar este método para recibir correo en nuestra aplicación EJB3. En resumen, eso significa crear un MDB con las siguientes anotaciones:

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

Lo tengo funcionando, pero la situación es menos que ideal: el nombre de host, el nombre de usuario y la contraseña están codificados. A menos que use ant y build.properties para reemplazar esos valores antes de la compilación, no sé cómo externalizarlos.

Sería ideal usar un MBean, pero no tengo idea de cómo obtener los valores del MBean a la configuración de MDB.

¿Cómo debería hacer esto?


Puede externalizar las anotaciones en el ejb-jar.xml que despliegue en el META-INF de su archivo jar de la siguiente manera:

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

A continuación, puede establecer el valor de mdb.user.name como propiedad del sistema como parte de la línea de comandos para su servidor de aplicaciones utilizando -Dmdb.user.name = theUserName y mágicamente será recogido por el mdb.

Espero que ayude.


A partir de JBoss AS 5.1 como mínimo, puede usar AOP para configurar @ActivationConfigProperties. Descubrí esto mirando los ejemplos que proporciona jboss aquí . Esto es útil si no desea que su nombre de usuario y contraseñas estén disponibles para todo el contenedor en una propiedad del sistema, o si es como yo y nunca, repito NUNCA, quiero implementar un artefacto con un nombre de usuario / contraseña. De todos modos, aquí está el jist ...

Anota el mdb así ...

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

A continuación, agregue un $ {whatever} -aop.xml al directorio de implementación con elementos internos como a continuación. Dejé los comentarios originales allí en caso de que Jaikiran haga los cambios mencionados ...

Nota: la anotación debe estar en una sola línea.

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