原来都是直接用的Jedis来实习消息的发布与订阅,要写不少东西,而这次刚好开了一个SpringBoot的新项目,所以想直接使用starter中的redis来实现一下,网上搜了很多,结果发现都长的一样。。。可是都满足不了我的需求,我需要在接收到消息的时候,判断是哪一个channel发来的而调用对应的方法,下面来看一下具体的使用方法。
首先我们需要创建两个Bean,一个用来订阅频道,一个用来调用消息接收的方法
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// 订阅频道
container.addMessageListener(listenerAdapter, new PatternTopic("course_lesson_report"));
container.addMessageListener(listenerAdapter, new PatternTopic("course_phase_report"));
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
下面看一下传入的MessageReceiver
@Component
@Slf4j
public class MessageReceiver {
public void receiveMessage(String message, String channel) {
log.info(channel + " 收到消息: " + message);
}
}
经过尝试,发现第一个参数是消息内容,第二个参数是channel。
下面写一个单元测试测试一下
@RunWith(SpringRunner.class)
@ActiveProfiles("dev")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class BaseTest {
@Resource(name = "stringRedisTemplate")
private StringRedisTemplate redisTemplate;
@Test
public void test() throws InterruptedException {
redisTemplate.convertAndSend("course_lesson_report", "测试");
Thread.sleep(100);
}
}
结果
网友评论