带有通用命令过滤器的 mykey 的 Redis Spring Data 消息监听器

问题描述 投票:0回答:1

我正在尝试在 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")));
java spring spring-boot redis spring-data-redis
1个回答
0
投票

我明白你在这里缺少什么......你不能直接过滤模式字符串中的命令类型,而是必须捕获所有事件,然后根据你的需要在“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”方法中的事件的方法。

我希望我说清楚了并增加了一些价值。 祝您的编码冒险之旅好运!

© www.soinside.com 2019 - 2024. All rights reserved.