我正在尝试在 Redis Spring 数据监听器中为我的密钥添加特定模式,但它不起作用。如何实现仅针对特定命令的监听器?下面是我的消息侦听器容器:
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(
RedisConnectionFactory connectionFactory,
MyMessageListener myMessageListener) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
listenerContainer.addMessageListener(myMessageListener,
new PatternTopic("__keyspace@*__:SampleProj:Message:*"));
return listenerContainer;
}
上面的模式工作正常,我可以获取
messageListener
类中的所有事件消息,例如所有事件:del、hset 等。现在我需要获取 mykey 的唯一 hset 事件,并且我按照中提到的命令进行操作文档并没有成功。以下是我尝试过的模式:
new PatternTopic("__keyevent*:hset SampleProj:Message:*")
new PatternTopic("__keyevent@*__:hset:SampleProj:Message:*"));
new PatternTopic("__keyevent@*__:hset SampleProj:Message:*"));
即使有组合列表:
Arrays.asList(new PatternTopic("__keyevent@*__:hset SampleProj:Message:"),
new PatternTopic("__keyspace@*__:SampleProj:Message:* hset")));
我明白你在这里缺少什么......你不能直接过滤模式字符串中的命令类型,而是必须捕获所有事件,然后根据你的需要在“MyMessageListener”实现中进行过滤。
这是实现它的方法。
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(
RedisConnectionFactory connectionFactory,
MyMessageListener myMessageListener) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
// Listen to all key events
PatternTopic patternTopic = new PatternTopic("__keyevent@*__:*");
listenerContainer.addMessageListener(myMessageListener, patternTopic);
return listenerContainer;
}
正如您在这里看到的,我们正在监听所有关键事件。现在在“MyMessageListener”中,我们将执行过滤部分,如下所示。
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String channel = new String(message.getChannel());
String key = new String(message.getBody());
if (channel.startsWith("__keyevent@") && channel.endsWith("__:hset")) {
// Handle hset event for your key
System.out.println("Received hset event for key: " + key);
}
// Handle other cases if needed
}
}
这是您可以根据通道名称过滤“onMessage”方法中的事件的方法。
我希望我说清楚了并增加了一些价值。 祝您的编码冒险之旅好运!