On 25 Apr 2008, at 16:42, Alex Karasulu wrote:

On Fri, Apr 25, 2008 at 2:48 AM, Rob Davies <[EMAIL PROTECTED]> wrote:


On 25 Apr 2008, at 04:46, Alex Karasulu wrote:

Hi all,

I just started using ActiveMQ 5.1.0 and it's just wonderful. I just wish
I
had a better understanding of it. Trying to get up to speed reading the code, the bundled test cases and playing with some of my own as well.

Unfortunately I hit a brick wall today when trying to tinker with
temporary
queues.  I got the following exception:

javax.jms.InvalidDestinationException: Cannot use a Temporary
destination from another Connection
      at
org .apache .activemq .ActiveMQMessageConsumer.<init>(ActiveMQMessageConsumer.java:160)
      at
org .apache .activemq.ActiveMQSession.createConsumer(ActiveMQSession.java:1004)
      at
org .apache .activemq.ActiveMQSession.createConsumer(ActiveMQSession.java:948)
      at
org .apache .activemq.ActiveMQSession.createConsumer(ActiveMQSession.java:861)
      at
org .apache .activemq.ActiveMQSession.createConsumer(ActiveMQSession.java:834)


Here's my environment in case that may factor in:
 Linux 2.6.22-14-generic SMP AMD x86_64
 Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode)
 Maven version: 2.0.8

This is coming from the following code snippet from a test. The code
producing the exception is below but please excuse the use of actual
ActiveMQXxxxx objects instead of the JMS equivalents - I've been doing
this
just to investigate, and learn about the internals.

     if ( create )
     {
         factory = new ActiveMQConnectionFactory(
"vm://localhost?create=true&broker.persistent=false" );
     }
     else
     {
         factory = new ActiveMQConnectionFactory(
"vm://localhost?broker.persistent=false" );
     }
     factory.setObjectMessageSerializationDefered( true );
     factory.setCopyMessageOnSend( false );
     factory.setUseAsyncSend( true );
     factory.setStatsEnabled( true );

     ...

     String destination = "testQueue";
     connection = ( ActiveMQConnection ) factory.createConnection();
     connection.start();
     session = ( ActiveMQSession ) connection.createSession( false,
Session.AUTO_ACKNOWLEDGE );
     queue = ( ActiveMQTempQueue )
ActiveMQDestination.createDestination( destination,
ActiveMQDestination.TEMP_QUEUE_TYPE );
====>>>        consumer = ( ActiveMQMessageConsumer )
session.createConsumer( queue );
     consumer.setMessageListener( this );
     consumer.start();
producer = ( ActiveMQMessageProducer ) session.createProducer( queue
);



The marked line above (see ====>>>>) where the consumer is created throws this exception. The interesting thing is when it does this, I'm using the same connection as well as the the same session. Why would the exception above say "Cannot use a Temporary destination from another Connection" if
I'm using the same connection?

I tracked it down to a constructor of ActiveMQMessageConsumer on line 160
here:

         String connectionID =
session.connection.getConnectionInfo().getConnectionId().getValue();

         if (physicalName.indexOf(connectionID) < 0) {
             throw new InvalidDestinationException(
                                                   "Cannot use a
Temporary destination from another Connection");
         }

The value for my queue's physicalName is showing "testQueue" and the value
of the connectionID is showing "ID:newton-58167-1209094847149-2:0".
Obviously the connectionID will not be found in "testQueue".  I'm
wondering
why these values are the way they are and this check is failing?

These are probably some dumb questions and I must be doing something dumb
here.  Looking for enlightenment :).

Thanks much,
Alex


Hi Alex,

use session.createTemporaryQueue() - to create your Queue


Thanks Rob for your response. I only have one problem with this and that is not being able to give this method a destination. Is there some what to
specify a destination to create the temporary queue?

Thanks,
Alex

Unfortunately at the moment you can't do that - but if you add an enhancement request to our jiras this is something we certainly would consider. However temporary destinations are only meant to be tied to a particular connection, and only live as long as that connection.




cheers,

Rob

http://open.iona.com/ -Enterprise Open Integration
http://rajdavies.blogspot.com/



Reply via email to