3

私はHornetQを初めて使用し、hornetQの例をテストしています。例EmbeddedExample.java(常駐:hornetq-2.2.5.Final \ examples \ core \ embedded \ src \ org \ hornetq \ core \ example)の実行中に例外が発生します。その例にいくつかの変更を加えて、例外を取得しました。私が行った変更は、送信プロセスと消費プロセスを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のメッセージを読んだ後に例外を表示します。スタックトレースは次のとおりです。

[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

この例外をどのように克服しますか?

4

1 に答える 1

0

この例では、50MのみでVMを起動します。この例では、100Kメッセージを送信していますが、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);             
}

また、消費についても確認する必要があります。それ以外の場合、メッセージは引き続きメモリに残ります。

この例の目的は、HornetQを埋め込む方法を示すことでした。ackingやproductionなどの他の使用法については、他の例があります。

for (int i = 0; i < 100000; i++)            
{   
    ClientMessage messageReceived = messageConsumer.receive();
    messageReceived.acknowledge();
    System.out.println(messageReceived.getStringProperty(propName));
}
于 2011-09-02T15:58:15.967 に答える