最简单接受MQ消息的方法-annotation

一 简单定义

用一个注解就可以接受MQ了,而不用定义交换机,定义队列啥的,简简单单,一句话搞定

@Component
public class MyService {

@RabbitListener(queues = "myQueue")
public void processOrder(String data) {
    ...
}
}

二 再复杂一点

一个默认队列怎么能满足要求能,当然是要实用点的

@Component
public class MyService {
  //定义队列名称,交换机名称,以及routingkey名称
  @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "myQueue", durable = "true"),
        exchange = @Exchange(value = "auto.exch", ignoreDeclarationExceptions = "true"),
        key = "orderRoutingKey")
  )
  public void processOrder(Order order) {
    ...
  }
  
  //定义一个默认队列,监听所有的bindingkey
  @RabbitListener(bindings = @QueueBinding(
        value = @Queue,
        exchange = @Exchange(value = "auto.exch"),
        key = "invoiceRoutingKey")
  )
  public void processInvoice(Invoice invoice) {
    ...
  }
  
  //queue是个变量了,可以从配置文件中取到
  @RabbitListener(queuesToDeclare = @Queue(name = "${my.queue}", durable = "true"))
  public String handleWithSimpleDeclare(String data) {
      ...
  }  
}

我们还可以加入更多的参数,比如死信队列

@RabbitListener(
        bindings = @QueueBinding(
            value = @Queue(value = "annoQueue", durable = "true",
                    arguments = {
                        @Argument(name = "x-dead-letter-exchange", value = "dlx.exchange"),
                        @Argument(name = "x-dead-letter-routing-key", value = "dlx.routing.key")
            }),
            exchange = @Exchange(value = "annoExch", ignoreDeclarationExceptions = "true"),
            key = "annoKey"
      )
)
public void processOrder(Message msgStr, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long ta) throws Exception {
...
}

上述代码不仅定义了一个队列,并在argument中加入了死信队列,来接受失败消息
同时,我们在接受参数时 传入了 channel以及 tag, 这样可以很方便的进行消息回传了,比如: channel.baskAck(...)

三 元注解

有时候我们实在嫌写注解太麻烦了,可以定义一个元注解

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RabbitListener(bindings = @QueueBinding(
        value = @Queue,
        exchange = @Exchange(value = "metaFanout", type = ExchangeTypes.FANOUT)))
public @interface MyAnonFanoutListener {
}

public class MetaListener {

    @MyAnonFanoutListener
    public void handle1(String foo) {
        ...
    }

    @MyAnonFanoutListener
    public void handle2(String foo) {
        ...
    }

}

四 默认监听连接工厂

有一点忘记说了,你如果确实想用@RabbitListener必须在@Configuration注解加上@EnableRabbit注解,比如这样

@Configuration
@EnableRabbit
public class AppConfig {

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrentConsumers(3);
        factory.setMaxConcurrentConsumers(10);
        return factory;
    }
}

其中SimpleRabbitListenerContainerFactory是监听器的factory,如果你不指定,boot会自动生成一个出来,当然还是自己指定一个比较好。

五 连环发送

当你收到消息后想发到另一个队列该怎么办呢?可以用sendto注解

@RabbitListener(destination = "myQueue")
@SendTo("status")
public Message<OrderStatus> processOrder(Order order) {
    // order processing
    return MessageBuilder
        .withPayload(status)
        .setHeader("code", 1234)
        .build();
}







大杂烩
所学甚杂

教育皆祸害,[链接]

2k 声望
221 粉丝
0 条评论
推荐阅读
人工智能/大数据就业前景及优劣势分析
总述 职位少,要求高,人工智能落地困难,决定了就业可能会是一个大问题 全国范围内的人工智能的职位是183 而Java是10000+ (因lagou并不展示总数,因此该数据从请求分析而来) 因此岗位数量与Java大概是60倍的差距...

方老司1阅读 5.6k

rabbitmq 重启之后无法登录
遇到一个问题一个 rabbitmq server 的内存不够了,加了内存之后重启重启后发现,账号登录不上了!吓死我研究了一下,原因如下:rabbitmq sever 依赖 hostname。机器上的 hostname 没有持久化,重启之后,hostname...

ponponon阅读 846

阿里的又一款数据高效同步工具DataX,真香!
有个项目的数据量高达五千万,但是因为报表那块数据不太准确,业务库和报表库又是跨库操作,所以并不能使用 SQL 来进行同步。当时的打算是通过 mysqldump 或者存储的方式来进行同步,但是尝试后发现这些方案都不...

码猿技术专栏阅读 726

Spring 系列框架的中文文档
现在互联网上的 Spring 框架相关的中文文档基本上都是机器翻译,内容晦涩难懂且常年未更新。例如,像 spring-security 等这种概念繁多,体系复杂的技术,对于新手来说,没有优质的技术文档基本上是寸步难行。所以...

KevinBlandy阅读 590

kombu 如何判断一个 message 是否 acknowledged/requeued/rejected
直接使用 message 的 acknowledged 属性就好了 {代码...} 当我们使用 acknowledged 的时候,其实干的是下面的事情:kombu/message.py {代码...} ACK_STATES 是什么呢?kombu/message.py {代码...} 可以看到,已经...

ponponon阅读 661

监控系统选型,一篇全搞定!
这篇文章,我将对监控体系的基础知识、原理和架构做一次系统性整理,同时还会对几款最常用的开源监控产品做下介绍,以便大家选型时参考。内容包括3部分:

码猿技术专栏阅读 406

消息队列产品12月产品动态
【商业化】虚拟集群正式商业化:TDMQ RocketMQ 共享版(虚拟集群)于 2022年12月28日结束公测,正式商业化开始计费,计费方式为按量付费(后付费)。

腾讯云中间件阅读 364

教育皆祸害,[链接]

2k 声望
221 粉丝
宣传栏