[ 
https://issues.apache.org/jira/browse/QPID-8141?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Keith Wall updated QPID-8141:
-----------------------------
    Description: 
Address based destination resolution functionality 
{{AMQSession#resolveAddress}} sets a number of fields like {{routing key}}, 
{{exchange name}}, etc as part of invocation of 
{{AMQSession#setLegacyFieldsForQueueType}}. If destination object is identified 
as resolved {{AMQSession#isResolved}} the essential fields are not set on the 
destination object. As result, publishing attempts with such destination 
objects will fail due to routing issues like the one reported below:
{noformat}
Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
message with exchange 'null' and routing key 'null' [error code: 312(no route)]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at 
org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:81)
        at 
org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:24)
        at 
org.apache.qpid.client.AMQProtocolHandler.writeCommandFrameAndWaitForReply(AMQProtocolHandler.java:638)
        at 
org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:675)
        at 
org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:669)
        at 
org.apache.qpid.client.AMQSession_0_8.commitImpl(AMQSession_0_8.java:271)
        at org.apache.qpid.client.AMQSession.commit(AMQSession.java:913)
        ... 6 more
Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
message with exchange 'null' and routing key 'null' [error code: 312(no route)]
        at 
org.apache.qpid.client.handler.ConnectionCloseMethodHandler.methodReceived(ConnectionCloseMethodHandler.java:90)
        at 
org.apache.qpid.client.handler.ClientMethodDispatcherImpl.dispatchConnectionClose(ClientMethodDispatcherImpl.java:227)
        at 
org.apache.qpid.framing.ConnectionCloseBody.execute(ConnectionCloseBody.java:105)
        at 
org.apache.qpid.client.state.AMQStateManager.methodReceived(AMQStateManager.java:118)
        at 
org.apache.qpid.client.AMQProtocolHandler.methodBodyReceived(AMQProtocolHandler.java:531)
        at 
org.apache.qpid.client.protocol.AMQProtocolSession.methodFrameReceived(AMQProtocolSession.java:460)
        at 
org.apache.qpid.framing.AMQMethodBodyImpl.handle(AMQMethodBodyImpl.java:66)
        at 
org.apache.qpid.client.AMQProtocolHandler.received(AMQProtocolHandler.java:480)
        at 
org.apache.qpid.client.AMQConnectionDelegate_8_0$ReceiverClosedWaiter.received(AMQConnectionDelegate_8_0.java:549)
        at 
org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:164)
        at java.lang.Thread.run(Thread.java:748)
{noformat}
The clients applications creating new destination objects on every publishing 
attempt using the same session are impacted by the issue.  Problems occurs for 
both 0-10 and 0-8..0-91.
 The following code snippet demonstrate the problem:
{code:java}
MessageProducer messageProducer = session.createProducer(null);
for (int i=0;i<numberOfMessages;i++)
{
    Message message = session.createTextMessage("Test");
    messageProducer.send(session.createQueue(String.format(
            
"ADDR:test;{\"create\":\"always\",\"node\":{\"type\":\"queue\",\"durable\":true}}")),
 message);
}
session.commit();
{code}
The work around would be to avoid creation of destination objects every time. 
For example, Qpid JNDI properties can be used to declare and cache the 
destination objects.
{code:java}
destination.queue=ADDR:test;{"create":"always","node":"type":"queue","durable":true}}
{code}
{code:java}
Destination destination = (Destination)context.lookup("queue")
{code}

  was:
Address based destination resolution functionality 
{{AMQSession#resolveAddress}} sets a number of fields like {{routing key}}, 
{{exchange name}}, etc as part of invocation of 
{{AMQSession#setLegacyFieldsForQueueType}}. If destination object is identified 
as resolved {{AMQSession#isResolved}} the essential fields are not set on the 
destination object. As result, publishing attempts with such destination 
objects will fail due to routing issues like the one reported below:
{noformat}
Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
message with exchange 'null' and routing key 'null' [error code: 312(no route)]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at 
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at 
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at 
org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:81)
        at 
org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:24)
        at 
org.apache.qpid.client.AMQProtocolHandler.writeCommandFrameAndWaitForReply(AMQProtocolHandler.java:638)
        at 
org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:675)
        at 
org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:669)
        at 
org.apache.qpid.client.AMQSession_0_8.commitImpl(AMQSession_0_8.java:271)
        at org.apache.qpid.client.AMQSession.commit(AMQSession.java:913)
        ... 6 more
Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
message with exchange 'null' and routing key 'null' [error code: 312(no route)]
        at 
org.apache.qpid.client.handler.ConnectionCloseMethodHandler.methodReceived(ConnectionCloseMethodHandler.java:90)
        at 
org.apache.qpid.client.handler.ClientMethodDispatcherImpl.dispatchConnectionClose(ClientMethodDispatcherImpl.java:227)
        at 
org.apache.qpid.framing.ConnectionCloseBody.execute(ConnectionCloseBody.java:105)
        at 
org.apache.qpid.client.state.AMQStateManager.methodReceived(AMQStateManager.java:118)
        at 
org.apache.qpid.client.AMQProtocolHandler.methodBodyReceived(AMQProtocolHandler.java:531)
        at 
org.apache.qpid.client.protocol.AMQProtocolSession.methodFrameReceived(AMQProtocolSession.java:460)
        at 
org.apache.qpid.framing.AMQMethodBodyImpl.handle(AMQMethodBodyImpl.java:66)
        at 
org.apache.qpid.client.AMQProtocolHandler.received(AMQProtocolHandler.java:480)
        at 
org.apache.qpid.client.AMQConnectionDelegate_8_0$ReceiverClosedWaiter.received(AMQConnectionDelegate_8_0.java:549)
        at 
org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:164)
        at java.lang.Thread.run(Thread.java:748)
{noformat}

The clients applications creating new destination objects on every publishing 
attempt using the same session are impacted by the issue.
The following code snippet demonstrate the problem:
{code}
MessageProducer messageProducer = session.createProducer(null);
for (int i=0;i<numberOfMessages;i++)
{
    Message message = session.createTextMessage("Test");
    messageProducer.send(session.createQueue(String.format(
            
"ADDR:test;{\"create\":\"always\",\"node\":{\"type\":\"queue\",\"durable\":true}}")),
 message);
}
session.commit();
{code}

The work around would be to avoid creation of destination objects every time. 
For example, Qpid JNDI properties can be used to declare and cache the 
destination objects. 
{code}
destination.queue=ADDR:test;{"create":"always","node":"type":"queue","durable":true}}
{code}

{code}
Destination destination = (Destination)context.lookup("queue")
{code}
  




> [JMS AMQP 0-x] Sending message to address based destinations that matches the 
> address of a previously resolved address fails
> ----------------------------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-8141
>                 URL: https://issues.apache.org/jira/browse/QPID-8141
>             Project: Qpid
>          Issue Type: Bug
>          Components: JMS AMQP 0-x
>    Affects Versions: qpid-java-client-0-x-6.3.0
>            Reporter: Alex Rudyy
>            Priority: Major
>             Fix For: qpid-java-client-0-x-6.3.1
>
>
> Address based destination resolution functionality 
> {{AMQSession#resolveAddress}} sets a number of fields like {{routing key}}, 
> {{exchange name}}, etc as part of invocation of 
> {{AMQSession#setLegacyFieldsForQueueType}}. If destination object is 
> identified as resolved {{AMQSession#isResolved}} the essential fields are not 
> set on the destination object. As result, publishing attempts with such 
> destination objects will fail due to routing issues like the one reported 
> below:
> {noformat}
> Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
> message with exchange 'null' and routing key 'null' [error code: 312(no 
> route)]
>       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>       at 
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>       at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>       at 
> org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:81)
>       at 
> org.apache.qpid.AMQException.cloneForCurrentThread(AMQException.java:24)
>       at 
> org.apache.qpid.client.AMQProtocolHandler.writeCommandFrameAndWaitForReply(AMQProtocolHandler.java:638)
>       at 
> org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:675)
>       at 
> org.apache.qpid.client.AMQProtocolHandler.syncWrite(AMQProtocolHandler.java:669)
>       at 
> org.apache.qpid.client.AMQSession_0_8.commitImpl(AMQSession_0_8.java:271)
>       at org.apache.qpid.client.AMQSession.commit(AMQSession.java:913)
>       ... 6 more
> Caused by: org.apache.qpid.AMQConnectionClosedException: Error: No route for 
> message with exchange 'null' and routing key 'null' [error code: 312(no 
> route)]
>       at 
> org.apache.qpid.client.handler.ConnectionCloseMethodHandler.methodReceived(ConnectionCloseMethodHandler.java:90)
>       at 
> org.apache.qpid.client.handler.ClientMethodDispatcherImpl.dispatchConnectionClose(ClientMethodDispatcherImpl.java:227)
>       at 
> org.apache.qpid.framing.ConnectionCloseBody.execute(ConnectionCloseBody.java:105)
>       at 
> org.apache.qpid.client.state.AMQStateManager.methodReceived(AMQStateManager.java:118)
>       at 
> org.apache.qpid.client.AMQProtocolHandler.methodBodyReceived(AMQProtocolHandler.java:531)
>       at 
> org.apache.qpid.client.protocol.AMQProtocolSession.methodFrameReceived(AMQProtocolSession.java:460)
>       at 
> org.apache.qpid.framing.AMQMethodBodyImpl.handle(AMQMethodBodyImpl.java:66)
>       at 
> org.apache.qpid.client.AMQProtocolHandler.received(AMQProtocolHandler.java:480)
>       at 
> org.apache.qpid.client.AMQConnectionDelegate_8_0$ReceiverClosedWaiter.received(AMQConnectionDelegate_8_0.java:549)
>       at 
> org.apache.qpid.transport.network.io.IoReceiver.run(IoReceiver.java:164)
>       at java.lang.Thread.run(Thread.java:748)
> {noformat}
> The clients applications creating new destination objects on every publishing 
> attempt using the same session are impacted by the issue.  Problems occurs 
> for both 0-10 and 0-8..0-91.
>  The following code snippet demonstrate the problem:
> {code:java}
> MessageProducer messageProducer = session.createProducer(null);
> for (int i=0;i<numberOfMessages;i++)
> {
>     Message message = session.createTextMessage("Test");
>     messageProducer.send(session.createQueue(String.format(
>             
> "ADDR:test;{\"create\":\"always\",\"node\":{\"type\":\"queue\",\"durable\":true}}")),
>  message);
> }
> session.commit();
> {code}
> The work around would be to avoid creation of destination objects every time. 
> For example, Qpid JNDI properties can be used to declare and cache the 
> destination objects.
> {code:java}
> destination.queue=ADDR:test;{"create":"always","node":"type":"queue","durable":true}}
> {code}
> {code:java}
> Destination destination = (Destination)context.lookup("queue")
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to