3.2.7.3. Criação de uma Ponte JMS
Uma ponte JMS consome mensagens a partir de um tópico ou fila JMS fonte e as envia a um tópico ou fila JMS destino, que está normalmente em um servidor diferente. Isto pode ser usado como ponte para as mensagens entre quaisquer servidores JMS, contando que elas sejam compatíveis com o JMS 1.1. Os recursos JMS de destino e fonte são pesquisados usando o JNDI e as classes de cliente para a pesquisa JNDI devem ser empacotadas em um módulo. O nome do módulo é, então, declarado na configuração da ponte JMS.
Procedimento 3.18. Criação de uma Ponte JMS
Configuração da Ponte no Servidor do JBoss EAP 5.x Fonte
Para evitar conflitos nas classes entre as versões, você deve seguir as seguintes etapas para configurar a ponte JMS no JBoss EAP 5.x. Os nomes da ponte e do diretório SAR são arbitrários e podem ser alterados, caso prefira.- Crie um subdiretório no diretório de implantação do JBoss EAP 5 para conter o SAR, por exemplo:
EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. - Crie um subdiretório nomeado
META-INF
noEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. - Crie um arquivo
jboss-service.xml
no diretórioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/
. Ele deve conter informações semelhantes ao exemplo a seguir.<server> <loader-repository> com.example:archive=unique-archive-name <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> <!-- JBoss EAP 6 JMS Provider --> <mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider"> <attribute name="ProviderName">EnterpriseApplicationPlatform6JMSProvider</attribute> <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute> <attribute name="FactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="QueueFactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="TopicFactoryRef">jms/RemoteConnectionFactory</attribute> <attribute name="Properties"> java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=remote://EnterpriseApplicationPlatform6host:4447 java.naming.security.principal=jbossuser java.naming.security.credentials=jbosspass </attribute> </mbean> <mbean code="org.jboss.jms.server.bridge.BridgeService" name="jboss.jms:service=Bridge,name=MyBridgeName" xmbean-dd="xmdesc/Bridge-xmbean.xml"> <depends optional-attribute-name="SourceProviderLoader">jboss.messaging:service=JMSProviderLoader,name=JMSProvider</depends> <depends optional-attribute-name="TargetProviderLoader">jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider</depends> <attribute name="SourceDestinationLookup">/queue/A</attribute> <attribute name="TargetDestinationLookup">jms/queue/test</attribute> <attribute name="QualityOfServiceMode">1</attribute> <attribute name="MaxBatchSize">1</attribute> <attribute name="MaxBatchTime">-1</attribute> <attribute name="FailureRetryInterval">60000</attribute> <attribute name="MaxRetries">-1</attribute> <attribute name="AddMessageIDInHeader">false</attribute> <attribute name="TargetUsername">jbossuser</attribute> <attribute name="TargetPassword">jbosspass</attribute> </mbean> </server>
Nota
O elementoload-repository
está presente para garantir que o SAR tenha um carregador de classe isolado. Além disso, observe que tanto a pesquisa JNDI e quanto a ponte "destino" incluem credenciais de segurança para o usuário "jbossuser" com a senha "jbosspass". Isto acontece pelo fato do JBoss EAP 6 ser protegido por padrão. O usuário nomeado "jbossuser" com a senha "jbosspass" foi criado emApplicationRealm
com a funçãoguest
usando o scriptEAP_HOME/bin/add_user.sh
. - Copie os seguintes JARs a partir do diretório
EAP_HOME/modules/system/layers/base/
no diretórioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/
. Substitua cada VERSION_NUMBER pelo número da versão vigente na sua distribuição do JBoss EAP 6.org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
org/jboss/netty/main/netty-VERSION_NUMBER.jar
org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar
Nota
Não copie simplesmenteEAP_HOME/bin/client/jboss-client.jar
, pois as classes API javax entrarão em conflito com aquelas no JBoss EAP 5.x.
Configuração da Ponte no Servidor JBoss EAP 6 de Destino
No JBoss EAP 6.1 e versões mais recentes, a ponte JMS pode ser usada para transferir as mensagens a partir de qualquer servidor compatível com o JMS 1.1. Uma vez que os recursos JMS fonte e destino são pesquisados usando JNDI, as classes de pesquisa JNDI do provedor do sistema de mensagem fonte, ou agente de mensagem, devem ser empacotadas em um módulo JBoss. As etapas a seguir usam o agente de mensagem fictício 'MyCustomMQ' como um exemplo.- Criação do módulo JBoss para o provedor do sistema de mensagem.
- Crie uma estrutura de diretório sob
EAP_HOME/modules/system/layers/base/
para o novo módulo. O subdiretóriomain/
conterá o cliente JARs e o arquivomodule.xml
. Segue abaixo um exemplo da estrutura do diretório criada para o provedor do sistema de mensagem MyCustomMQ:EAP_HOME/modules/system/layers/base/org/mycustommq/main/
- No subdiretório
main/
, crie um arquivomodule.xml
contendo a definição do módulo para o provedor do sistema de mensagem. Segue abaixo um exemplo domodule.xml
criado para o provedor do sistema de mensagem MyCustomMQ.<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="org.mycustommq"> <properties> <property name="jboss.api" value="private"/> </properties> <resources> <!-- Insert resources required to connect to the source or target --> <resource-root path="mycustommq-1.2.3.jar" /> <resource-root path="mylogapi-0.0.1.jar" /> </resources> <dependencies> <!-- Add the dependencies required by JMS Bridge code --> <module name="javax.api" /> <module name="javax.jms.api" /> <module name="javax.transaction.api"/> <!-- Add a dependency on the org.hornetq module since we send --> <!-- messages tothe HornetQ server embedded in the local EAP instance --> <module name="org.hornetq" /> </dependencies> </module>
- Copie os JARs do provedor do sistema de mensagem necessários para a pesquisa JNDI dos recursos fonte para o subdiretório
main/
do módulo. A estrutura do diretório para o módulo MyCustomMQ deve parecer-se com o seguinte.modules/ `-- system `-- layers `-- base `-- org `-- mycustommq `-- main |-- mycustommq-1.2.3.jar |-- mylogapi-0.0.1.jar |-- module.xml
- Configuração da ponte JMS no subsistema
messaging
do servidor JBoss EAP 6.- Antes de começar, interrompa o servidor e realize o backup dos arquivos de configuração do servidor atual. Caso você esteja executando um servidor autônomo, este é o arquivo
EAP_HOME/standalone/configuration/standalone-full-ha.xml
. Caso você esteja executando um domínio gerenciado, realize o backup de ambos os arquivosEAP_HOME/domain/configuration/domain.xml
eEAP_HOME/domain/configuration/host.xml
. - Adicione o elemento
jms-bridge
ao subsistemamessaging
no arquivo de configuração do servidor. Os elementossource
etarget
fornecem os nomes dos recursos JMS usados para as pesquisas JNDI. Se as credenciaisuser
epassword
estiverem especificadas, elas serão passadas como argumentos quando a conexão JMS for criada.Segue abaixo um exemplo do elementojms-bridge
configurado para o fornecedor do sistema de mensagem MyCustomMQ:<subsystem xmlns="urn:jboss:domain:messaging:1.3"> ... <jms-bridge name="myBridge" module="org.mycustommq"> <source> <connection-factory name="ConnectionFactory"/> <destination name="sourceQ"/> <user>user1</user> <password>pwd1</password> <context> <property key="java.naming.factory.initial" value="org.mycustommq.jndi.MyCustomMQInitialContextFactory"/> <property key="java.naming.provider.url" value="tcp://127.0.0.1:9292"/> </context> </source> <target> <connection-factory name="java:/ConnectionFactory"/> <destination name="/jms/targetQ"/> </target> <quality-of-service>DUPLICATES_OK</quality-of-service> <failure-retry-interval>500</failure-retry-interval> <max-retries>1</max-retries> <max-batch-size>500</max-batch-size> <max-batch-time>500</max-batch-time> <add-messageID-in-header>true</add-messageID-in-header> </jms-bridge> </subsystem>
No exemplo acima, as propriedades JNDI são definidas no elementocontext
parasource
. Caso o elementocontext
esteja omitido, como no exemplo acimatarget
, os recursos JMS serão pesquisados na instância local.