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

ActiveMQ控制臺隊列頁面

初始狀態

拋出異常會重試多次后

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76881.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java學習筆記】random的使用

random使用方法 使用說明&#xff1a;返回的是(0<n<1)這個范圍中的任意帶正號的double值 代碼實例 public class helloworld{public static void main(String[] args){System.out.println(Math.random());} }生成0-100中的任意數代碼示例 public class Main {public …

(三)垂直分庫架構、分布式數據庫

文章目錄 垂直分庫架構/分布式數據庫什么是垂直分庫架構架構模型優缺點優點缺點 技術案例分布式數據庫架構模型優缺點優點缺點 技術案例 垂直分庫架構/分布式數據庫 什么是垂直分庫架構 根據業務的模塊劃分&#xff0c; 將不同業務的數據放到不同的數據庫中。 比如一個電子商城…

數據結構線性表的順序存儲結構

線性表是由零個或多個數據元素組成的有序序列。 特點&#xff1a; 數據元素間是有順序的&#xff1b; 數據元素的個數是有限的&#xff1b; 一般來說&#xff0c;數據元素的類型是相同的&#xff08;強類型語言&#xff09;。c/c是強類型語言&#xff0c;必須指定數據類型。…

扣子空間試用:生成五一騎行規劃+notion文章編寫

今天試用了一下扣子空間&#xff0c;正好五一快到了&#xff0c;讓它幫忙做了五一騎行規劃&#xff0c;效果不賴&#xff01; 生成五一騎行規劃 點擊前往網站查看效果 prompt 如下&#xff1a; 幫我做一個五一上海騎行規劃 要求&#xff1a; - 風景優美 - 人少 - 100km總路程…

最新得物小程序sign簽名加密,請求參數解密,響應數據解密逆向分析

點擊精選&#xff0c;出現https://app.dewu.com/api/v1/h5/index/fire/index 這個請求 直接搜索sign的話不容易定位 直接搜newAdvForH5就一個&#xff0c;進去再搜sign&#xff0c;打上斷點 可以看到t.params就是沒有sign的請求參數&#xff0c; 經過Object(a.default)該函數…

在C#串口通信中,一發一收的場景,如何處理不同功能碼的幀數據比較合理,代碼結構好

在 C# 串口通信的一發一收場景里&#xff0c;處理不同功能碼的幀數據可采用以下合理的代碼結構&#xff0c;它能讓代碼更具可讀性、可維護性和可擴展性。 實現思路 定義幀結構&#xff1a;創建一個類來表示通信幀&#xff0c;其中包含功能碼、數據等信息。功能碼處理邏輯&…

【C++】vector擴容縮容

vector擴容縮容 1 擴容 一般來說&#xff0c;主要是重新分配內存 2 縮容 resize 縮小后&#xff0c;vector 的容量&#xff08;capacity()&#xff09;可能保持不變&#xff0c;需要顯式調用 shrink_to_fit() 來釋放內存。 驗證代碼&#xff1a; #include <vector>…

java中,線程的執行狀態有哪些

在 Java 里&#xff0c;線程有 6 種執行狀態&#xff0c;這些狀態都在 java.lang.Thread.State 枚舉類中被定義。下面為你詳細介紹這些狀態&#xff1a; 1. NEW&#xff08;新建狀態&#xff09; 當你創建了一個 Thread 對象&#xff0c;卻還未調用其 start() 方法時&#xf…

MATLAB 控制系統設計與仿真 - 41

魯棒控制的其他函數 - 回路成型函數 loopsyn 靈敏度問題由魯棒控制工具箱中的loopsyn就可以直接求解,該函數采用H無窮回路成型算法設計控制器,函數的調用格式為: [K,CL,gamma,info] = loopsyn(G,Gd) % G為受控對象模型% Gd為期望的回路傳遞函數% K為回路成型控制器模型% C…

查詢Hologres或postgresql中的數據

因Hologres使用postgresql的語法.所以兩者查詢一樣. 方案1: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;/*** 一個使用簡單連接池管理PostgreSQL連接的工具類。*/ publi…

OpenBayes 一周速覽|EasyControl 高效控制 DiT 架構,助力吉卜力風圖像一鍵生成;TripoSG 單圖秒變高保真 3D 模型

