大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
银行卡消费的时候,银行往往会通过微信、短信或邮件通知用户交易的详细信息,这便是发布订阅模式。
我们可以使用下面的命令进行模拟
先打开一个客户端1,输入命令
SUBSCRIBE chat
表示客户端1订阅一个名为chat的渠道,之后打开客户端2,输入命令
publish chat "Hello World!"
在Spring中,我们自定义接收消息的类,需要实现MessageListener接口,并实现接口定义的方法onMessage,代码如下。
public class RedisMessageListener implements MessageListener {
@SuppressWarnings("rawtypes")
private RedisTemplate rt;
@SuppressWarnings("rawtypes")
public RedisTemplate getRt() {
return rt;
}
@SuppressWarnings("rawtypes")
public void setRt(RedisTemplate rt) {
this.rt = rt;
}
@Override
public void onMessage(Message message, byte[] pattern) {
// 获取消息
byte[] body = message.getBody();
// 使用值序列化器转换
String msgBody = (String)getRt().getValueSerializer().deserialize(body);
System.out.println(msgBody);
// 获取channel
byte[] channel = message.getChannel();
// 使用字符串序列化器转换
String channelStr = (String)getRt().getStringSerializer().deserialize(channel);
System.out.println(channelStr);
// 渠道名称转换
String bytesStr = new String(pattern);
System.out.println(bytesStr);
}
}
这里我们没有使用注解,所以要去spring.xml中注册bean
实例化监听类之后还不行,还得给一个监听容器,在Spring中对应的类为RedisMessageListenerContainer,它可以用来监听Redis的发布订阅消息。同样在Spring.xml中进行配置
这里配置了线程池,这个线程池将会持续的生存以等待消息传入,而这里配置了容器用id为redisMsgListener的Bean进行渠道chat的监听。当消息通过渠道chat方法的时候,就会使用id为redisMsgListener的Bean处理消息。
下面进行测试
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
RedisTemplate rt = applicationContext.getBean(RedisTemplate.class);
String channel = "chat";
// 向渠道chat发送消息
rt.convertAndSend(channel, "Hello World!");
}
convertAndSend方法就是向指定的渠道发送消息。
输出
Hello World!
chat
chat
本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,希望对想成为架构师的朋友有一定的参考和帮助
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。