rabbitmq的确认机制以及实验

直连模式下 默认的确认机制 (是自动确认)。 

生产者:

消费者:

每次消费等待2s

结果:

2020-12-28:15:43:31.493 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:0
消费者:0
2020-12-28:15:43:33.493 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:1
消费者:1
2020-12-28:15:43:35.495 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:2
消费者:2
2020-12-28:15:43:37.496 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:3
消费者:3
2020-12-28:15:43:39.496 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:4
消费者:4
2020-12-28:15:43:41.497 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:5
消费者:5
2020-12-28:15:43:43.498 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:6
消费者:6
2020-12-28:15:43:45.499 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:7
消费者:7
2020-12-28:15:43:47.500 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:8
消费者:8
2020-12-28:15:43:49.500 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:9
消费者:9

结论: 消费者一个监听是按照顺序消费的。

二:两个监听监听一个队列

结果:

2020-12-28:15:46:29.623 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:0
2020-12-28:15:46:29.623 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest2,124] - exchangeScanLog receive message:1
消费者2:1
消费者1:0
2020-12-28:15:46:31.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest2,124] - exchangeScanLog receive message:3
2020-12-28:15:46:31.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:2
消费者1:2
消费者2:3
2020-12-28:15:46:33.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:4
2020-12-28:15:46:33.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest2,124] - exchangeScanLog receive message:5
消费者1:4
消费者2:5
2020-12-28:15:46:35.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:6
2020-12-28:15:46:35.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest2,124] - exchangeScanLog receive message:7
消费者1:6
消费者2:7
2020-12-28:15:46:37.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest2,124] - exchangeScanLog receive message:9
2020-12-28:15:46:37.624 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:8
消费者2:9
消费者1:8

结论:两个监听无法保证队列的顺序,这里猜测是队列直接将消息发送多个给不同的监听。 轮循发送给两个监听

三.单监听如果出现异常(这里只网mq中发送三个消息 012)

结果:

2020-12-28:16:04:58.389 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:16:05:00.390 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:00.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:1
消费者1:1
2020-12-28:16:05:02.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:02.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:2
消费者1:2
2020-12-28:16:05:04.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:04.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:16:05:06.395 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:06.396 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:1
消费者1:1
2020-12-28:16:05:08.397 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:08.397 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,112] - exchangeScanLog receive message:2
消费者1:2
2020-12-28:16:05:10.398 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] WARN  o.s.a.r.l.ConditionalRejectingErrorHandler - [log,117] - Execution of Rabbit message listener failed.
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(java.lang.String) throws java.lang.Exception' threw exception
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:204)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:129)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1542)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1468)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer$$Lambda$859/2139332293.invokeListener(Unknown Source)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1456)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1451)
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1400)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137)
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.Exception: 错误
	at com.chinatower.energy.rabbitmq.consumer.ExchangeProcessConsumer.receiveExchangeTest(ExchangeProcessConsumer.java:116)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171)
	at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120)
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:50)
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:196)
	... 13 common frames omitted
2020-12-28:16:05:10.399 

结论: 如果消费者抛出异常则mq会将信息重新发送, 此时在mq后台看到消息处于unacked的状态,这里是否将未发送成功的消息放到了队尾不确定感觉不是因为队列一直是空的。 

如若处理过程中出现异常,而没有回复ack 应答。通过后台就会看到有 unacked 的数据。

手动确认模式

listener:

simple:

acknowledge-mode: manual

代码

结论

开启手动模式后 消费者不进行确认 则消息会进入unacked 并且不会重发,重启监听者 则消息重新read。

二. 确认接收消息

 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

需要注意的 basicAck 方法需要传递两个参数:

  • deliveryTag(唯一标识 ID):当一个消费者向 RabbitMQ 注册后,会建立起一个 Channel ,RabbitMQ 会用 basic.deliver 方法向消费者推送消息,这个方法携带了一个 delivery tag, 它代表了 RabbitMQ 向该 Channel 投递的这条消息的唯一标识 ID,是一个单调递增的正整数,delivery tag 的范围仅限于 Channel
  • multiple:为了减少网络流量,手动确认可以被批处理,当该参数为 true 时,则可以一次性确认 delivery_tag 小于等于传入值的所有消

结论:

消费一切正常。

三。手动拒绝消息

 channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
deliveryTag:该消息的index
multiple:是否批量.true:将一次性拒绝所有小于deliveryTag的消息。
requeue:被拒绝的是否重新入队列

结果:

2020-12-28:16:54:23.748 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:16:54:25.749 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:1
消费者1:1
2020-12-28:16:54:27.750 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:2
消费者1:2
2020-12-28:16:54:29.751 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:16:54:31.752 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:1
消费者1:1
2020-12-28:16:54:33.753 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:2
消费者1:2

结论:被拒绝的消息会循环发送。(但是这是在mq发送多个消息的时候)

channel.basicNack 与 channel.basicReject 的区别在于basicNack可以拒绝多条消息,而basicReject一次只能拒绝一条消息

设置消费端最大的unacked 数目为1

listener:
      simple:
        prefetch: 1 
prefetch允许为每个consumer指定最大的unacked messages数目。简单来说就是用来指定一个consumer一次可以从Rabbit中获取多少条message并缓存在client中(RabbitMQ提供的各种语言的client library)。一旦缓冲区满了,Rabbit将会停止投递新的message到该consumer中直到它发出ack。

假设prefetch值设为10,共有两个consumer。意味着每个consumer每次会从queue中预抓取 10 条消息到本地缓存着等待消费。同时该channel的unacked数变为20。而Rabbit投递的顺序是,先为consumer1投递满10个message,再往consumer2投递10个message。如果这时有新message需要投递,先判断channel的unacked数是否等于20,如果是则不会将消息投递到consumer中,message继续呆在queue中。之后其中consumer对一条消息进行ack,unacked此时等于19,Rabbit就判断哪个consumer的unacked少于10,就投递到哪个consumer中。

总的来说,consumer负责不断处理消息,不断ack,然后只要unacked数少于prefetch * consumer数目,broker就不断将消息投递过去。

这里需要注意的是,spring-amqp2.0版本以后中的prefetch默认值是250。可以解释上面的默认unacked最多250条

结果

2020-12-28:17:32:09.004 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:17:32:11.066 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:17:32:13.129 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0
2020-12-28:17:32:15.188 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] INFO  c.c.e.r.c.ExchangeProcessConsumer - [receiveExchangeTest,115] - exchangeScanLog receive message:0
消费者1:0

结论:

当prefetch设置为1的时候,如果消费者没有响应则mq会一直重试,并且阻塞队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值