[SWS-473] JmsSenderConnection does not commit transaction after send, leading to messages never being sent if sessionTransacted is true Created: 07/Jan/09  Updated: 04/May/12  Resolved: 12/Jan/09

Status: Closed
Project: Spring Web Services
Component/s: Core
Affects Version/s: 1.5.3, 1.5.4, 1.5.5
Fix Version/s: 1.5.6

Type: Bug Priority: Major
Reporter: Jon Denly Assignee: Arjen Poutsma
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


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



 Comments   
Comment by Arjen Poutsma [ 07/Jan/09 ]

Thanks for spotting this, it will be fixed in 1.5.6

Comment by Arjen Poutsma [ 12/Jan/09 ]

Fixed. Thanks for spotting this!

Comment by Arjen Poutsma [ 04/May/12 ]

Closing old issues

Generated at Sun Dec 17 00:25:36 UTC 2017 using JIRA 6.4.14#64029-sha1:ae256fe0fbb912241490ff1cecfb323ea0905ca5.