Uploaded image for project: 'Spring Web Services'
  1. Spring Web Services
  2. SWS-473

JmsSenderConnection does not commit transaction after send, leading to messages never being sent if sessionTransacted is true

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.5.3, 1.5.4, 1.5.5
    • Fix Version/s: 1.5.6
    • Component/s: Core
    • Labels:
      None

      Description

      When sending a JMS message using a org.springframework.ws.transport.jms.JmsMessageSender with sessionTransacted set to true, the org.springframework.ws.transport.jms.JmsSenderConnection.onSendAfterWrite method doesn't commit the transaction. This leads to the transaction being rolled back when the connection is closed so the message is never sent. JMSUtils.commitIfNecessary should be called before closing the message producer.

      An example of how this is done in JmsTemplate:

      JmsTemplate.java

      protected void doSend(Session session, Destination destination, MessageCreator messageCreator)
      			throws JMSException {
       
      		Assert.notNull(messageCreator, "MessageCreator must not be null");
      		MessageProducer producer = createProducer(session, destination);
      		try {
      			Message message = messageCreator.createMessage(session);
      			if (logger.isDebugEnabled()) {
      				logger.debug("Sending created message: " + message);
      			}
      			doSend(producer, message);
      			// Check commit - avoid commit call within a JTA transaction.
      			if (session.getTransacted() && isSessionLocallyTransacted(session)) {
      				// Transacted session created by this template -> commit.
      				JmsUtils.commitIfNecessary(session);
      			}
      		}
      		finally {
      			JmsUtils.closeMessageProducer(producer);
      		}
      	}

      Similarly, the following should be done in JmsSenderConnection:

      JmsSenderConnection.java

      protected void onSendAfterWrite(WebServiceMessage message) throws IOException {
              MessageProducer messageProducer = null;
              try {
                  messageProducer = session.createProducer(requestDestination);
                  messageProducer.setDeliveryMode(deliveryMode);
                  messageProducer.setTimeToLive(timeToLive);
                  messageProducer.setPriority(priority);
                  if (responseDestination == null) {
                      responseDestination = session.createTemporaryQueue();
                  }
                  requestMessage.setJMSReplyTo(responseDestination);
                  connection.start();
                  messageProducer.send(requestMessage);
                  if (session.getTransacted()) {
                     JmsUtils.commitIfNecessary(session);
                  }
              }
              catch (JMSException ex) {
                  throw new JmsTransportException(ex);
              }
              finally {
                  JmsUtils.closeMessageProducer(messageProducer);
              }
          }

        Activity

        No work has yet been logged on this issue.

          People

          • Assignee:
            arjen.poutsma Arjen Poutsma
            Reporter:
            jdenly Jon Denly
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: