Repository: cxf Updated Branches: refs/heads/master e66950983 -> 0d797ec55
[CXF-7205]In JmsPullPoint create session for producer and consumer separately and synchronized the session but not the whole method to avoid deadlock Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/0d797ec5 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/0d797ec5 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/0d797ec5 Branch: refs/heads/master Commit: 0d797ec552bb39210f9d21fdec09b8267d9a348c Parents: e669509 Author: Freeman Fang <[email protected]> Authored: Wed Jan 4 10:57:43 2017 +0800 Committer: Freeman Fang <[email protected]> Committed: Wed Jan 4 10:57:43 2017 +0800 ---------------------------------------------------------------------- .../org/apache/cxf/wsn/jms/JmsPullPoint.java | 44 ++++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/0d797ec5/services/wsn/wsn-core/src/main/java/org/apache/cxf/wsn/jms/JmsPullPoint.java ---------------------------------------------------------------------- diff --git a/services/wsn/wsn-core/src/main/java/org/apache/cxf/wsn/jms/JmsPullPoint.java b/services/wsn/wsn-core/src/main/java/org/apache/cxf/wsn/jms/JmsPullPoint.java index b56fe92..5dcffbe 100644 --- a/services/wsn/wsn-core/src/main/java/org/apache/cxf/wsn/jms/JmsPullPoint.java +++ b/services/wsn/wsn-core/src/main/java/org/apache/cxf/wsn/jms/JmsPullPoint.java @@ -55,7 +55,9 @@ public class JmsPullPoint extends AbstractPullPoint { private Connection connection; - private Session session; + private Session producerSession; + + private Session consumerSession; private Queue queue; @@ -73,22 +75,33 @@ public class JmsPullPoint extends AbstractPullPoint { } protected synchronized void initSession() throws JMSException { - if (session == null) { - session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - queue = session.createQueue(getName()); - producer = session.createProducer(queue); - consumer = session.createConsumer(queue); + if (producerSession == null || consumerSession == null) { + producerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + consumerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + queue = producerSession.createQueue(getName()); + producer = producerSession.createProducer(queue); + consumer = consumerSession.createConsumer(queue); } } protected synchronized void closeSession() { - if (session != null) { + if (producerSession != null) { + try { + producerSession.close(); + } catch (JMSException inner) { + LOGGER.log(Level.FINE, "Error closing ProducerSession", inner); + } finally { + producerSession = null; + } + } + + if (consumerSession != null) { try { - session.close(); + consumerSession.close(); } catch (JMSException inner) { - LOGGER.log(Level.FINE, "Error closing session", inner); + LOGGER.log(Level.FINE, "Error closing ConsumerSession", inner); } finally { - session = null; + consumerSession = null; } } } @@ -101,8 +114,10 @@ public class JmsPullPoint extends AbstractPullPoint { notify.getNotificationMessage().add(messageHolder); StringWriter writer = new StringWriter(); jaxbContext.createMarshaller().marshal(notify, writer); - Message message = session.createTextMessage(writer.toString()); - producer.send(message); + synchronized (producerSession) { + Message message = producerSession.createTextMessage(writer.toString()); + producer.send(message); + } } catch (JMSException e) { LOGGER.log(Level.WARNING, "Error storing message", e); closeSession(); @@ -122,7 +137,10 @@ public class JmsPullPoint extends AbstractPullPoint { initSession(); List<NotificationMessageHolderType> messages = new ArrayList<NotificationMessageHolderType>(); for (int i = 0; i < max; i++) { - Message msg = consumer.receiveNoWait(); + Message msg = null; + synchronized (consumerSession) { + msg = consumer.receiveNoWait(); + } if (msg == null) { break; }
