@@ -55,25 +55,21 @@ public class PooledSession implements Session, TopicSession, QueueSession, XASes
5555 private static final transient Logger LOG = LoggerFactory .getLogger (PooledSession .class );
5656
5757 private final SessionKey key ;
58- private final KeyedObjectPool <SessionKey , Session > sessionPool ;
58+ private final KeyedObjectPool <SessionKey , SessionHolder > sessionPool ;
5959 private final CopyOnWriteArrayList <MessageConsumer > consumers = new CopyOnWriteArrayList <MessageConsumer >();
6060 private final CopyOnWriteArrayList <QueueBrowser > browsers = new CopyOnWriteArrayList <QueueBrowser >();
6161 private final CopyOnWriteArrayList <PooledSessionEventListener > sessionEventListeners = new CopyOnWriteArrayList <PooledSessionEventListener >();
6262 private final AtomicBoolean closed = new AtomicBoolean ();
6363
64- private MessageProducer producer ;
65- private TopicPublisher publisher ;
66- private QueueSender sender ;
67-
68- private Session session ;
64+ private SessionHolder sessionHolder ;
6965 private boolean transactional = true ;
7066 private boolean ignoreClose ;
7167 private boolean isXa ;
7268 private boolean useAnonymousProducers = true ;
7369
74- public PooledSession (SessionKey key , Session session , KeyedObjectPool <SessionKey , Session > sessionPool , boolean transactional , boolean anonymous ) {
70+ public PooledSession (SessionKey key , SessionHolder sessionHolder , KeyedObjectPool <SessionKey , SessionHolder > sessionPool , boolean transactional , boolean anonymous ) {
7571 this .key = key ;
76- this .session = session ;
72+ this .sessionHolder = sessionHolder ;
7773 this .sessionPool = sessionPool ;
7874 this .transactional = transactional ;
7975 this .useAnonymousProducers = anonymous ;
@@ -140,29 +136,29 @@ public void close() throws JMSException {
140136 if (invalidate ) {
141137 // lets close the session and not put the session back into the pool
142138 // instead invalidate it so the pool can create a new one on demand.
143- if (session != null ) {
139+ if (sessionHolder != null ) {
144140 try {
145- session .close ();
141+ sessionHolder .close ();
146142 } catch (JMSException e1 ) {
147143 LOG .trace ("Ignoring exception on close as discarding session: " + e1 , e1 );
148144 }
149145 }
150146 try {
151- sessionPool .invalidateObject (key , session );
147+ sessionPool .invalidateObject (key , sessionHolder );
152148 } catch (Exception e ) {
153149 LOG .trace ("Ignoring exception on invalidateObject as discarding session: " + e , e );
154150 }
155151 } else {
156152 try {
157- sessionPool .returnObject (key , session );
153+ sessionPool .returnObject (key , sessionHolder );
158154 } catch (Exception e ) {
159155 javax .jms .IllegalStateException illegalStateException = new javax .jms .IllegalStateException (e .toString ());
160156 illegalStateException .initCause (e );
161157 throw illegalStateException ;
162158 }
163159 }
164160
165- session = null ;
161+ sessionHolder = null ;
166162 }
167163 }
168164
@@ -276,9 +272,12 @@ public void rollback() throws JMSException {
276272
277273 @ Override
278274 public XAResource getXAResource () {
279- if (session instanceof XASession ) {
280- return ((XASession ) session ).getXAResource ();
275+ SessionHolder session = safeGetSessionHolder ();
276+
277+ if (session .getSession () instanceof XASession ) {
278+ return ((XASession ) session .getSession ()).getXAResource ();
281279 }
280+
282281 return null ;
283282 }
284283
@@ -289,8 +288,9 @@ public Session getSession() {
289288
290289 @ Override
291290 public void run () {
291+ SessionHolder session = safeGetSessionHolder ();
292292 if (session != null ) {
293- session .run ();
293+ session .getSession (). run ();
294294 }
295295 }
296296
@@ -379,10 +379,7 @@ public TopicPublisher createPublisher(Topic topic) throws JMSException {
379379 }
380380
381381 public Session getInternalSession () throws IllegalStateException {
382- if (session == null ) {
383- throw new IllegalStateException ("The session has already been closed" );
384- }
385- return session ;
382+ return safeGetSessionHolder ().getSession ();
386383 }
387384
388385 public MessageProducer getMessageProducer () throws JMSException {
@@ -393,16 +390,7 @@ public MessageProducer getMessageProducer(Destination destination) throws JMSExc
393390 MessageProducer result = null ;
394391
395392 if (useAnonymousProducers ) {
396- if (producer == null ) {
397- // Don't allow for duplicate anonymous producers.
398- synchronized (this ) {
399- if (producer == null ) {
400- producer = getInternalSession ().createProducer (null );
401- }
402- }
403- }
404-
405- result = producer ;
393+ result = safeGetSessionHolder ().getOrCreateProducer ();
406394 } else {
407395 result = getInternalSession ().createProducer (destination );
408396 }
@@ -418,16 +406,7 @@ public QueueSender getQueueSender(Queue destination) throws JMSException {
418406 QueueSender result = null ;
419407
420408 if (useAnonymousProducers ) {
421- if (sender == null ) {
422- // Don't allow for duplicate anonymous producers.
423- synchronized (this ) {
424- if (sender == null ) {
425- sender = ((QueueSession ) getInternalSession ()).createSender (null );
426- }
427- }
428- }
429-
430- result = sender ;
409+ result = safeGetSessionHolder ().getOrCreateSender ();
431410 } else {
432411 result = ((QueueSession ) getInternalSession ()).createSender (destination );
433412 }
@@ -443,16 +422,7 @@ public TopicPublisher getTopicPublisher(Topic destination) throws JMSException {
443422 TopicPublisher result = null ;
444423
445424 if (useAnonymousProducers ) {
446- if (publisher == null ) {
447- // Don't allow for duplicate anonymous producers.
448- synchronized (this ) {
449- if (publisher == null ) {
450- publisher = ((TopicSession ) getInternalSession ()).createPublisher (null );
451- }
452- }
453- }
454-
455- result = publisher ;
425+ result = safeGetSessionHolder ().getOrCreatePublisher ();
456426 } else {
457427 result = ((TopicSession ) getInternalSession ()).createPublisher (destination );
458428 }
@@ -489,7 +459,7 @@ public void setIsXa(boolean isXa) {
489459
490460 @ Override
491461 public String toString () {
492- return "PooledSession { " + session + " }" ;
462+ return "PooledSession { " + safeGetSessionHolder () + " }" ;
493463 }
494464
495465 /**
@@ -505,4 +475,13 @@ public String toString() {
505475 protected void onConsumerClose (MessageConsumer consumer ) {
506476 consumers .remove (consumer );
507477 }
478+
479+ private SessionHolder safeGetSessionHolder () {
480+ SessionHolder sessionHolder = this .sessionHolder ;
481+ if (sessionHolder == null ) {
482+ throw new IllegalStateException ("The session has already been closed" );
483+ }
484+
485+ return sessionHolder ;
486+ }
508487}
0 commit comments