You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by ttmdev <jo...@ttmsolutions.com> on 2007/09/28 16:34:05 UTC

Lost Messages and Embedded Broker

If your client is starting an embedded broker via the vm or peer connectors
and sends a message immediately after invoking connection.start(), that
message will most likely fall into a black hole and your client is never
notified of this. This is because the embedded broker has not been fully
activated by the time you send the message. There is a warning on the web
site re this with an accompanying Spring-dependent work-around. However, I
would prefer not to rely on Spring. The connection.isStarted() method does
not help and neither does a transportListener. Other than forcing a delay
after connection.start(), does anyone else know of a more elegant way to be
notified that the embedded broker is ready to rock-n-roll and thus safe to
start sending messages? 

Joe 
-- 
View this message in context: http://www.nabble.com/Lost-Messages-and-Embedded-Broker-tf4534900s2354.html#a12941763
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Re: Lost Messages and Embedded Broker

Posted by ttmdev <jo...@ttmsolutions.com>.
Hi Rob, 

Actually, it is pretty straight forward. Here's some code from my test
publisher to illustrate. Note the comment for the first Thread.sleep.

==== code snippet ====
...

Context ctx = new InitialContext();

//  peer1ConnectionFactory maps to 'peer://groupa'  

ConnectionFactory factory = (ConnectionFactory)
  ctx.lookup("peer1ConnectionFactory");            
          
Connection conn = factory.createConnection();
            
Topic myTopic = (Topic) ctx.lookup("dynamicTopics/TOPIC.FOO.BAR");

Session session = conn.createSession(false, Session.CLIENT_ACKNOWLEDGE);
                                
MessageProducer topicSender = session.createProducer(myTopic);
            
conn.start();
            
// If you comment out this sleep, the messages will get lost 
// (i.e., subscriber will never get them). W/the sleep, 
// the subscriber gets them just fine. 
Thread.sleep(1000);  
                    
// Publish five test messages
for(int i=0; i<5; i++){
    msg = session.createTextMessage();
    String temp = Math.random() + "{}";
    msg.setText("Test Message["  + i + "] " + temp);
    msg.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
    topicSender.send(msg);                
}

// Pause a bit just for grins             
Thread.sleep(2 * 1000);
            
topicSender.close();
session.close();
conn.close(); 
System.out.println("All done …");             

...
================

Joe






rajdavies wrote:
> 
> joe,
> 
> do you have a test case for this? This sounds like a bug
> 
> 
> cheers,
> 
> Rob
> 
> http://rajdavies.blogspot.com/
> 
> 
> 
> On Sep 28, 2007, at 3:34 PM, ttmdev wrote:
> 
>>
>> If your client is starting an embedded broker via the vm or peer  
>> connectors
>> and sends a message immediately after invoking connection.start(),  
>> that
>> message will most likely fall into a black hole and your client is  
>> never
>> notified of this. This is because the embedded broker has not been  
>> fully
>> activated by the time you send the message. There is a warning on  
>> the web
>> site re this with an accompanying Spring-dependent work-around.  
>> However, I
>> would prefer not to rely on Spring. The connection.isStarted()  
>> method does
>> not help and neither does a transportListener. Other than forcing a  
>> delay
>> after connection.start(), does anyone else know of a more elegant  
>> way to be
>> notified that the embedded broker is ready to rock-n-roll and thus  
>> safe to
>> start sending messages?
>>
>> Joe
>> -- 
>> View this message in context: http://www.nabble.com/Lost-Messages- 
>> and-Embedded-Broker-tf4534900s2354.html#a12941763
>> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>>
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Lost-Messages-and-Embedded-Broker-tf4534900s2354.html#a12943513
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Re: Lost Messages and Embedded Broker

Posted by Rob Davies <ra...@gmail.com>.
joe,

do you have a test case for this? This sounds like a bug


cheers,

Rob

http://rajdavies.blogspot.com/



On Sep 28, 2007, at 3:34 PM, ttmdev wrote:

>
> If your client is starting an embedded broker via the vm or peer  
> connectors
> and sends a message immediately after invoking connection.start(),  
> that
> message will most likely fall into a black hole and your client is  
> never
> notified of this. This is because the embedded broker has not been  
> fully
> activated by the time you send the message. There is a warning on  
> the web
> site re this with an accompanying Spring-dependent work-around.  
> However, I
> would prefer not to rely on Spring. The connection.isStarted()  
> method does
> not help and neither does a transportListener. Other than forcing a  
> delay
> after connection.start(), does anyone else know of a more elegant  
> way to be
> notified that the embedded broker is ready to rock-n-roll and thus  
> safe to
> start sending messages?
>
> Joe
> -- 
> View this message in context: http://www.nabble.com/Lost-Messages- 
> and-Embedded-Broker-tf4534900s2354.html#a12941763
> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>