使用
生产者
@Component
@Slf4j
public class MqProducer {
@Autowired
private RedisTemplate redisTemplate;
public void send(String topic, String msg) {
log.info("topic ={}, msg = {}", topic, msg);
redisTemplate.convertAndSend(topic, msg);
}
public void send(String topic, User user) {
log.info("topic ={}, user = {}", topic, user);
send(topic, JSON.toJSONString(user));
}
}
消费者
配置
/**
* 订阅
* @author lipo
* @date 2019-11-13 11:57
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//添加多个消费者
container.addMessageListener(new MessageListenerAdapter(new MqConsumer(), "onMessage"), new PatternTopic(RedisConstant.TOPIC));
container.addMessageListener(new MessageListenerAdapter(new MqConsumer2(), "onMessage"), new PatternTopic(RedisConstant.TOPIC));
return container;
}
两个消费者
@Component("consumer")
@Slf4j
public class MqConsumer implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String msg = new String(message.getBody());
String topic = new String(message.getChannel());
String p = new String(pattern);
log.info("topic ={}, msg = {}, pattern = {}", topic, msg, p);
}
}
@Component("consumer2")
@Slf4j
public class MqConsumer2 implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String msg = new String(message.getBody());
String topic = new String(message.getChannel());
String p = new String(pattern);
log.info("topic ={}, msg = {}, pattern = {}", topic, msg, p);
User user = JSON.parseObject(msg, User.class);
log.info("user = {}", user);
}
}
测试
@RestController
@RequestMapping("mq")
public class MqController {
@Autowired
private MqProducer mqProducer;
@GetMapping("publish")
public Object publish() {
mqProducer.send(RedisConstant.TOPIC, new User(1, "lipo"));
return "ok";
}
}
结果
分布式环境
manage服务配置消费者
@Configuration
public class RedisConsumerConfig {
/**
* 订阅
* @author lipo
* @date 2019-11-13 11:57
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//添加多个消费者
container.addMessageListener(new MessageListenerAdapter(new MqConsumer(), "onMessage"), new PatternTopic(RedisConstant.TOPIC));
return container;
}
}
merchant服务也配置相同的消费者
order服务配置生产者
order发布消息时,两个消费者都能收到消费消息。
但是,如果manange重启了,消息错过了,就收不到消息了。
消息容易丢失,还是mq更好