写在前面:前几天项目中实现了redis的发布订阅功能,才没两天居然忘得差不多了,赶紧整理记录一下!
环境
jdk1.8
tomcat8
IDEA
!默认大家已经集成了redis,redis相关配置就不说了。
发送消息的PubServiceImpl.java
@Service
public class PubServiceImpl implements PubService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private ChannelTopic channelTopic;
public void Publisher(String message) {
stringRedisTemplate.convertAndSend(channelTopic.getTopic(), message);
}
}
接受消息的SubServiceImpl.java
@Service
public class SubServiceImpl implements SubService {
// @Autowired
// private ChannelTopic channelTopic;
@Override
public void onMessage(Message message, byte[] pattern) {
//System.out.println("------channelTopic-------" + channelTopic.getTopic());
String s = message.toString();
String xiaoxi = "";
String channel = "";
String[] split = s.split(":");
if(split!=null&&split.length==2){
channel=split[0];
xiaoxi=split[1];
}
// System.out.println(channel+","+xiaoxi);
//收到消息之后可以去做你想做的事
}
}
xml配置
<!-- Channel设置 -->
<bean id="channelTopic" class="org.springframework.data.redis.listener.ChannelTopic">
<constructor-arg value="user:topic" />
</bean>
<bean id="topicMessageListener" class="sy3.socket.service.impl.SubServiceImpl">
</bean>
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<property name="messageListeners">
<map>
<entry key-ref="topicMessageListener">
<ref bean="channelTopic" />
</entry>
</map>
</property>
</bean>
使用过程中可能会出现消息频道无法注入的情况,这个时候就需要一个扫包的配置
<!-- 自动扫描dao和service包(自动注入) -->
<context:component-scan base-package="你的service所在的目录" />
我们还需要给redis发布订阅配置一个stringRedisTemplate
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
</bean>
stringRedisTemplate和redisTemplate的区别自行百度
使用
使用就很简单了只要需要的地方注入pubService
pubService.Publisher(“需要发送的消息”);
即可在subService中的Onmessage方法接收到消息。
- 这篇写的很仓促,质量很差,如果有什么问题,看到的可以麻烦指出来,哈哈。
- 刚写博客很多地方有不足的地,将就着看吧先,会慢慢改进的。
其实就是菜= =