HornetQ 2.2.5嵌入示例异常

时间:2011-09-02 05:59:07

标签: jms hornetq

我是HornetQ的新手,我正在测试hornetQ的例子。我在运行示例EmbeddedExample.java时遇到异常(驻留在:hornetq-2.2.5.Final \ examples \ core \ embedded \ src \ org \ hornetq \ core \ example)。我在该示例中做了一些更改并获得了Exception。我所做的改变是,我已经将发送过程和消费过程放在1,00,000次迭代的for循环中。 代码是:

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 msge后给我一个例外。堆栈跟踪是:

[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

我如何克服此异常?

1 个答案:

答案 0 :(得分:0)

该示例将启动仅具有50M的VM,并且在您的示例中,您发送的是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);             
}

你还应该确认消费。否则消息仍将在内存中。

该示例的目的是展示如何嵌入HornetQ。对于其他用法,如acking和production,还有其他例子。

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