L'envoi de JMS message à la file d'attente distante dans JBoss as via le pool de connexion
Je suis en train d'envoyer un message de JMS de JBoss 5.1 instance à l'autre. Pour mon test j'ai tous les deux en cours d'exécution sur localhost, le client JBoss COMME exemple avec la normale de paramètres de port et le serveur JBoss as avec le milieu où tous les ports sont compensés par 100.
Dans une OREILLE projet sur le client, j'ai défini un fournisseur JMS chargeur dans un fichier appelé jmstest-service.xml dans la racine de mon OREILLE, avec le contenu suivant:
jmstest-service.xml:
<mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=MyJMSProvider">
<attribute name="ProviderName">MyJMSProvider</attribute>
<attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
<attribute name="FactoryRef">java:/XAConnectionFactory</attribute>
<attribute name="QueueFactoryRef">java:/XAConnectionFactory</attribute>
<attribute name="TopicFactoryRef">java:/XAConnectionFactory</attribute>
<attribute name="Properties">
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1199
</attribute>
</mbean>
Dans un fichier appelé jmstest-ds.xml j'ai mis une définition pour l'usine de raccordement:
jmstest-ds.xml:
<tx-connection-factory>
<jndi-name>MyJmsXA</jndi-name>
<xa-transaction/>
<rar-name>jms-ra.rar</rar-name>
<connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition>
<config-property name="SessionDefaultType" type="java.lang.String">javax.jms.Topic</config-property>
<config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/MyJMSProvider</config-property>
<max-pool-size>20</max-pool-size>
<depends>jboss.messaging:service=ServerPeer</depends>
</tx-connection-factory>
Lors du démarrage du client JBoss COMME exemple je vois l'usine de raccordement en cours de création. Donc, j'ai écrit le code suivant pour envoyer le message de JMS:
InitialContext context = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory)context.lookup("java:/MyJmsXA");
QueueConnection connect = factory.createQueueConnection();
QueueSession session = connect.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination)getRemoteContext().lookup("/queue/nsQueue");
MessageProducer sender = session.createProducer(destination);
ObjectMessage message = session.createObjectMessage("bla");
sender.send(message);
connect.close();
Avec le getRemoteContext() définie comme:
InitialContext getRemoteContext() {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory" );
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, "jnp://localhost:1199");
return new InitialContext(env);
}
Jusqu'ici essentiellement de toutes les œuvres. Je reçois des références de JNDI pour la connexion de la piscine et de la file d'attente à distance. Cependant lorsque je l'ai effectivement essayer d'envoyer le message, il échoue avec une exception:
ERROR [ExceptionUtil] SessionEndpoint[pa-96fhptag-1-8wtzotag-7jdzy7-110j3] send [sa-mdkvptag-1-8wtzotag-7jdzy7-110j3]
javax.jms.JMSException: Failed to route Reference[20928781172555777]:RELIABLE to nsQueue
at org.jboss.jms.server.endpoint.ServerConnectionEndpoint.sendMessage(ServerConnectionEndpoint.java:757)
at org.jboss.jms.server.endpoint.ServerSessionEndpoint.send(ServerSessionEndpoint.java:399)
at org.jboss.jms.server.endpoint.advised.SessionAdvised.org$jboss$jms$server$endpoint$advised$SessionAdvised$send$aop(SessionAdvised.java:87)
at org.jboss.jms.server.endpoint.advised.SessionAdvised$send_7280680627620114891.invokeTarget(SessionAdvised$send_7280680627620114891.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
at org.jboss.jms.server.container.SecurityAspect.handleSend(SecurityAspect.java:157)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.aop.advice.PerInstanceAdvice.invoke(PerInstanceAdvice.java:122)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.server.endpoint.advised.SessionAdvised.send(SessionAdvised.java)
at org.jboss.jms.wireformat.SessionSendRequest.serverInvoke(SessionSendRequest.java:95)
at org.jboss.jms.server.remoting.JMSServerInvocationHandler.invoke(JMSServerInvocationHandler.java:143)
at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:891)
at org.jboss.remoting.transport.local.LocalClientInvoker.invoke(LocalClientInvoker.java:106)
at org.jboss.remoting.Client.invoke(Client.java:1724)
at org.jboss.remoting.Client.invoke(Client.java:629)
at org.jboss.remoting.Client.invoke(Client.java:617)
at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:189)
at org.jboss.jms.client.delegate.DelegateSupport.doInvoke(DelegateSupport.java:160)
at org.jboss.jms.client.delegate.ClientSessionDelegate.org$jboss$jms$client$delegate$ClientSessionDelegate$send$aop(ClientSessionDelegate.java:499)
at org.jboss.jms.client.delegate.ClientSessionDelegate$send_6145266547759487588.invokeTarget(ClientSessionDelegate$send_6145266547759487588.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
at org.jboss.jms.client.container.SessionAspect.handleSend(SessionAspect.java:661)
at org.jboss.aop.advice.org.jboss.jms.client.container.SessionAspect_z_handleSend_1677669648.invoke(SessionAspect_z_handleSend_1677669648.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.client.container.FailoverValveInterceptor.invoke(FailoverValveInterceptor.java:92)
at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.client.delegate.ClientSessionDelegate.send(ClientSessionDelegate.java)
at org.jboss.jms.client.container.ProducerAspect.handleSend(ProducerAspect.java:269)
at org.jboss.aop.advice.org.jboss.jms.client.container.ProducerAspect_z_handleSend_1677669648.invoke(ProducerAspect_z_handleSend_1677669648.java)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
at org.jboss.jms.client.delegate.ClientProducerDelegate.send(ClientProducerDelegate.java)
at org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:164)
at org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:207)
at org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:145)
at org.jboss.jms.client.JBossMessageProducer.send(JBossMessageProducer.java:136)
at org.jboss.resource.adapter.jms.JmsMessageProducer.send(JmsMessageProducer.java:142)
À ce point, je suis plus que un peu coincé 🙁
J'ai essayé de déboguer l'JMS un peu et où il semble que l'échec est dans org.jboss.messaging.core.impl.postoffice.MessagingPostOffice#routeInternal
. Cette méthode reçoit le nom de ma file d'attente (nsQueue), mais une structure interne ne contient aucune référence à:
private boolean routeInternal(MessageReference ref, Condition condition, Transaction tx, boolean fromCluster, Set names) throws Exception {
if (trace) { log.trace(this + " routing " + ref + " with condition '" +
condition + "'" + (tx == null ? "" : " transactionally in " + tx) +
" from cluster " + fromCluster); }
boolean routed = false;
lock.readLock().acquire();
try
{
List queues = (List)mappings.get(condition);
if (queues != null) //THIS IS INDEED NULL
La routeInternal méthode revient donc faux et le mentionnés ci-dessus exception est levée.
Si je demande de l' (par défaut) fabrique de connexion à partir du serveur distant, puis tout fonctionne. Le JMS message est bien envoyé et bien reçu par le serveur. Cependant, pour des raisons de performances, il est nécessaire d'utiliser une connexion locale de la piscine.
Donc, personne ne sait ce qui ne va pas ici, ou connaît une méthode alternative à l'utilisation d'un pool de connexion pour une distance de file d'attente JMS?
OriginalL'auteur akira | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous avez utilisé java:/XAConnectionFactory dans la définition du fournisseur de chargeur. Même si ce nom sera donné à la distance JNDI contexte initial, il sera toujours aller à votre bureau LOCAL de JNDI, pas la télécommande JNDI contre vous pensez qu'il va être résolu. C'est juste une curiosité de JNDI.
Vous obtenez cette exception depuis votre bureau de poste local est d'essayer de trouver de la file d'attente ("nsQueue") et il n'est évidemment pas le savoir. Votre bureau de poste local est demandé, étant donné que le code est à l'aide de la connexion locale usine, même si vous pensez que c'est à l'aide de la télécommande.
Il suffit de changer les références à /XAConnectionFactory et cela devrait fonctionner.
OriginalL'auteur Arjan Tijms