2011-09-02 2 views
3

저는 HornetQ를 처음 사용하고 hornetQ 예제를 테스트하고 있습니다. EmbeddedExample.java 예제를 실행하는 동안 예외가 발생합니다 (hornetq-2.2.5.Final \ examples \ core \ embedded \ src \ org \ hornetq \ core \ example에 있습니다). 나는 그 예제에서 약간의 변화를 만들고 Exception을 얻었습니다. 내가 변경 한 사항은 프로세스 및 소비 프로세스를 for 루프에 1,00,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

이 예에서는 VM이 ​​50M 만 시작되며, 예에서는 100,000 개의 메시지를 보내고 있지만 50M에는 충분하지 않을 수 있습니다.

여기에 변경 사항이 없지만 build.xml에 더 많은 메모리를 제공하면서 주어진 100K 메시지로 예제를 실행할 수 있습니다.

통신을 중단하기 전에 몇 가지 예외가 발생하여 세션을 닫을 수 있습니다.

또한, 메시지 시스템은 비동기, 그래서 나는 당신이 당신의 전송 블록을 변경하는 제안 :

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 –