一、問題描述
SpringBoot項目集成AvtiveMQ,作為消息消費者。如果在消費消息的方法中,拋出異常,會產生什么效果?
二、ActiveMQ異常處理機制(AI問答僅供參考)
在Spring Boot項目集成ActiveMQ作為消息消費者時,若消費方法拋出異常,其效果主要取決于消息監聽容器的配置及ActiveMQ的重試策略。以下是具體的影響和機制:
1. 默認行為(無事務配置)
- 消息重試:若未捕獲異常,消息會被重新投遞。ActiveMQ默認的
RedeliveryPolicy
允許最多6次重試(可通過配置調整)。每次重試間隔由redeliveryDelay
決定(默認為1秒)。 - 死信隊列(DLQ):超過最大重試次數后,消息會被移至死信隊列(默認名稱:
ActiveMQ.DLQ
),避免無限循環。若未配置DLQ,消息可能被丟棄或無限重試(取決于具體配置)。
2. 事務配置的影響
- 開啟事務(
sessionTransacted=true
):若消費方法拋出異常,事務會回滾,消息重新入隊,觸發重試邏輯。同樣受ActiveMQ的RedeliveryPolicy
限制。 - 外部事務管理器:若使用如
JmsTransactionManager
,異常同樣觸發回滾,消息未被確認,重新投遞。
3. 確認模式(Acknowledge Mode)
- 自動確認(AUTO_ACKNOWLEDGE):僅在方法成功執行后確認消息。若拋出異常,消息未被確認,觸發重試。默認情況下,Spring Boot使用
auto-acknowledge
模式。這意味著:如果消費者成功處理消息(未拋出異常),消息會被自動確認并從隊列中移除。 - 客戶端確認(CLIENT_ACKNOWLEDGE):需手動調用
message.acknowledge()
。若未確認,消息重新投遞。
4. 自定義錯誤處理
- 實現
ErrorHandler
:可捕獲異常并自定義邏輯(如記錄日志、轉發到特定隊列)。 - 重試策略調整:通過ActiveMQ的
RedeliveryPolicy
配置最大重試次數、重試間隔等。
5. 消息冪等性
- 重復消費風險:因消息可能多次投遞,消費者需設計為冪等(如通過唯一ID去重),避免重復處理。
示例配置調整
- ActiveMQ重試策略(在
application.properties
):spring.activemq.redeliveryPolicy.maximumRedeliveries=3 spring.activemq.redeliveryPolicy.initialRedeliveryDelay=5000
- Spring事務配置:
@Bean public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setSessionTransacted(true); // 開啟事務return factory; }
總結
- 異常導致重試:消息會重新入隊,直到達到最大重試次數。
- 死信隊列:超過重試次數后,消息進入DLQ,需后續處理。
- 配置關鍵點:事務、確認模式、重試策略共同決定異常處理邏輯。
- 最佳實踐:結合事務管理、合理設置重試策略,并確保消費邏輯冪等。
通過合理配置,可有效管理異常場景,避免消息丟失或無限循環,保障消息系統的可靠性。
三、測試實例
項目依賴、環境配置與核心代碼
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version><relativePath/></parent><groupId>com.example</groupId><artifactId>hello-activemq</artifactId><version>0.0.1-SNAPSHOT</version><name>hello-activemq</name><description>Demo project for Spring Boot</description><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
YAML
spring:application:name: hello-activemqactive-mq:broker-url: tcp://localhost:61616user: adminpassword: admin
Application
package com.example.hello.activemq;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class HelloActivemqApplication {public static void main(String[] args) {SpringApplication.run(HelloActivemqApplication.class, args);}}
創建消息監聽器
創建一個監聽器類,使用@JmsListener
注解監聽隊列,模擬特定條件下拋出異常。
package com.example.hello.activemq.consumer;import com.example.hello.activemq.model.CalculationTaskMessage;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;import java.time.LocalDate;/*** 計算任務消費者*/
@Slf4j
@Component
@RequiredArgsConstructor
public class CalculationTaskQueueConsumer {private final ObjectMapper objectMapper;@JmsListener(destination = "calculation-task-queue")private void receive(String message) throws JsonProcessingException {log.info("計算任務隊列消費者,接收消息: {}", message);CalculationTaskMessage calculationTaskMessage = objectMapper.readValue(message, CalculationTaskMessage.class);log.info("計算任務隊列消費者,解析消息對象: {}", calculationTaskMessage);// 模擬特定條件下拋出異常LocalDate localDate = LocalDate.of(2025, 1, 1);if (localDate.equals(calculationTaskMessage.getDate())) {log.info("計算日期為非交易日(元旦),計算日期:{}", localDate);throw new RuntimeException("計算日期為非交易日(元旦)");}log.info("計算任務隊列消費者,消息處理完成");}}
實體類
package com.example.hello.activemq.model;import lombok.Data;import java.time.LocalDate;/*** 計算任務消息*/
@Data
public class CalculationTaskMessage {/*** 任務主鍵*/private Integer id;/*** 任務編號*/private String taskCode;/*** 任務名稱*/private String taskName;/*** 計算賬號*/private String account;/*** 計算日期*/private LocalDate date;}
運行效果
發送消息(模擬特定條件下拋出異常)
通過ActiveMQ控制臺發送消息
JSON字符串
{"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
拋出異常會重試多次(默認6次)
消息重試:若未捕獲異常,消息會被重新投遞。
2025-04-09T00:07:48.640+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:49.008+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:49.010+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:49.065+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:50.067+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:50.068+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:50.069+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:50.087+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:51.087+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:51.088+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:51.089+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:51.103+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:52.106+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:52.107+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:52.108+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:52.146+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:53.147+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:53.148+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:53.149+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:53.179+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:54.179+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:54.180+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:54.181+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:54.196+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted2025-04-09T00:07:55.197+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,接收消息: {"id": 1,"taskCode": "123456-20250101-20250408013653","taskName": "計算任務-123456-20250101-20250408013653","account": "123456","date": "2025-01-01"
}
2025-04-09T00:07:55.198+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算任務隊列消費者,解析消息對象: CalculationTaskMessage(id=1, taskCode=123456-20250101-20250408013653, taskName=計算任務-123456-20250101-20250408013653, account=123456, date=2025-01-01)
2025-04-09T00:07:55.198+08:00 INFO 9392 --- [hello-activemq] [ntContainer#0-1] c.e.h.a.c.CalculationTaskQueueConsumer : 計算日期為非交易日(元旦),計算日期:2025-01-01
2025-04-09T00:07:55.254+08:00 WARN 9392 --- [hello-activemq] [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.org.springframework.jms.listener.adapter.ListenerExecutionFailedException: Listener method 'private void com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(java.lang.String) throws com.fasterxml.jackson.core.JsonProcessingException' threw exceptionat org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:118) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:84) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:790) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:747) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:725) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:333) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1420) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1410) ~[spring-jms-6.2.5.jar:6.2.5]at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1287) ~[spring-jms-6.2.5.jar:6.2.5]at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.RuntimeException: 計算日期為非交易日(元旦)at com.example.hello.activemq.consumer.CalculationTaskQueueConsumer.receive(CalculationTaskQueueConsumer.java:34) ~[classes/:na]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-6.2.5.jar:6.2.5]at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:110) ~[spring-jms-6.2.5.jar:6.2.5]... 10 common frames omitted