Title: [845] trunk/components/base/src/main/java/org/servicemix/components/jms/JmsReceiverComponent.java: SM-176 : JmsReceiverComponent does not work for a JMS 1.02 provider
Revision
845
Author
gnt
Date
2005-11-15 12:22:45 -0500 (Tue, 15 Nov 2005)

Log Message

SM-176 : JmsReceiverComponent does not work for a JMS 1.02 provider
Patch provided by Peter Smith, thanks !

Modified Paths

Diff

Modified: trunk/components/base/src/main/java/org/servicemix/components/jms/JmsReceiverComponent.java (844 => 845)

--- trunk/components/base/src/main/java/org/servicemix/components/jms/JmsReceiverComponent.java	2005-11-15 17:21:47 UTC (rev 844)
+++ trunk/components/base/src/main/java/org/servicemix/components/jms/JmsReceiverComponent.java	2005-11-15 17:22:45 UTC (rev 845)
@@ -1,19 +1,19 @@
-/** 
- * 
+/**
+ *
  * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- * 
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License. 
- * 
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
  **/
 package org.servicemix.components.jms;
 
@@ -30,7 +30,7 @@
 /**
  * A component which uses a [EMAIL PROTECTED] JmsTemplate} to consume messages from a
  * destination.
- * 
+ *
  * @version $Revision$
  */
 public class JmsReceiverComponent extends JmsInBinding implements InitializingBean, DisposableBean {
@@ -46,21 +46,59 @@
             throw new IllegalArgumentException("Must have a template set");
         }
         connectionFactory = template.getConnectionFactory();
-        connection = connectionFactory.createConnection();
-        
-        session = connection.createSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+//PS Fix: START
+        /*
+         * Component code did not work for JMS 1.02 compliant provider because uses APIs
+         * that did not exist in JMS 1.02 : ConnectionFactory.createConnection,
+         * Connection.createSession
+         */
+        if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+            //Note1 - would've preferred to call JmsTemplate102 methods but they are protected.
+            if (template.isPubSubDomain()) {
+                javax.jms.TopicConnection tc;
+                connection = tc = ((javax.jms.TopicConnectionFactory)connectionFactory).createTopicConnection();
+                session = tc.createTopicSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+            }
+            else {
+                javax.jms.QueueConnection qc;
+                connection = qc = ((javax.jms.QueueConnectionFactory)connectionFactory).createQueueConnection();
+                session = qc.createQueueSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+            }
+        } else { // JMS 1.1 style
+            connection = connectionFactory.createConnection();
+            session = connection.createSession(template.isSessionTransacted(), template.getSessionAcknowledgeMode());
+        }
+//PS Fix: END
 
         Destination defaultDestination = template.getDefaultDestination();
         if (defaultDestination == null) {
             defaultDestination = template.getDestinationResolver().resolveDestinationName(session, template.getDefaultDestinationName(),
                     template.isPubSubDomain());
         }
-        consumer = session.createConsumer(defaultDestination, selector);
+//PS Fix: START
+        /*
+         * Component code did not work for JMS 1.02 compliant provider because uses APIs
+         * that did not exist in JMS 1.02: Session.createConsumer
+         */
+        if (template instanceof org.springframework.jms.core.JmsTemplate102) {
+            //Note1 - would've preferred to call JmsTemplate102.createConsumer but it is protected. Code below is same.
+            //Note2 - assert that defaultDestination is correct type according to isPubSubDomain()
+            if (template.isPubSubDomain()) {
+                consumer = ((javax.jms.TopicSession)session).createSubscriber((javax.jms.Topic)defaultDestination, selector, template.isPubSubNoLocal());
+            } else {
+                consumer = ((javax.jms.QueueSession)session).createReceiver((javax.jms.Queue)defaultDestination, selector);
+            }
+        } else { // JMS 1.1 style
+            consumer = session.createConsumer(defaultDestination, selector);
+        }
+//PS Fix: END
         consumer.setMessageListener(this);
         connection.start();
     }
 
     public void destroy() throws Exception {
+//PS Fix: START
+        /*
         if (consumer != null) {
             consumer.close();
             consumer = null;
@@ -73,6 +111,21 @@
             connection.close();
             connection = null;
         }
+        */
+        try {
+            if (connection != null) {
+                connection.close();
+            } else if (session != null) {
+                session.close();
+            } else if (consumer != null) {
+                consumer.close();
+            }
+        } finally {
+            connection = null;
+            session = null;
+            consumer = null;
+        }
+//PS Fix: END
     }
 
     public JmsTemplate getTemplate() {
@@ -90,4 +143,6 @@
     public void setSelector(String selector) {
         this.selector = selector;
     }
+
 }
+

Reply via email to