最简单接受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();
}
大杂烩
所学甚杂
推荐阅读
人工智能/大数据就业前景及优劣势分析
总述 职位少,要求高,人工智能落地困难,决定了就业可能会是一个大问题 全国范围内的人工智能的职位是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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。