恒久サブスクライバを持つトピックがあります。メッセージを公開して消費することはできますが、トピックからメッセージを読むのには少し時間がかかることがわかります。JMSからメッセージを消費している間に遅延が発生するトピック
1回の呼び出しでメッセージを読み取ることができません。メッセージを読むためにメソッドを複数回呼び出す必要があります。私は何か不足していますか?
private void publishMessage() {
TopicConnection topicConnection = null;
TopicSession topicSession = null;
TopicPublisher topicPublisher = null;
try {
topicConnection = connectionFactory.createTopicConnection();
topicSession = topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
Topic topicName= topicSession.createTopic(topicName);
topicPublisher = topicSession.createPublisher(topicName);
ObjectMessage message = topicSession.createObjectMessage(customObject)
message.setStringProperty("user", userProperty);
topicPublisher.publish(message, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, timeToLive);
} catch (JMSException e) {
throw new RuntimeException("Error Sending UMessage", e);
} finally {
closeConnections(null, topicPublisher, topicSession, topicConnection);
}
}
public void consumeMessages(String userId, int maxResults) {
TopicConnection topicConnection = null;
TopicSession topicSession = null;
TopicSubscriber topicSubscriber = null;
try {
topicConnection = connectionFactory.createTopicConnection("guest","guest");
topicConnection.setClientID("topic");
topicSession = topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
Topic topicName= topicSession.createTopic(topicName);
topicSubscriber = topicSession.createDurableSubscriber(topicName, "subscriptionname", String.format("user = '%s'", userName), false);
topicConnection.start();
Message msg = null;
do {
msg = topicSubscriber.receiveNoWait();
if (msg instanceof ObjectMessage) {
ObjectMessage om = (ObjectMessage) msg;
else {
log.error(String.format(" %s", om.getObject().getClass().getSimpleName()));
}
} else if (msg != null) {
log.error(String.format("e %s", msg.getClass().getSimpleName()));
}
} while (msg != null && out.size() <= maxResults);
} catch (JMSException e) {
throw new RuntimeException("Error retrieving User Messages", e);
} finally {
closeConnections(topicSubscriber, null, topicSession, topicConnection);
}
return out;
}
はい、私はサブスクライバのすべての利用可能なメッセージを取得したい。これは、指定された数のメッセージに対してループする理由です。それはすべてのメッセージを読んでいますが、出版直後ではありません.5〜6分かかります。デバッグモードでjbossを実行すると、私は奇妙な動作を観察しました。ブレークポイントがあるとすぐにメッセージを読み込んでいます。しかし、通常モードで実行すると、読み込むのに時間がかかります。 – John
JBossについて言及して以来、私はあなたがJMSプロバイダとしてアプリケーションサーバの内部でJBoss Messagingを使用していると仮定していますか? – gregwhitaker
はい、そうです。 JBossが提供するJMSサーバを使用しています。私は設定がありませんか? – John