0

ドキュメントによるとRedisMessageListnerContainer-

public void addMessageListener(MessageListener リスナー、トピックトピック) :

(潜在的に実行中の) コンテナーにメッセージ リスナーを追加します。コンテナーが実行中の場合、リスナーはできるだけ早くメッセージの受信 (マッチング) を開始します。

上記の引用は、リスナーの準備ができているかどうか、またはサブスクリプションがまったく成功しているかどうかを知る実際の方法がないことを示しているようです。

では、チャンネルを公開してサブスクライブした場合、公開を開始できるようになるまでどのくらい待つ必要がありますか? 私のテストでは、単純に実行します

container.addMessageListener(listener, topic);
for(int i = 0; i < 10; i++) {
   template.publish(topic, content);
}

私自身が公開した最初の 3 ~ 5 件のメッセージを受信して​​いないことを意味します。

に頼らずにこれを回避するにはどうすればよいThread.sleep()ですか? 接続の失敗/成功などについて通知を受けることは可能ですか?

4

1 に答える 1

0

Bean の初期化中にダミーのトピックをリッスンするように MessageListener Bean を設定すると、トピックにサブスクライブしてすぐに発行するとメッセージが失われるという問題がありました。

@Bean
ChannelTopic channelTopic() {
    return new ChannelTopic(UUID.randomUUID().toString());
}

@Bean
RedisMessageListenerContainer redisContainer(JedisConnectionFactory jedisConnectionFactory) {
    final RedisMessageListenerContainer redisContainer = new MessageListenerContainerAdapter();
    redisContainer.setConnectionFactory(jedisConnectionFactory);
    redisContainer.addMessageListener(messageListenerAdapter(messageReceiveQueue()), channelTopic());
    return redisContainer;
}

新しいトピックをサブスクライブして、すぐに発行できるようになりました。

于 2015-08-31T07:24:04.753 に答える