Hi Nathan-
Requesting to reopen the issue given at https://issues.apache.org/activemq/browse/AMQCPP-64 I had already tried the solution you have provided ... it throws a StompException .... It is some kind of a inconsistency between how activemq uses stomp ... http://www.nabble.com/file/6142/StompExceptionWithToStringMethod.jpg I appreciate all the help ... Thank you Lalit Nagpal CSA, SunGard Lalit Nagpal wrote: > > created JIRA issue at > https://issues.apache.org/activemq/browse/AMQCPP-64 > > attched = source code to reproduce and the image file for output. > > Any rough timelines when we can expect a solution for this. > > Thanks > > Lalit Nagpal > CSA, SunGard > > > > nmittler wrote: >> >> Yep, something is definitely not right. Please create a JIRA issue here >> http://issues.apache.org/activemq/browse/AMQCPP >> >> ... be sure to attach the code and your output image. >> >> Thanks! >> Nate >> >> On 1/30/07, Lalit Nagpal <[EMAIL PROTECTED]> wrote: >>> >>> >>> Copy pasting the entire sample main code to reproduce my issue >>> >>> #include "stdafx.h" >>> #include <activemq/concurrent/Thread.h> >>> #include <activemq/concurrent/Runnable.h> >>> #include <activemq/core/ActiveMQConnectionFactory.h> >>> #include <cms/Connection.h> >>> #include <cms/Session.h> >>> #include <cms/TextMessage.h> >>> #include <cms/ExceptionListener.h> >>> #include <cms/MessageListener.h> >>> #include <stdlib.h> >>> #include <stdio.h> >>> >>> using namespace activemq::core; >>> using namespace activemq::concurrent; >>> using namespace cms; >>> using namespace std; >>> >>> bool GenerateGuid(char* buf, size_t strsz) >>> { >>> GUID a_guid; >>> >>> UuidCreate(&a_guid); >>> >>> if (strsz > 38) >>> { >>> sprintf(buf, >>> >>> >>> "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", >>> a_guid.Data1, a_guid.Data2, >>> a_guid.Data3, >>> a_guid.Data4[0], a_guid.Data4[1], >>> a_guid.Data4[2], a_guid.Data4[3], >>> a_guid.Data4[4], a_guid.Data4[5], >>> a_guid.Data4[6], a_guid.Data4[7] >>> ); >>> return true; >>> } >>> return false; >>> }; >>> >>> class HelloWorldProducer : public Runnable, public MessageListener { >>> private: >>> >>> Connection* connection; >>> Session* session; >>> Destination* destination; >>> MessageProducer* producer; >>> MessageConsumer* consumer; >>> int numMessages; >>> >>> public: >>> >>> HelloWorldProducer( int numMessages ){ >>> connection = NULL; >>> session = NULL; >>> destination = NULL; >>> producer = NULL; >>> this->numMessages = numMessages; >>> } >>> >>> virtual void onMessage( const Message* message ){ >>> >>> try >>> { >>> const TextMessage* textMessage = dynamic_cast< const >>> TextMessage* >>> >( message ); >>> string text = textMessage->getText(); >>> printf( "Producer Received: %s\n", text.c_str() ); >>> } catch (CMSException& e) { >>> e.printStackTrace(); >>> } >>> } >>> >>> virtual ~HelloWorldProducer(){ >>> cleanup(); >>> } >>> >>> virtual void run() { >>> try { >>> // Create a ConnectionFactory >>> ActiveMQConnectionFactory* connectionFactory = new >>> ActiveMQConnectionFactory("tcp://127.0.0.1:61617"); >>> >>> // Create a Connection >>> connection = connectionFactory->createConnection(); >>> connection->start(); >>> >>> // Create a Session >>> session = connection->createSession( >>> Session::AUTO_ACKNOWLEDGE >>> ); >>> >>> // Create the destination (Topic or Queue) >>> destination = session->createTopic( "TEST.FOO" ); >>> >>> // Create a MessageProducer from the Session to the Topic or >>> Queue >>> cout << endl << "Producer has been registered at >>> " >>> << >>> destination->toString() << endl << endl; >>> producer = session->createProducer( destination ); >>> producer->setDeliveryMode( DeliveryMode::NON_PERSISTANT ); >>> >>> // Lets have a reply-back channel to this >>> producer >>> now >>> char* charGuid = new char[40]; >>> GenerateGuid(charGuid, 39); >>> cms::Topic* replyTopic = >>> session->createTopic(charGuid); >>> consumer = session->createConsumer( replyTopic >>> ); >>> consumer->setMessageListener(this); >>> cout << "Reply back channel has been registered >>> at >>> " << >>> replyTopic->toString() << endl << endl; >>> >>> // Stringify the thread id >>> char threadIdStr[100]; >>> _snprintf(threadIdStr, sizeof(threadIdStr), "%d", >>> Thread::getId() ); >>> >>> // Create a messages >>> string text = (string)"Hello world! from thread " + >>> threadIdStr; >>> >>> for( int ix=0; ix<numMessages; ++ix ){ >>> TextMessage* message = session->createTextMessage( >>> text ); >>> >>> >>> message->setCMSReplyTo(replyTopic->toProviderString()); >>> >>> // Tell the producer to send the message >>> printf( "Producer Sent message from thread %s\n", >>> threadIdStr); >>> producer->send( message ); >>> >>> delete message; >>> } >>> >>> }catch ( CMSException& e ) { >>> e.printStackTrace(); >>> } >>> } >>> >>> private: >>> >>> void cleanup(){ >>> >>> // Destroy resources. >>> try{ >>> if( destination != NULL ) delete destination; >>> }catch ( CMSException& e ) {} >>> destination = NULL; >>> >>> try{ >>> if( producer != NULL ) delete producer; >>> }catch ( CMSException& e ) {} >>> producer = NULL; >>> >>> // Close open resources. >>> try{ >>> if( session != NULL ) session->close(); >>> if( connection != NULL ) connection->close(); >>> }catch ( CMSException& e ) {} >>> >>> try{ >>> if( session != NULL ) delete session; >>> }catch ( CMSException& e ) {} >>> session = NULL; >>> >>> try{ >>> if( connection != NULL ) delete connection; >>> }catch ( CMSException& e ) {} >>> connection = NULL; >>> } >>> }; >>> >>> class HelloWorldConsumer : public ExceptionListener, >>> public MessageListener, >>> public Runnable { >>> >>> private: >>> >>> Connection* connection; >>> Session* session; >>> Destination* destination; >>> MessageConsumer* consumer; >>> long waitMillis; >>> >>> public: >>> >>> HelloWorldConsumer( long waitMillis ){ >>> connection = NULL; >>> session = NULL; >>> destination = NULL; >>> consumer = NULL; >>> this->waitMillis = waitMillis; >>> } >>> virtual ~HelloWorldConsumer(){ >>> cleanup(); >>> } >>> >>> virtual void run() { >>> >>> try { >>> >>> // Create a ConnectionFactory >>> ActiveMQConnectionFactory* connectionFactory = >>> new ActiveMQConnectionFactory( "tcp://127.0.0.1:61617" >>> ); >>> >>> // Create a Connection >>> connection = connectionFactory->createConnection(); >>> delete connectionFactory; >>> connection->start(); >>> >>> connection->setExceptionListener(this); >>> >>> // Create a Session >>> session = connection->createSession( >>> Session::AUTO_ACKNOWLEDGE >>> ); >>> >>> // Create the destination (Topic or Queue) >>> destination = session->createTopic( "TEST.FOO" ); >>> >>> // Create a MessageConsumer from the Session to the Topic or >>> Queue >>> consumer = session->createConsumer( destination ); >>> >>> consumer->setMessageListener( this ); >>> >>> // Sleep while asynchronous messages come in. >>> Thread::sleep( waitMillis ); >>> >>> } catch (CMSException& e) { >>> e.printStackTrace(); >>> } >>> } >>> >>> virtual void onMessage( const Message* message ){ >>> >>> try >>> { >>> // display the message received >>> const TextMessage* textMessage = dynamic_cast< const >>> TextMessage* >>> >( message ); >>> string text = textMessage->getText(); >>> printf( "Consumer Received: %s\n", text.c_str() ); >>> >>> // lets reply back with a thanks >>> if (textMessage->getCMSReplyTo().c_str() && >>> strcmp("null", >>> textMessage->getCMSReplyTo().c_str())==1 ) { >>> cms::Topic* destination_ = >>> session->createTopic( >>> textMessage->getCMSReplyTo().c_str() ); >>> MessageProducer* producer = >>> session->createProducer( destination_ ); >>> producer->setDeliveryMode( >>> DeliveryMode::NON_PERSISTANT ); >>> cout << endl << "Consumer Replying back >>> to >>> " << destination_->toString() >>> << endl; >>> TextMessage* message_ = >>> session->createTextMessage( "Thank you for Hello >>> World !!!" ); >>> producer->send(message_); >>> } >>> >>> } catch (CMSException& e) { >>> e.printStackTrace(); >>> } >>> } >>> >>> virtual void onException( const CMSException& ex ) { >>> printf("JMS Exception occured. Shutting down client.\n"); >>> } >>> >>> private: >>> >>> void cleanup(){ >>> >>> // Destroy resources. >>> try{ >>> if( destination != NULL ) delete destination; >>> }catch (CMSException& e) {} >>> destination = NULL; >>> >>> try{ >>> if( consumer != NULL ) delete consumer; >>> }catch (CMSException& e) {} >>> consumer = NULL; >>> >>> // Close open resources. >>> try{ >>> if( session != NULL ) session->close(); >>> if( connection != NULL ) connection->close(); >>> }catch (CMSException& e) {} >>> >>> try{ >>> if( session != NULL ) delete session; >>> }catch (CMSException& e) {} >>> session = NULL; >>> >>> try{ >>> if( connection != NULL ) delete connection; >>> }catch (CMSException& e) {} >>> connection = NULL; >>> } >>> }; >>> >>> int _tmain(int argc, _TCHAR* argv[]) >>> { >>> HelloWorldProducer producer( 5 ); >>> HelloWorldConsumer consumer( 1500 ); >>> >>> // Start the consumer thread. >>> Thread consumerThread( &consumer ); >>> consumerThread.start(); >>> >>> // Start the producer thread. >>> Thread producerThread( &producer ); >>> producerThread.start(); >>> >>> // Wait for the threads to complete. >>> producerThread.join(); >>> consumerThread.join(); >>> >>> cout << endl << endl << endl; >>> >>> return 0; >>> } >>> >>> >>> >>> >>> >>> >>> Lalit Nagpal wrote: >>> > >>> > Hi >>> > >>> > I am using the activemq-cpp cms api 1.0 release. The problem I am >>> facing >>> > is like this- >>> > My producer sends a message to the consumer and a message should be >>> sent >>> > from the receiving end as a reply after this - consider a situation >>> where >>> > a loginRequest message has been sent and now a loginReply message >>> should >>> > be sent from the receiving end. >>> > >>> > Attached is a sample main that can reproduce the problem I am facing - >>> I >>> > have modified the sample helloproducer helloconsumer code available at >>> > http://activemq.org/site/activemq-cpp-client.html >>> > to reproduce my problem so that its easier for you to see. >>> > >>> > http://www.nabble.com/file/6111/DestProbs.cpp DestProbs.cpp >>> > >>> > If you execute this piece of code you will see the output as in the >>> > attached image file >>> > >>> > http://www.nabble.com/file/6110/DestinationProblem.JPG >>> > >>> > This is what the code does >>> > producer lets call it xxx sends a "Hello world! from thread xxxx" to >>> the >>> > consumer >>> > consumer lets call it yyy receives the message and displays it >>> > this is the normal behavior as given in the example on >>> > http://activemq.org/site/activemq-cpp-client.html >>> > Following extra needs to be done now >>> > from yyy a reply should go back to xxx ... for this i registered a >>> > producer at yyy by creating a topic using the message->getCMSReplyTo() >>> and >>> > then replying back to that destination. >>> > >>> > The mismatch can be easily see by doing a bstat .... when I created >>> the >>> > consumer yyy initially it created a topic by name say ABCDEFGH (which >>> is >>> a >>> > random id) and later on when I used the message->getCMSReplyTo() to >>> create >>> > a topic the topic was registered with the name /topic/ABCDEFGH ..... >>> the >>> > additional /topic/ that has got added is doing a mess up here and the >>> > replies from yyy to xxx are not reaching xxx (getting enqueued and not >>> > dequeued) ... >>> > >>> > the /topic/ gets added due to the following statement in >>> > HelloWorldProducer - run method >>> > message->setCMSReplyTo(replyTopic->toProviderString()); >>> > here the toProviderString method adds it actually ... if you replace >>> this >>> > method with just the toString() method ... you will get a stomp >>> exception >>> > saying that destinations should start with either /topic/ or /queue/ >>> > >>> > Can somebody make this code work please. >>> > >>> > For every message sent by the producer to consumer "Hello world! from >>> > thread xxxx" there should be a reply coming back as "Thank you for >>> Hello >>> > World !!!" >>> > >>> > Please help me urgently here. >>> > >>> > Thank you in advance >>> > >>> > Lalit Nagpal >>> > CSA, SunGard >>> > >>> > >>> >>> -- >>> View this message in context: >>> http://www.nabble.com/activemq-cms-stomp---creating-a-topic-from-message-%3EgetCMSReplyTo%28%29-does-not-work-tf3142309.html#a8709155 >>> Sent from the ActiveMQ - User mailing list archive at Nabble.com. >>> >>> >> >> > > -- View this message in context: http://www.nabble.com/activemq-cms-stomp---creating-a-topic-from-message-%3EgetCMSReplyTo%28%29-does-not-work-tf3142309.html#a8743627 Sent from the ActiveMQ - User mailing list archive at Nabble.com.