Respecto al rar, lo único que he hecho es pegarlo en $JBOSS_7/standalone/deployments y poner un archivo vacío .do.deploy para el despliegue, ya veremos cómo lo empaquetamos con el resto de la app (¿en el EAR?)
No obstante lo importante es poderlo referenciar desde JNDI. Para ésto en JBoss 6 se ponía un -ds.xml en la carpeta deploy/. Como JBoss 7 unificó todas las configuraciones en el archivo standalone-full.xml (o domain.xml), es aquí donde definimos los resource adapters >>
(!) Nótese que la siguiente configuración sólo se encuentra en la configuración standalone-full.xml, y no en el standalone.xmla secas, con el cual obtenemos el siguiente error
jboss.ejb.default-resource-adapter-name-service not found
Entonces veamos los subsystem para EJBs urn:jboss:domain:ejb3:1.2 y para RAs urn:jboss:domain:resource-adapters:1.0 >>
<subsystem xmlns="urn:jboss:domain:ejb3:1.2"> <!-- ... --> <mdb> <resource-adapter-ref resource-adapter-name="activemq-rar-5.6.0"/> <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/> </mdb>
¿ésto en teoría es para que use activemq en vez de hornetq?
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"> <resource-adapters> <resource-adapter> <archive> activemq-rar-5.6.0.rar </archive> <transaction-support>XATransaction</transaction-support> <config-property name="ServerUrl"> tcp://localhost:61616/ </config-property> <connection-definitions> <!--ojo--> <connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:jboss/activemq/QueueConnectionFactory" enabled="true" use-java-context="true" pool-name="ActiveMQQueueConnectionPool" use-ccm="true"> <config-property name="ServerUrl"> tcp://localhost:61616/ </config-property> <security> <application/> </security> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters> </subsystem>
Ésto define el binding al RAR que pegamos antes en deployers.
Ojo que en la propiedad class-name del tag connection-definition la clase es
org.apache.activemq.ra.ActiveMQManagedConnectionFactory y no javax.jms.QueueConnectionFactory ya que con este último, si bien parece que deployara bien, e incluso parece tener un nombre JNDI en la consola – Profile > Connector > Resource Adapters > View
al momento de deplegar la app que lo usa – en este caso vía Seam JMS – ésta no puede econtrar el recurso vía lookup >>
Unable to look up java:jboss/activemq/QueueConnectionFactory in JNDI: javax.naming.NameNotFoundException: activemq/QueueConnectionFactory
Sin embargo, usar ActiveMQManagedConnectionFactory nos lleva a otro error conocido y es que JBoss falla porque piensa ya haber ocupado el nombre JNDI >>
Caused by: org.jboss.msc.service.DuplicateServiceException: Service jboss.connector.connection-factory.java:jboss/activemq/QueueConnectionFactory is already registered
Entiendo que ésto sólo está resuelto en los nightly builds de JBoss 7 >>
De hecho es lo que dice este tutorial, que podría haber pillado antes >>
De interés, cómo generar el archivo de configuración del RAR automágicamente >>
No sé exactamente cómo lo caché (>>) pero otra estrategia es descomprimir el rar y, en su carpeta META-INF, meterle un ra.xml y un iron-jacamar.xml ad-hoc. Creo que en la documentación se refieren a esta ‘técnica’ como activación automática de RARs…
Veamos qué contienen estos archivos.
El ra.xml sobrescribe aquel que viene por defecto en el RAR.
El ironjacamar.xml configura el nombre JNDI del broker así como de las colas que definamos.
Es decir que toda la info va dentro del RAR, mientras que en esta configuración el archivo standalone.xml queda con lo mínimo
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"> <resource-adapters> <resource-adapter> <archive>activemq-rar-5.6-SNAPSHOT.rar</archive> <transaction-support>LocalTransaction</transaction-support> <config-property name="userName">system </config-property> <config-property name="password">manager</config-property> <config-property name="serverUrl">tcp://localhost:61616</config-property> </resource-adapter> </resource-adapters> </subsystem>
de hecho, la parte EJB queda como viene por default
<mdb> <resource-adapter-ref resource-adapter-name="hornetq-ra"/> <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/> </mdb>
y ésto funciona inmediatamente… pero ¿es lo óptimo?
Recordemos que la migración de JBoss 6 a 7 la estamos considerando porque Seam 3 no puede ser empaquetado como EAR en JBoss 6 >> y, aunque no sirve hacerlo en JBoss 7 porque ya no soporta deployar data-sources o definiciones de colas dentro de un EAR >>, podría ser buena idea probar el nuevo formato de despliegue CLI >> para unificar la app.
En ese sentido, nos enfrentamos a dos escenarios aquí.
- Uno que permite definir y configurar el RAR dentro de la configuración de JBoss, lo que seguramente puede hacerse en el formato CLI, pero que requiere que se use la versión nightly del AS.
- Otro en que las definiciones van dentro del RAR, lo cual podría ser útil si es que hay manera de configurar ésto desde el CLI – o desde Maven, pues lo más probable es que el RAR se empaquete en un EAR con el WAR principal – a menos que este famoso CLI ofrezca una mejor alternativa…
Esto quedará para el próximo post…