Hi
The broker and client behaviours are fully compliant with "Using the
Anonymous Terminus for Message Routing" [1].
It conforms the requirements of section "2.2.2 Routing Errors". For
the cases, when destination cannot be resolved
{quote}
If the source of the link supports the rejected outcome, and the
message has not already been settled by the sender, then the routing
node
MUST reject the message.
{quote}

However, from JMS transaction point of view, I would expect to be able
to commit the transaction only when all messages in transaction are
successfully delivered.
If one or more messages cannot be delivered, the JMS transaction
commit should fail.

It seems we are failing to deliver the JMS transaction contract.

I though that work around for the issue could be to always use
synchronous publishing (as exception is reported on send in this
case), however, it is still possible to commit transaction
successfully after failed send.
As result, part of messages sent within the transaction will be
successfully delivered on commit. It seems we are failing to guaranty
the Atomicity of JMS transactions.

The better approach could be to stop supporting "rejected" outcome for
anonymous producer. That should cause the broker to detach the link
with an error and mark the transaction as rollback only.
Any thoughts?

Kind Regards,
Alex


[1] 
https://www.oasis-open.org/apps/org/workgroup/amqp/download.php/61723/amqp-anonterm-v1.0-wd03.pdf

On 27 November 2017 at 22:32, Oleksandr Rudyy <oru...@gmail.com> wrote:
> Hi folks,
>
> I recently realised that when JMS 0.24.0 publishes a message
> asynchronously into non-existing destination over anonymous relay on
> Qpid Broker-J v7.0 and transaction is committed, no exception is
> reported to the caller of commit. I expected a JMSException to be
> thrown on session.commit(), but commit was performed successfully.
> This situation can potentially result in message loss, as client
> application can consider such transaction successful.
>
> The following code snippet demonstrate the problem:
>
> try( Connection connection =
> connectionFactory.createConnection(username, password))
> {
>     Session session = connection.createSession(true,
> Session.SESSION_TRANSACTED);
>     MessageProducer messageProducer = session.createProducer(null);
>     Queue nonExistingQueue = session.createQueue("nonExistingQueue");
>     messageProducer.send(nonExistingQueue,
> session.createTextMessage("testMessage"));
>     session.commit();
> }
>
> I originally thought that it is a fault of Broker-J but after looking
> into Broker code I came to a conclusion that Broker behaviour could be
> spec compliant.
>
> On attach, the client specifies the following outcomes on the source:
> outcomes=[amqp:accepted:list, amqp:rejected:list, amqp:released:list,
> amqp:modified:list]}
>
> On receiving a message for non-existing destination, the anonymous
> relay generates rejected outcome as 'rejected' outcome is in the list
> of source supported outcomes. The Broker replies with settled
> disposition having rejected outcome with error 'not-found'. Here is an
> example of disposition
>
> Disposition{role=receiver,first=1,last=1,settled=true,state=TransactionalState{txnId=\x00\x00\x00\x00,outcome=Rejected{error=Error{condition=not-found,description=Unknown
> destination 'nonExistingQueue'}}}}
>
> The JMS client receives the disposition and reports an exception
> "javax.jms.InvalidDestinationException: Unknown destination
> 'nonExistingQueue' [condition = amqp:not-found]" into
> ExceptionListener if one is set.
> If no ExceptionListener is set, the exception is logged. Thus, if
> ExceptionListener is not set, a message loss can occur.
>
> The previous 6.x versions of Broker-J detach the link with error
> 'not-found' but v7.0 simply settles with the rejected outcome.
>
> It seems both parties adhere to the AMQP spec requirements but the
> result is surprising. I am not sure how to resolve this problem. Part
> of me thinks that detaching of the link on broker side could be the
> best solution of the problem, but, that would make broker behaviour
> JMS specific rather than AMQP specific. Any thoughts about how to
> solve this problem are highly appreciated.
>
> Kind Regards,
> Alex

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

Reply via email to