中间件 消息注解 应用

  • 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;
    }
}

 





posted @ 2020-10-08 17:15  zhangtianhong511  阅读(239)  评论(0)    收藏  举报