SpringBoot集成ActiveMQ异常处理机制:若未捕获异常,消息会被重新投递

一、问题描述

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):

    properties 复制代码
    spring.activemq.redeliveryPolicy.maximumRedeliveries=3
    spring.activemq.redeliveryPolicy.initialRedeliveryDelay=5000
  • Spring事务配置

    java 复制代码
    @Bean
    public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setSessionTransacted(true); // 开启事务
        return factory;
    }

总结

  • 异常导致重试:消息会重新入队,直到达到最大重试次数。
  • 死信队列:超过重试次数后,消息进入DLQ,需后续处理。
  • 配置关键点:事务、确认模式、重试策略共同决定异常处理逻辑。
  • 最佳实践:结合事务管理、合理设置重试策略,并确保消费逻辑幂等。

通过合理配置,可有效管理异常场景,避免消息丢失或无限循环,保障消息系统的可靠性。

三、测试实例

项目依赖、环境配置与核心代码

POM

xml 复制代码
<?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

yaml 复制代码
spring:
  application:
    name: hello-activemq
  active-mq:
    broker-url: tcp://localhost:61616
    user: admin
    password: admin

Application

java 复制代码
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注解监听队列,模拟特定条件下抛出异常。

java 复制代码
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("计算任务队列消费者,消息处理完成");
    }

}

实体类

java 复制代码
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字符串
json 复制代码
{
  "id": 1,
  "taskCode": "123456-20250101-20250408013653",
  "taskName": "计算任务-123456-20250101-20250408013653",
  "account": "123456",
  "date": "2025-01-01"
}

抛出异常会重试多次(默认6次)

消息重试:若未捕获异常,消息会被重新投递。

log 复制代码
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 exception
	at 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

2025-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 exception
	at 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

2025-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 exception
	at 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

2025-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 exception
	at 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

2025-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 exception
	at 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

2025-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 exception
	at 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

2025-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 exception
	at 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

ActiveMQ控制台队列页面

初始状态
抛出异常会重试多次后
相关推荐
老李不敲代码10 分钟前
榕壹云搭子系统技术解析:基于Spring Boot+MySQL+UniApp的同城社交平台开发实践
spring boot·mysql·微信小程序·uni-app·软件需求
养军博客1 小时前
spring boot3.0自定义校验注解:文章状态校验示例
java·前端·spring boot
小赵面校招2 小时前
Spring Boot整合MyBatis全攻略:原理剖析与最佳实践
java·spring boot·mybatis
曼岛_2 小时前
[Java实战]Spring Boot 3 整合 Ehcache 3(十九)
java·spring boot·spring
意倾城2 小时前
Spring Boot 配置文件敏感信息加密:Jasypt 实战
java·spring boot·后端
曼岛_2 小时前
[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)
java·spring boot·apache
火皇4052 小时前
Spring Boot 使用 OSHI 实现系统运行状态监控接口
java·spring boot·后端
小赵面校招2 小时前
SpringBoot整合MyBatis-Plus:零XML实现高效CRUD
xml·spring boot·mybatis
不再幻想,脚踏实地2 小时前
Spring Boot配置文件
java·数据库·spring boot
pedestrian_h2 小时前
Spring AI 开发本地deepseek对话快速上手笔记
java·spring boot·笔记·llm·ollama·deepseek