2010-06-24 5 views
3

J'essaie d'envoyer un message JMS d'une instance de JBoss AS 5.1 à l'autre. Pour mon test, j'ai les deux fonctionnant sur localhost, l'instance JBoss AS client avec les paramètres de port normal et le serveur JBoss AS avec le paramètre où tous les ports sont décalés de 100.Envoi d'un message JMS à la file d'attente distante dans JBoss AS via le pool de connexions

Dans un projet EAR sur le client, je « ai défini un chargeur de fournisseur JMS 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 connexion:

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 AS exemple, je vois l'usine de connexion en cours de création. Donc, j'ai écrit le code suivant pour envoyer le message 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, il fondamentalement tous les travaux. Je reçois des références de JNDI pour le pool de connexions et pour la file d'attente distante. Cependant, lorsque je tente réellement envoyé le message qu'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 stade, je suis plus un peu coincé :(

J'ai essayé de déboguer le JMS un peu et . où il semble à l'échec est 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 à ce:

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 méthode routeInternal retourne donc faux et ce qui précède l'exception mentionnée est levée

Si je demande la fabrique de connexions (par défaut) à partir du serveur distant, alors tout fonctionne. Le message JMS est correctement envoyé et correctement reçu par le serveur. Cependant, pour des raisons de performances, il est nécessaire d'utiliser un pool de connexions local. Donc, est-ce que quelqu'un sait ce qui ne va pas ici, ou connaît une autre méthode pour utiliser un pool de connexions pour une file d'attente JMS distante?

Répondre

4

Le problème est que vous avez utilisé java:/XAConnectionFactory dans la définition du chargeur du fournisseur. Même si ce nom sera donné au contexte initial JNDI distant, il ira toujours à votre JNDI LOCAL, pas au JNDI distant contre vous pensez qu'il sera résolu. C'est juste une bizarrerie de JNDI.

Vous obtenez cette exception car votre bureau de poste local essaie de trouver la file d'attente ("nsQueue") et il ne sait évidemment pas à ce sujet. Votre bureau de poste local est demandé, car le code utilise la fabrique de connexions locale, même lorsque vous pensez utiliser la connexion distante.

Modifiez simplement les références à/XAConnectionFactory et cela devrait fonctionner.

Questions connexes