java使用redis做发布订阅

需要修改redis配置文件notify-keyspace-events Ex

#  The "notify-keyspace-events" takes as argument a string that is composed
#  of zero or multiple characters. The empty string means that notifications
#  are disabled.
#
#  Example: to enable list and generic events, from the point of view of the
#           event name, use:
#
#  notify-keyspace-events Elg
#
#  Example 2: to get the stream of the expired keys subscribing to channel
#             name __keyevent@0__:expired use:
#
#  notify-keyspace-events Ex
#
#  By default all notifications are disabled because most users don't need
#  this feature and the feature has some overhead. Note that if you don't
#  specify at least one of K or E, no events will be delivered.
notify-keyspace-events Ex

配置文件:

package net.rdd.config;

import net.rdd.listener.RddMessageListener;
import net.rdd.mq.MessageReceiver;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.stereotype.Controller;

/**
 * Created by 东东 on 2018/11/18.
 */
@Configuration
public class RedisMqConfig {

    /**
     * redis消息监听器容器
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter,RddMessageListener rddMessageListener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅了test的通道
        //可以多个
        container.addMessageListener(listenerAdapter, new PatternTopic("test"));
//        container.addMessageListener(listenerAdapter, new PatternTopic("test"));
        container.addMessageListener(rddMessageListener, new PatternTopic("test"));

        return container;
    }

    /**
     * 消息监听器适配器
     * @param receiver
     * @return
     */
      @Bean
    MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        //这里可以指定方法,也可以不指定方法,重写onMessage方法,如果指定了方法,则按指定的方法执行,如果没有则或执行onMessage方法.
        //这里跟监听redis key过期那差不多,参见我博客里面有
//        return new MessageListenerAdapter(receiver,"receiveMessage");

        return new MessageListenerAdapter(receiver);
    }

    @Bean
    MessageListenerAdapter rddlistenerAdapter(RddMessageListener receiver) {
        return new MessageListenerAdapter(receiver, "onMessage");
    }


}

监听器:

package net.rdd.listener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

@Component
public class RddMessageListener extends MessageListenerAdapter {
//public class RedisMessageListener implements MessageListener {

    private final Logger log = LoggerFactory.getLogger(getClass());

	private final RedisSerializer<String> stringSerializer = new StringRedisSerializer();
	
	@Override
	//key过期会执行这个方法
	public void onMessage(Message message, byte[] pattern) {

		String key = stringSerializer.deserialize(message.getBody());

		System.out.println("RddMessageListener"+key);

	}


}

具体发送,通过注入StringRedisTemplate,test是topic,可以设置多个:

   stringRedisTemplate.convertAndSend("test","");

参考:https://blog.csdn.net/u012995888/article/details/79377512
自己整理的源码:https://github.com/stackXu/SpringBootRedis

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值