2013-04-15 88 views
0

我正在使用NetBeans IDE和Java EE與glassfish3服務器編寫程序。目前我有2個線程,A和B.他們都在彼此之間來回發送消息。我遇到的問題是這樣的:Java消息傳遞服務 - 未收到消息

1. A sends a message, M1, to B 
2. B receives M1 
3. B sends M2 to A 
4. A hangs waiting on M2 

這裏是我的代碼:

線程A:

//required declarations 
producer = session.createProducer(AtoBQueue); 
m1 = session.createMapMessage(); 
m1.setString("m1", "m1Val"); 
m1.setJMSReplyTo(BtoAQueue); 
flag = true; 
producer.send(m1); 

consumer = session.createConsumer(BtoAQueue); 
connection.start(); 

if(flag){ 
    m2 = (MapMessage) consumer.receive(); 
    String m2Val = m2.getString("m2"); 
    if(m2Val.equals("true")){ 
     flag2 = true; 
    } 
} 
... 

線程B:

consumer = session.createConsumer(AtoBQueue); 
connection.start(); 
while(true){ 
    m1 = (MapMessage) consumer.receive(); 
    m1Val = m1.getString("m1"); 
    if(m1Val != null){ 
     flag = true; 
    } 

    MessageProducer producer = session.createProducer((Queue m1.getJMSReplyTo()); 
    m2 = session.createMapMessage(); 
    if(m1Val != null){ 
     if(m1Val.equals("m1Val")){ 
     m2.setString("m2", "m2Val"); 
     m2.setJMSReplyTo(AtoBQueue); 
     producer.send(m2); 
     } 
    } 
    ... 
} 

回答

0

原來我需要在session.commit添加()後,我只對線程B.做producer.send(消息)

0

你的線程A發送的關鍵作爲「報告」,並且您期望在線程B中爲「m1」,因此它不會將回復發送回隊列。也請嘗試在發送消息之前在A中創建消費者。

+0

哦哎呦。我將它改爲m1。我簡化了我的代碼,並且意外地將它留在了那裏。但這不是我的問題。我遇到的問題是A沒有收到m2 – user972276