公共資源速遞 10 個教程&#xff1a; * 一鍵部署 R1-OneVision * UNO&#xff1a;通用定制化圖像生成 * TripoSG&#xff1a;單圖秒變高保真 3D * 使用 VASP 進行機器學習力場訓練 * InfiniteYou 高保真圖像生成 Demo * VenusFactory 蛋白質工程設計平臺 * Qwen2.5-0mni…

中興云電腦W102D_晶晨S905X2_2+16G_mt7661無線_安卓9.0_線刷固件包

中興云電腦W102D_晶晨S905X2_216G_mt7661無線_安卓9.0_線刷固件包 準備工作&#xff1a; 工具和設備在開始刷機之前&#xff0c;確保你已經準備好以下物品&#xff1a;雙公頭USB線&#xff1a;選擇一根30-50厘米長的USB線&#xff0c;長度適中&#xff0c;方便操作&#xff0c;…

Rust 學習筆記:安裝 Rust

Rust 學習筆記&#xff1a;安裝 Rust Rust 學習筆記&#xff1a;安裝 Rust在 Windows 上安裝 Rust命令行創建 Rust 項目在 Mac/Linux 上安裝 Rust一些命令升級卸載cargo -hrustc -h 安裝 RustRoverrust-analyzer Rust 學習筆記&#xff1a;安裝 Rust 在 Windows 上安裝 Rust …

Opencv圖像處理:輪廓檢測、輪廓近似、繪制外接圓外接矩形

文章目錄 一、圖像輪廓檢測1、比較2、常見的輪廓檢測方法1&#xff09;基于梯度的方法2&#xff09;基于邊緣檢測器的方法3&#xff09;基于閾值的方法 3、查找輪廓與繪制輪廓4、參數解釋4、代碼解釋1&#xff09;讀取原圖像灰度圖并用二值化顯示2&#xff09;輪廓繪制3&#x…

精益數據分析(17/126):精益畫布與創業方向抉擇

精益數據分析&#xff08;17/126&#xff09;&#xff1a;精益畫布與創業方向抉擇 大家好&#xff01;一直以來&#xff0c;我都希望能和大家一起在創業和數據分析的領域中不斷探索、共同進步。今天&#xff0c;我們接著深入學習《精益數據分析》&#xff0c;這次聚焦于精益畫…

每天五分鐘深度學習PyTorch:圖像的處理的上采樣和下采樣

本文重點 在pytorch中封裝了上采樣和下采樣的方法,我們可以使用封裝好的方法可以很方便的完成采樣任務,采樣分為上采樣和下采樣。 上采樣和下采樣 下采樣(縮小圖像)的主要目的有兩個:1、使得圖像符合顯示區域的大小;2、生成對應圖像的縮略圖。 下采樣( 放大圖像)的…

代碼隨想錄訓練營第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

198. 打家劫舍 思路&#xff1a; 動規五部曲&#xff1a; 1.dp數組及其下標的意義&#xff1a;dp數組表示當前房屋下偷與不偷的最大盜取金額 2.確定遞推公式&#xff1a;因為盜取房屋只能間隔盜取&#xff0c;并且還要取最大值。所以每個房屋都有盜取和不盜取兩個選擇&…

【AI 加持下的 Python 編程實戰 2_09】DIY 拓展:從掃雷小游戲開發再探問題分解與 AI 代碼調試能力(上)

DIY 拓展&#xff1a;從掃雷小游戲開發再探問題分解與 AI 代碼調試能力&#xff08;上&#xff09; 1 起因 最近在看去年剛出了第 2 版《Learn AI-assisted Python Programming》&#xff0c;梳理完 第七章 的知識點后&#xff0c;總感覺這一章的話題很好——問題分解能力的培…

使用DeepSeek-Prover-V1.5解決數學問題

DeepSeek-Prover-V1.5-RLRMaxTS是一個結合強化學習和搜索策略的自動定理證明系統。 1. 初等代數&#xff1a;二次方程求解 問題&#xff1a;解方程 x - 5x 6 0 操作步驟&#xff1a; 將問題轉換為Coq形式&#xff1a; Theorem quadratic : exists x : Z, x^2 - 5*x 6 0…

3.3 技術框架:LangChain、ReAct、Memory與Tool Integration

隨著人工智能技術的飛速發展&#xff0c;智能代理&#xff08;Agent&#xff09;已成為企業實現自動化、智能化和個性化服務的核心工具。在2025年&#xff0c;技術框架如LangChain、ReAct、Memory和Tool Integration在構建高效、靈活的AI代理系統中占據了重要地位。這些框架通過…