You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by nm...@apache.org on 2008/02/09 20:23:23 UTC

svn commit: r620176 - in /activemq/activemq-cpp/trunk/src/main/activemq/cmsutil: CmsTemplate.cpp CmsTemplate.h

Author: nmittler
Date: Sat Feb  9 11:23:23 2008
New Revision: 620176

URL: http://svn.apache.org/viewvc?rev=620176&view=rev
Log:
AMQCPP-152 - Adding addition execute methods for ProducerCallback

Modified:
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp
    activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h

Modified: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp?rev=620176&r1=620175&r2=620176&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp Sat Feb  9 11:23:23 2008
@@ -347,8 +347,39 @@
     
     try {
         
+        // Create the callback with using default destination.
+        ProducerExecutor cb(action, this, NULL);
+        
+        // Execute the action in a session.
+        execute(&cb);
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void CmsTemplate::execute(cms::Destination* dest,
+        ProducerCallback* action) throw (cms::CMSException) {
+    
+    try {
+        
+        // Create the callback.
+        ProducerExecutor cb(action, this, dest);
+        
+        // Execute the action in a session.
+        execute(&cb);
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void CmsTemplate::execute(const std::string& destinationName,
+        ProducerCallback* action) throw (cms::CMSException) {
+    
+    try {
         // Create the callback.
-        ProducerSessionCallback cb(action, this);
+        ResolveProducerExecutor cb(action, this, destinationName);
         
         // Execute the action in a session.
         execute(&cb);
@@ -358,7 +389,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void CmsTemplate::ProducerSessionCallback::doInCms( cms::Session* session ) 
+void CmsTemplate::ProducerExecutor::doInCms( cms::Session* session ) 
 throw (cms::CMSException) {
         
     cms::MessageProducer* producer = NULL;
@@ -370,7 +401,7 @@
         }
         
         // Create the producer.
-        producer = parent->createProducer(session, NULL);
+        producer = parent->createProducer(session, getDestination(session));
         
         // Execute the action.
         action->doInCms(session, producer);
@@ -390,6 +421,18 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
+cms::Destination* CmsTemplate::ResolveProducerExecutor::getDestination(
+        cms::Session* session ) 
+    throw (cms::CMSException) {
+    
+    try {    
+        return parent->resolveDestinationName(session, destinationName);        
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
 void CmsTemplate::send(MessageCreator* messageCreator) 
 throw (cms::CMSException, IllegalStateException)  {
     
@@ -483,7 +526,7 @@
     try {
         cms::Destination* dest = parent->resolveDestinationName(session, destinationName);
         parent->doSend(session, dest, messageCreator);
-    } 
+    }
     AMQ_CATCH_RETHROW( ActiveMQException )
     AMQ_CATCH_EXCEPTION_CONVERT( IllegalStateException, ActiveMQException )
     AMQ_CATCHALL_THROW( ActiveMQException )

Modified: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h?rev=620176&r1=620175&r2=620176&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h Sat Feb  9 11:23:23 2008
@@ -18,6 +18,7 @@
 #ifndef ACTIVEMQ_CMSUTIL_CMSTEMPLATE_H_
 #define ACTIVEMQ_CMSUTIL_CMSTEMPLATE_H_
 
+#include <activemq/util/Config.h>
 #include <activemq/cmsutil/CmsDestinationAccessor.h>
 #include <activemq/cmsutil/SessionCallback.h>
 #include <activemq/cmsutil/SessionPool.h>
@@ -87,25 +88,58 @@
         /**
          * Session callback that executes a producer callback.
          */
-        class ProducerSessionCallback;
-        friend class ProducerSessionCallback;
-        class ProducerSessionCallback : public SessionCallback {
-        private:
+        class ProducerExecutor;
+        friend class ProducerExecutor;
+        class ProducerExecutor : public SessionCallback {
+        protected:
             
             ProducerCallback* action;
             CmsTemplate* parent;
+            cms::Destination* destination;
             
         public:
             
-            ProducerSessionCallback(ProducerCallback* action,
-                    CmsTemplate* parent){
+            ProducerExecutor(ProducerCallback* action,
+                    CmsTemplate* parent, cms::Destination* destination){
                 this->action = action;
                 this->parent = parent;
+                this->destination = destination;
             }
             
-            virtual ~ProducerSessionCallback() {}
+            virtual ~ProducerExecutor() {}
             
             virtual void doInCms(cms::Session* session) throw (cms::CMSException);
+            
+            virtual cms::Destination* getDestination(cms::Session* session AMQCPP_UNUSED) 
+                throw (cms::CMSException) {
+                return destination;
+            }
+        };
+        
+        /**
+         * Session callback that executes a producer callback for a named destination.
+         */
+        class ResolveProducerExecutor;
+        friend class ResolveProducerExecutor;
+        class ResolveProducerExecutor : public ProducerExecutor {
+        private:
+            
+            std::string destinationName;
+            
+        public:
+            
+            ResolveProducerExecutor(ProducerCallback* action,
+                    CmsTemplate* parent, const std::string& destinationName)
+            :
+                ProducerExecutor(action, parent, NULL) {
+                
+                this->destinationName = destinationName;
+            }
+            
+            virtual ~ResolveProducerExecutor() {}
+            
+            virtual cms::Destination* getDestination(cms::Session* session) 
+                throw (cms::CMSException) ;
         };
         
         /**
@@ -149,7 +183,7 @@
             CmsTemplate* parent;
             
         public:
-            
+                
             ResolveSender(const std::string& destinationName, 
                     MessageCreator* messageCreator,
                     CmsTemplate* parent ) {
@@ -420,6 +454,33 @@
          * @throws cms::CMSException thrown if an error occurs.
          */
         virtual void execute(ProducerCallback* action) throw (cms::CMSException);
+        
+        /**
+         * Executes the given action and provides it with a CMS Session and 
+         * producer
+         * 
+         * @param dest
+         *          the destination to send messages to
+         * @param action
+         *          the action to perform
+         * @throws cms::CMSException thrown if an error occurs.
+         */
+        virtual void execute(cms::Destination* dest,
+                ProducerCallback* action) throw (cms::CMSException);
+        
+        /**
+         * Executes the given action and provides it with a CMS Session and 
+         * producer
+         * 
+         * @param dest
+         *          the name of the destination to send messages to
+         *          (to internally be resolved to an actual destination)
+         * @param action
+         *          the action to perform
+         * @throws cms::CMSException thrown if an error occurs.
+         */
+        virtual void execute(const std::string& destinationName,
+                ProducerCallback* action) throw (cms::CMSException);
     
         /**
          * Convenience method for sending a message to the default destination.