发布订阅模式首先需要消息源,也就是要有消息发布出来,然后订阅者就可以收到这个消息进行处理了,观察者模式就是这个模式的典型应用了。如下图记账系统就是消息源,短信,邮件,微信模块就是订阅者了.
redis发布订阅的使用
1)订阅者订阅消息
2)发布者发布消息
3)订阅者获取消息
如下图:
在Java中的使用
1)消息监听类(订阅者)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
public class RedisMessageListener implements MessageListener {
@Autowired
private RedisTemplate redisTemplate;
@Override
public void onMessage(Message message, byte[] bytes) {
//获取消息
byte[] body = message.getBody();
//使用值序列化器转换
String msgBody = (String) redisTemplate.getValueSerializer().deserialize(body);
System.out.println(msgBody);
//获取channel
byte[] channel = message.getChannel();
//使用字符串序列化器转换
String channelStr = (String) redisTemplate.getStringSerializer().deserialize(channel);
System.out.println(channelStr);
//渠道名称转换
String byteStr = new String(bytes);
System.out.println(byteStr);
}
}
2)xml文件配置
<bean id="redisMessageListener" class="com.musi.listener.RedisMessageListener"/>
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
<!--Redis连接工厂-->
<property name="connectionFactory" ref="connectionFactory"/>
<!--连接池,这里只要线程池生存,才能继续监听-->
<property name="taskExecutor">
<bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="3"></property>
</bean>
</property>
<!--消息监听Map-->
<property name="messageListeners">
<map>
<!--配置监听者,key-ref和bean id定义一致-->
<entry key-ref="redisMessageListener">
<bean class="org.springframework.data.redis.listener.ChannelTopic">
<constructor-arg value="chat"/>
</bean>
</entry>
</map>
</property>
</bean>
3)发布消息
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
String channel = "chat";
redisTemplate.convertAndSend(channel,"I am lazy");