中间件 消息注解 应用
- 1 rabbitMQ
@RabbitListener 注解来指定某方法作为消息消费的方法,例如监听某 Queue 里面的消息
接收一:
@RabbitListener(queues = "debug")
public void processMessage1(Message bytes) { System.out.println(new String(bytes));
log.info("MqReceiver: {}", message); }
接收二:自动创建队列
@RabbitListener(queuesToDeclare = @Queue(RabbitConstants.CARDCALL_ALARM)) public void receiveCardCallAlarm(String message) { websocketHandler.cardCallAlarmHandler(message); }
接收三:自动创建队列+Exchange和Queues绑定
@Slf4j @Component public class MqReceiver { @RabbitListener(bindings = @QueueBinding(value = @Queue("spoon-queues"),exchange = @Exchange("spoon-exchange") )) public void process(String message) { log.info("MqReceiver: {}", message); } }
@RabbitListener 可以标注在类上面,需配合 @RabbitHandler 注解一起使用,表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,具体使用哪个方法处理,根据 MessageConverter 转换后的参数类型
发送消息:
/* 发送MQ消息 */ @SpringBootTest class RabbitMqTestApplicationTests { @Autowired private AmqpTemplate amqpTemplate; @Test void contextLoads() { amqpTemplate.convertAndSend("spoon-queues", "now : " + new Date()); } }
- 2 kafka
https://www.cnblogs.com/HendSame-JMZ/p/12987559.html?utm_source=tuicool&utm_medium=referral
分布式的发布订阅式的消息系统
使用ConsumerRecord类接收有一定的好处,ConsumerRecord类里面包含分区信息、消息头、消息体等内容,如果业务需要获取这些参数时,使用ConsumerRecord会是个不错的选择。如果使用具体的类型接收消息体则更加方便,比如说用String类型去接收消息体。
@KafkaListener
@KafkaListener(topics = {"mine_localexac_struct_arrange"},groupId = "event_calc")
public void listen(ConsumerRecord<?, ?> record) {
// 消费到数据后的处理逻辑
Optional<?> messageKey = Optional.ofNullable(record.key());
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
..... }
- 3 redis
接收消息
public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { //消息 Object value = stringRedisTemplate.getValueSerializer().deserialize(message.getBody()); String topic = new String(pattern); Gson gson = new Gson(); MessageCommand command; String expiredKey = message.toString(); System.out.println(expiredKey); if(CurDataConstants.expired.equals(expiredKey.substring(0,7))){ MessageCommand commandExp = new MessageCommand(); commandExp.setExpiredKey(expiredKey); commandExp.setDataType(expiredKey.substring(0,7)); execDispatch(commandExp); } }
发送消息:
redisUtils.sendTopic("broadcastAlarm",JSON.toJSONString(resultMap));
@Component(value = "redisUtils") public class RedisUtils { @Autowired private StringRedisTemplate redisTemplate; public boolean sendTopic(String topic,String msg){ redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(RedisSerializer.string()); redisTemplate.convertAndSend(topic,msg); return true; } }

浙公网安备 33010602011771号