2011-09-02 43 views
3

我是HornetQ的新手,我正在測試hornetQ示例。我在運行示例EmbeddedExample.java時遇到異常(駐留在:hornetq-2.2.5.Final \ examples \ core \ embedded \ src \ org \ hornetq \ core \示例中)。我在這個例子中做了一些改變,並得到Exception。我所做的改變是,我已經把發送過程和消費過程放在了一個迭代100,000次的循環中。 的代碼是:HornetQ 2.2.5嵌入式示例異常

System.out.println("Producer:"); 
System.out.println("StartDate: "+new Date()); 
for (int i = 0; i < 100000; i++) 
{ 
    message.putStringProperty(propName, "Message: " + i); 
    producer.send(message);    
} 
System.out.println("EndDate: "+new Date()); 
// Step 7. Create the message consumer and start the connection 
ClientConsumer messageConsumer = session.createConsumer(queueName); 

session.start(); 

// Step 8. Receive the message. 
System.out.println("Consumer:"); 
System.out.println("StartDate: "+new Date()); 

for (int i = 0; i < 100000; i++)    
{ 
    ClientMessage messageReceived = messageConsumer.receive(); 
    System.out.println(messageReceived.getStringProperty(propName)); 
} 
System.out.println("EndDate: "+new Date());    

監製工作正常,和消費者閱讀18K或13K msges後給我一個例外。堆棧跟蹤如下:

[java] Message: 18384 
[java] Sep 2, 2011 11:15:29 AM org.hornetq.core.logging.impl.JULLogDelegate 
info 
[java] INFO: HornetQ Server version 2.2.5.Final (HQ_2_2_5_FINAL_AS7, 121) [ 
588e32ee-d493-11e0-b759-0026b6a94d9b] stopped 
[java] HornetQException[errorCode=102 message=Consumer is closed] 
[java]  at org.hornetq.core.client.impl.ClientConsumerImpl.checkClosed(C 
lientConsumerImpl.java:811) 
[java]  at org.hornetq.core.client.impl.ClientConsumerImpl.receive(Clien 
tConsumerImpl.java:163) 
[java]  at org.hornetq.core.client.impl.ClientConsumerImpl.receive(Clien 
tConsumerImpl.java:364) 
[java]  at org.hornetq.core.example.EmbeddedExample.main(EmbeddedExample 
.java:107) 
[java] Java Result: -1 

BUILD FAILED 
C:\hornetq-2.2.5.Final\examples\core\embedded\build.xml:40: EmbeddedExample 

我該如何克服此異常?

回答

0

該示例將啓動一個只有50M的虛擬機,在您的示例中,您將發送100K條消息,但對於50M而言可能不夠。

我沒有在這裏進行修改,但是我可以運行100K的消息給出的build.xml文件。

您可能會在中斷通信並使會話關閉之前得到一些例外。

此外,信息系統是異步的,所以我建議你到你發送模塊更改爲:

for (int i = 0; i < 100000; i++) 
{ 
    message = sesison.createMessage(true); // move it 
    message.putStringProperty(propName, "Message: " + i); 
    producer.send(message);    
} 

而且你還要ACK的消費。否則,消息仍然會在內存中。

該示例的目的是展示如何嵌入HornetQ。對於其他用途,例如acking和生產,還有其他例子。

for (int i = 0; i < 100000; i++)    
{ 
    ClientMessage messageReceived = messageConsumer.receive(); 
    messageReceived.acknowledge(); 
    System.out.println(messageReceived.getStringProperty(propName)); 
} 
+0

感謝Clebert, 它在我再次啓動消費者循環中的會話時起作用。我已經嘗試過你的建議,但它不起作用,例外仍然存在。 –

+0

我需要查看完整的代碼。 –

+0

你可以在這裏看到代碼:http://stackoverflow.com/questions/7291648/how-to-make-a-queue-persisted-in-hornetq-2-2-5-core-client –