2010-06-24 2 views
3

Я пытаюсь отправить сообщение JMS из одного экземпляра JBoss AS 5.1 в другое. Для моего теста у меня они оба работают на localhost, экземпляр JBoss AS клиента с обычными настройками порта и сервером JBoss AS с настройкой, где все порты смещены на 100.Отправка сообщения JMS в удаленную очередь в JBoss AS через пул соединений

В проекте EAR на клиенте I «ве определены загрузчик провайдера JMS в файле с именем jmstest-service.xml в корне моего EAR следующего содержания:

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> 

в файле с именем jmstest-ds.xml Я установил определение для фабрики соединений:

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> 

При запуске клиента JBoss AS, например, я вижу связь завода создается. Итак, я написал следующий код, чтобы послал сообщение 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(); 

С getRemoteContext() определяется как:

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); 
} 

До здесь в основном все работает. Я получаю ссылки обратно от JNDI для пула соединений и для удаленной очереди. Однако, когда я на самом деле пытаются отправившего сообщение он терпит неудачу с исключением:

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) 

На данный момент я больше, чем немного застрял :(

Я пытался отладить JMS немного и ., где он, кажется, не в состоянии в org.jboss.messaging.core.impl.postoffice.MessagingPostOffice#routeInternal Этот метод получает имя моей очереди (nsQueue), но некоторая внутренняя структура не содержит никаких ссылок на что:

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 

routeInternal метод, таким образом, возвращает ложь и выше исключается указанное исключение.

Если я запрашиваю фабрику соединений по умолчанию с удаленного сервера, то все работает. Сообщение JMS правильно отправлено и правильно получено сервером. Однако по соображениям производительности необходимо использовать локальный пул соединений.

Итак, кто-нибудь знает, что здесь не так, или знает альтернативный метод использования пула соединений для удаленной очереди JMS?

ответ

4

Проблема в том, что вы использовали java:/XAConnectionFactory в определении загрузчика поставщика. Несмотря на то, что это имя будет присвоено исходному контексту удаленного JNDI, он все равно пойдет на ваш LOCAL JNDI, а не на удаленный JNDI, поскольку вы думаете, что он будет разрешен. Это просто странность JNDI.

Вы получаете это исключение, так как ваше местное почтовое отделение пытается найти очередь («nsQueue») и, очевидно, об этом не знает. Ваше местное почтовое отделение спрашивают, так как код использует фабрику локальных подключений, даже если вы считаете, что используете удаленный.

Просто измените ссылки на/XAConnectionFactory и он должен работать.

 Смежные вопросы

  • Нет связанных вопросов^_^