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/04 02:18:24 UTC
svn commit: r618143 - in /activemq/activemq-cpp/trunk/src:
main/activemq/cmsutil/ test/activemq/cmsutil/
Author: nmittler
Date: Sun Feb 3 17:18:23 2008
New Revision: 618143
URL: http://svn.apache.org/viewvc?rev=618143&view=rev
Log:
AMQCPP-152 - Adding tests for CmsTemplate
Added:
activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CachedProducer.h
activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummyProducer.h
Modified:
activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp
activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h
activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.cpp
activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.h
activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.cpp
activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.h
activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h
Added: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CachedProducer.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CachedProducer.h?rev=618143&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CachedProducer.h (added)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CachedProducer.h Sun Feb 3 17:18:23 2008
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+#ifndef ACTIVEMQ_CMSUTIL_CACHEDPRODUCER_H_
+#define ACTIVEMQ_CMSUTIL_CACHEDPRODUCER_H_
+
+#include <cms/MessageProducer.h>
+
+namespace activemq {
+namespace cmsutil {
+
+ /**
+ * A cached message roducer contained within a pooled session.
+ */
+ class CachedProducer : public cms::MessageProducer {
+ private:
+
+ cms::MessageProducer* producer;
+
+ public:
+
+ CachedProducer( cms::MessageProducer* producer ) {
+ this->producer = producer;
+ }
+
+ virtual ~CachedProducer() {}
+
+ /**
+ * Does nothing - the real producer resource will be closed
+ * by the lifecycle manager.
+ */
+ virtual void close() throw( cms::CMSException ){
+ // Do nothing.
+ }
+
+ virtual void send( cms::Message* message ) throw ( cms::CMSException ){
+ producer->send(message);
+ }
+
+ virtual void send( cms::Message* message, int deliveryMode, int priority,
+ long long timeToLive) throw ( cms::CMSException ){
+ producer->send(message, deliveryMode, priority, timeToLive);
+ }
+
+
+ virtual void send( const cms::Destination* destination,
+ cms::Message* message ) throw ( cms::CMSException ){
+ producer->send(destination, message);
+ }
+
+ virtual void send( const cms::Destination* destination,
+ cms::Message* message, int deliveryMode, int priority,
+ long long timeToLive) throw ( cms::CMSException ){
+ producer->send(destination, message, deliveryMode, priority, timeToLive);
+ }
+
+ virtual void setDeliveryMode( int mode ) {
+ producer->setDeliveryMode(mode);
+ }
+
+ virtual int getDeliveryMode() const {
+ return producer->getDeliveryMode();
+ }
+
+ virtual void setDisableMessageID( bool value ) {
+ producer->setDisableMessageID(value);
+ }
+
+ virtual bool getDisableMessageID() const {
+ return producer->getDisableMessageID();
+ }
+
+ virtual void setDisableMessageTimeStamp( bool value ) {
+ producer->setDisableMessageTimeStamp(value);
+ }
+
+ virtual bool getDisableMessageTimeStamp() const {
+ return producer->getDisableMessageTimeStamp();
+ }
+
+ virtual void setPriority( int priority ) {
+ producer->setPriority(priority);
+ }
+
+ virtual int getPriority() const {
+ return producer->getPriority();
+ }
+
+ virtual void setTimeToLive( long long time ) {
+ producer->setTimeToLive(time);
+ }
+
+ virtual long long getTimeToLive() const {
+ return producer->getTimeToLive();
+ }
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_CMSUTIL_CACHEDPRODUCER_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=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.cpp Sun Feb 3 17:18:23 2008
@@ -255,7 +255,12 @@
}
AMQ_CATCH_NOTHROW( cms::CMSException )
- delete producer;
+ // Destroy if it's not a cached producer.
+ CachedProducer* cachedProducer = dynamic_cast<CachedProducer*>(producer);
+ if( cachedProducer == NULL ) {
+ delete producer;
+ }
+
producer = NULL;
}
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=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/CmsTemplate.h Sun Feb 3 17:18:23 2008
@@ -181,22 +181,56 @@
virtual void init()
throw (cms::CMSException, decaf::lang::exceptions::IllegalStateException);
+ /**
+ * Sets the destination object to be used by default for send/receive operations.
+ * If no default destination is provided, the <code>defaultDestinationName</code>
+ * property is used to resolve this default destination for send/receive
+ * operations.
+ *
+ * @param defaultDestination
+ * the default destination
+ */
virtual void setDefaultDestination(cms::Destination* defaultDestination) {
this->defaultDestination = defaultDestination;
}
+ /**
+ * Retrieves the default destination to be used for send/receive operations.
+ * @return the default destination. Const version of this method.
+ */
virtual const cms::Destination* getDefaultDestination() const {
return this->defaultDestination;
}
+ /**
+ * Retrieves the default destination to be used for send/receive operations.
+ * @return the default destination. Non-const version of this method.
+ */
virtual cms::Destination* getDefaultDestination() {
return this->defaultDestination;
}
+ /**
+ * Sets the name of the default destination to be used from send/receive operations.
+ * Calling this method will set the <code>defaultDestination</code> to NULL.
+ * The destination type (topic/queue) is determined by the
+ * <code>pubSubDomain</code> property.
+ *
+ * @param defaultDestinationName
+ * the name of the destination for send/receive to by default.
+ */
virtual void setDefaultDestinationName(const std::string& defaultDestinationName) {
+ this->defaultDestination = NULL;
this->defaultDestinationName = defaultDestinationName;
}
+ /**
+ * Gets the name of the default destination to be used for send/receive operations.
+ * The destination type (topic/queue) is determined by the
+ * <code>pubSubDomain</code> property.
+ *
+ * @return the default name of the destination for send/receive operations.
+ */
virtual const std::string getDefaultDestinationName() const {
return this->defaultDestinationName;
}
Modified: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.cpp?rev=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.cpp (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.cpp Sun Feb 3 17:18:23 2008
@@ -49,23 +49,33 @@
try {
+ if( destination == NULL ) {
+ throw ActiveMQException(__FILE__, __LINE__, "destination is NULL");
+ }
+
std::string destName = getUniqueDestName(destination);
// Check the cache - add it if necessary.
- cms::MessageProducer* p = producerCache.getValue(destName);
- if( p == NULL ) {
+ CachedProducer* cachedProducer = NULL;
+ try {
+ cachedProducer = producerCache.getValue(destName);
+ } catch( decaf::lang::exceptions::NoSuchElementException& e ) {
- // No producer exists for this destination - create it.
- p = session->createProducer(destination);
-
- // Add it to the cache.
- producerCache.setValue(destName, p);
+ // No producer exists for this destination - start by creating
+ // a new producer resource.
+ cms::MessageProducer* p = session->createProducer(destination);
- // Add the producer to the resource lifecycle manager.
+ // Add the producer resource to the resource lifecycle manager.
pool->getResourceLifecycleManager()->addMessageProducer(p);
+
+ // Create the cached producer wrapper.
+ cachedProducer = new CachedProducer(p);
+
+ // Add it to the cache.
+ producerCache.setValue(destName, cachedProducer);
}
- return p;
+ return cachedProducer;
}
AMQ_CATCH_RETHROW( ActiveMQException )
AMQ_CATCHALL_THROW( ActiveMQException )
Modified: activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.h?rev=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.h (original)
+++ activemq/activemq-cpp/trunk/src/main/activemq/cmsutil/PooledSession.h Sun Feb 3 17:18:23 2008
@@ -20,6 +20,7 @@
#include <cms/Session.h>
#include <decaf/util/Map.h>
+#include <activemq/cmsutil/CachedProducer.h>
namespace activemq {
namespace cmsutil {
@@ -38,7 +39,7 @@
cms::Session* session;
- decaf::util::Map<std::string, cms::MessageProducer*> producerCache;
+ decaf::util::Map<std::string, CachedProducer*> producerCache;
public:
Modified: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.cpp?rev=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.cpp (original)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.cpp Sun Feb 3 17:18:23 2008
@@ -43,27 +43,53 @@
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testExecuteSession() {
- cmsTemplate->setSessionAcknowledgeMode(cms::Session::CLIENT_ACKNOWLEDGE);
-
- // Test basics.
- MySessionCallback sessionCallback;
- cmsTemplate->execute(&sessionCallback);
- CPPUNIT_ASSERT(sessionCallback.session != NULL);
- CPPUNIT_ASSERT(sessionCallback.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
+ try {
+ cmsTemplate->setSessionAcknowledgeMode(cms::Session::CLIENT_ACKNOWLEDGE);
+
+ // Test basics.
+ MySessionCallback sessionCallback;
+ cmsTemplate->execute(&sessionCallback);
+ CPPUNIT_ASSERT(sessionCallback.session != NULL);
+ CPPUNIT_ASSERT(sessionCallback.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
+
+ // Try again and make sure we get the same session
+ MySessionCallback sessionCallback2;
+ cmsTemplate->execute(&sessionCallback2);
+ CPPUNIT_ASSERT(sessionCallback2.session == sessionCallback.session);
+ CPPUNIT_ASSERT(sessionCallback2.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
+
+ // Now try different ack mode and make sure we have a different session.
+ cmsTemplate->setSessionAcknowledgeMode(cms::Session::AUTO_ACKNOWLEDGE);
+ MySessionCallback sessionCallback3;
+ cmsTemplate->execute(&sessionCallback3);
+ CPPUNIT_ASSERT(sessionCallback3.session != NULL);
+ CPPUNIT_ASSERT(sessionCallback3.session != sessionCallback.session);
+ CPPUNIT_ASSERT(sessionCallback3.ackMode == cms::Session::AUTO_ACKNOWLEDGE);
+
+ } catch( cms::CMSException& e) {
+ e.printStackTrace();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void CmsTemplateTest::testExecuteProducer() {
- // Try again and make sure we get the same session
- MySessionCallback sessionCallback2;
- cmsTemplate->execute(&sessionCallback2);
- CPPUNIT_ASSERT(sessionCallback2.session == sessionCallback.session);
- CPPUNIT_ASSERT(sessionCallback2.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
+ try {
+
+ // Test basics.
+ MyProducerCallback callback;
+ cmsTemplate->execute(&callback);
+ CPPUNIT_ASSERT(callback.session != NULL);
+ CPPUNIT_ASSERT(callback.producer != NULL);
- // Now try different ack mode and make sure we have a different session.
- cmsTemplate->setSessionAcknowledgeMode(cms::Session::AUTO_ACKNOWLEDGE);
- MySessionCallback sessionCallback3;
- cmsTemplate->execute(&sessionCallback3);
- CPPUNIT_ASSERT(sessionCallback3.session != NULL);
- CPPUNIT_ASSERT(sessionCallback3.session != sessionCallback.session);
- CPPUNIT_ASSERT(sessionCallback3.ackMode == cms::Session::AUTO_ACKNOWLEDGE);
+ // Try again and make sure we have the same producer
+ MyProducerCallback callback2;
+ cmsTemplate->execute(&callback2);
+ CPPUNIT_ASSERT(callback2.session == callback.session);
+ CPPUNIT_ASSERT(callback2.producer == callback.producer);
+
+ } catch( cms::CMSException& e) {
+ e.printStackTrace();
+ }
}
-
Modified: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.h?rev=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.h (original)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/CmsTemplateTest.h Sun Feb 3 17:18:23 2008
@@ -34,6 +34,7 @@
{
CPPUNIT_TEST_SUITE( CmsTemplateTest );
CPPUNIT_TEST( testExecuteSession );
+ CPPUNIT_TEST( testExecuteProducer );
CPPUNIT_TEST_SUITE_END();
@@ -85,6 +86,7 @@
virtual void tearDown();
void testExecuteSession();
+ void testExecuteProducer();
};
}}
Added: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummyProducer.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummyProducer.h?rev=618143&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummyProducer.h (added)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummyProducer.h Sun Feb 3 17:18:23 2008
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+#ifndef ACTIVEMQ_CMSUTIL_DUMMYPRODUCER_H_
+#define ACTIVEMQ_CMSUTIL_DUMMYPRODUCER_H_
+
+#include <cms/MessageProducer.h>
+
+namespace activemq {
+namespace cmsutil {
+
+ class DummyProducer : public cms::MessageProducer {
+ private:
+ int deliveryMode;
+ bool disableMessageId;
+ bool disableMessageTimestamp;
+ int priority;
+ long long ttl;
+
+ public:
+
+ DummyProducer() {
+ deliveryMode = 1;
+ disableMessageId = false;
+ disableMessageTimestamp = false;
+ priority = 4;
+ ttl = 0L;
+ }
+ virtual ~DummyProducer() {}
+
+ virtual void close() throw( cms::CMSException ){}
+
+ /**
+ * Sends the message to the default producer destination, but does
+ * not take ownership of the message, caller must still destroy it.
+ * Uses default values for deliveryMode, priority, and time to live.
+ *
+ * @param message
+ * The message to be sent.
+ * @throws cms::CMSException
+ */
+ virtual void send( cms::Message* message ) throw ( cms::CMSException ){
+ }
+
+ /**
+ * Sends the message to the default producer destination, but does
+ * not take ownership of the message, caller must still destroy it.
+ *
+ * @param message
+ * The message to be sent.
+ * @param deliveryMode
+ * The delivery mode to be used.
+ * @param priority
+ * The priority for this message.
+ * @param timeToLive
+ * The time to live value for this message in milliseconds.
+ * @throws cms::CMSException
+ */
+ virtual void send( cms::Message* message, int deliveryMode, int priority,
+ long long timeToLive) throw ( cms::CMSException ){
+ }
+
+ /**
+ * Sends the message to the designated destination, but does
+ * not take ownership of the message, caller must still destroy it.
+ * Uses default values for deliveryMode, priority, and time to live.
+ *
+ * @param destination
+ * The destination on which to send the message
+ * @param message
+ * the message to be sent.
+ * @throws cms::CMSException
+ */
+ virtual void send( const cms::Destination* destination,
+ cms::Message* message ) throw ( cms::CMSException ){}
+
+ /**
+ * Sends the message to the designated destination, but does
+ * not take ownership of the message, caller must still destroy it.
+ *
+ * @param destination
+ * The destination on which to send the message
+ * @param message
+ * The message to be sent.
+ * @param deliveryMode
+ * The delivery mode to be used.
+ * @param priority
+ * The priority for this message.
+ * @param timeToLive
+ * The time to live value for this message in milliseconds.
+ * @throws cms::CMSException
+ */
+ virtual void send( const cms::Destination* destination,
+ cms::Message* message, int deliveryMode, int priority,
+ long long timeToLive) throw ( cms::CMSException ){}
+
+ /**
+ * Sets the delivery mode for this Producer
+ *
+ * @param mode
+ * The DeliveryMode
+ */
+ virtual void setDeliveryMode( int mode ) {
+ this->deliveryMode = mode;
+ }
+
+ /**
+ * Gets the delivery mode for this Producer
+ *
+ * @return The DeliveryMode
+ */
+ virtual int getDeliveryMode() const {
+ return deliveryMode;
+ }
+
+ /**
+ * Sets if Message Ids are disbled for this Producer
+ *
+ * @param value
+ * boolean indicating enable / disable (true / false)
+ */
+ virtual void setDisableMessageID( bool value ) {
+ disableMessageId = value;
+ }
+
+ /**
+ * Gets if Message Ids are disbled for this Producer
+ *
+ * @return boolean indicating enable / disable (true / false)
+ */
+ virtual bool getDisableMessageID() const {
+ return disableMessageId;
+ }
+
+ /**
+ * Sets if Message Time Stamps are disbled for this Producer
+ * @param value - boolean indicating enable / disable (true / false)
+ */
+ virtual void setDisableMessageTimeStamp( bool value ) {
+ disableMessageTimestamp = value;
+ }
+
+ /**
+ * Gets if Message Time Stamps are disbled for this Producer
+ *
+ * @return boolean indicating enable / disable (true / false)
+ */
+ virtual bool getDisableMessageTimeStamp() const {
+ return disableMessageTimestamp;
+ }
+
+ /**
+ * Sets the Priority that this Producers sends messages at
+ *
+ * @param priority
+ * int value for Priority level
+ */
+ virtual void setPriority( int priority ) {
+ this->priority = priority;
+ }
+
+ /**
+ * Gets the Priority level that this producer sends messages at
+ *
+ * @return int based priority level
+ */
+ virtual int getPriority() const {
+ return priority;
+ }
+
+ /**
+ * Sets the Time to Live that this Producers sends messages with. This
+ * value will be used if the time to live is not specified via the
+ * send method.
+ *
+ * @param time
+ * default time to live value in milliseconds
+ */
+ virtual void setTimeToLive( long long time ) {
+ ttl = time;
+ }
+
+ /**
+ * Gets the Time to Live that this producer sends messages with
+ *
+ * @return Time to live value in milliseconds
+ */
+ virtual long long getTimeToLive() const {
+ return ttl;
+ }
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_CMSUTIL_DUMMYPRODUCER_H_*/
Modified: activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h?rev=618143&r1=618142&r2=618143&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h (original)
+++ activemq/activemq-cpp/trunk/src/test/activemq/cmsutil/DummySession.h Sun Feb 3 17:18:23 2008
@@ -21,6 +21,7 @@
#include <cms/Session.h>
#include <activemq/connector/stomp/StompTopic.h>
#include <activemq/connector/stomp/StompQueue.h>
+#include <activemq/cmsutil/DummyProducer.h>
namespace activemq {
namespace cmsutil {
@@ -70,7 +71,7 @@
throw ( cms::CMSException ) { return NULL; }
virtual cms::MessageProducer* createProducer( const cms::Destination* destination )
- throw ( cms::CMSException ) { return NULL; }
+ throw ( cms::CMSException ) { return new DummyProducer(); }
virtual cms::Queue* createQueue( const std::string& queueName )
throw ( cms::CMSException ) {