Uploaded image for project: 'Red Hat Fuse'
  1. Red Hat Fuse
  2. ENTESB-9102

[cxf] JMS transport does not clean up resources properly in case of an JMSException

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Major
    • fuse-7.1
    • jboss-fuse-6.3
    • CXF
    • % %
    • Hide
      • Save attached test case into a CXF distribution under folder samples/
      • Extract attached test case and build it
      • Run ActiveMQ broker (non-Karaf) with activemq.xml contained in attached test case
        ./activemq console xbean:file:/path/to/activemq.xml
      • Use any tool to send at least 1MB of messages to a destination of your choice except test.queue, until you hit the error
        Persistent store is Full, 100% of 1048576.
        This ensures the brokers store is full and it won't accept any more messages.
      • Run the test case using mvn -Pclient
      Show
      Save attached test case into a CXF distribution under folder samples/ Extract attached test case and build it Run ActiveMQ broker (non-Karaf) with activemq.xml contained in attached test case ./activemq console xbean: file:/path/to/activemq.xml Use any tool to send at least 1MB of messages to a destination of your choice except test.queue , until you hit the error Persistent store is Full, 100% of 1048576. This ensures the brokers store is full and it won't accept any more messages. Run the test case using mvn -Pclient
    • Fuse 7.1 Sprint 31

    Description

      Consider a broker that is configured for

       <systemUsage>
        <systemUsage sendFailIfNoSpace="true">
        ...
      </systemUsage>
      

      and raises an exception in case the persistence store is full.

      Now, when using a CXF client with JMS transport and request/reply communication, the broker may raise an JMSException in case it cannot take any more message because the store is full.

      While the exception is caught and handled in org.apache.cxf.transport.jms.JMSConduit.sendExchange():

                  if (exchange.isOneWay()) {
                      sendMessage(request, outMessage, null, null, closer, session);
                  } else {
                      sendAndReceiveMessage(exchange, request, outMessage, closer, session);
                  }
              } catch (JMSException e) {
                  // Close connection so it will be refreshed on next try
      -->       ResourceCloser.close(connection);
                  this.connection = null;
                  this.staticReplyDestination = null;
      

      and CXF tries to close the JMS connection, this call will fail with this message

      INFO: failed to delete Temporary Queue "temp-queue://ID:Mac.fritz.box-58171-1529310181545-1:1:1" on closing pooled connection: A consumer is consuming from the temporary destination
      

      It fails because the call to ActiveMQConnection.close(), first tries to delete any temporary destinations. These however cannot be deleted because there is still a consumer registered on this temp destination. Hence above message.

      The ActiveMQConnection remains open, the temp destination is not cleared either but remains registered under the ActiveMQConnection.

      Attachments

        Issue Links

          Activity

            People

              yfang@redhat.com Freeman(Yue) Fang
              rhn-support-tmielke Torsten Mielke
              Viliam Kasala Viliam Kasala
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: