Spring 启动 JMS 侦听器 - org.springframework.jms.config.JmsListenerEndpointRegistry.isAutoStartup()Z
Spring boot JMS Listener - org.springframework.jms.config.JmsListenerEndpointRegistry.isAutoStartup()Z
我已经设置了一个 JmsListener 来从 sqs 队列中读取消息。
首先,我创建了一个如下所示的配置 class 来设置 ConnectionFactory 和 JMSTemplate
@Configuration
@EnableJms
public class SQSJmsConfig {
private AWSCredentialsProvider awsCredentialsProvider;
@Value("${aws.ses.accessKey}")
private String accessKey;
@Value("${aws.ses.secretKey}")
private String secretKey;
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
AmazonSQSClientBuilder.standard().withRegion(Regions.US_EAST_1).withCredentials(awsCredentialsProvider));
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(sqsConnectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setConcurrency("3-10");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
@Bean
public JmsTemplate defaultJmsTemplate() {
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
AmazonSQSClientBuilder.standard().withRegion(Regions.US_EAST_1).withCredentials(awsCredentialsProvider));
return new JmsTemplate(sqsConnectionFactory);
}
}
然后我创建了一个 JmsListener 方法来从 sqs 队列中读取消息
@Service
public class SQSQueueService {
private static final Logger log = LoggerFactory.getLogger(SQSQueueService.class);
@JmsListener(destination = "${aws.sqs.queueName}")
public void readPlan(SQSEmailStatusQueue sqsEmailStatusQueue) {
try {
log.info("SNS notification received from SQS queue");
String message = sqsEmailStatusQueue.getMessage();
System.out.println(message);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
在那之后,当我 运行 项目时,我得到了以下异常
java.lang.AbstractMethodError: org.springframework.jms.config.JmsListenerEndpointRegistry.isAutoStartup()Z
出现此异常的原因是什么?
问题出在依赖关系上。
`<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>`
我删除了这个版本。然后它起作用了。
谁能解释一下为什么会这样?
如果您的应用程序使用 spring-boot-starter-parent
并且还依赖于:
,则可能会发生故障
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.jms.version}</version>
</dependency>
改为利用父级提供的依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
我已经设置了一个 JmsListener 来从 sqs 队列中读取消息。 首先,我创建了一个如下所示的配置 class 来设置 ConnectionFactory 和 JMSTemplate
@Configuration
@EnableJms
public class SQSJmsConfig {
private AWSCredentialsProvider awsCredentialsProvider;
@Value("${aws.ses.accessKey}")
private String accessKey;
@Value("${aws.ses.secretKey}")
private String secretKey;
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
AmazonSQSClientBuilder.standard().withRegion(Regions.US_EAST_1).withCredentials(awsCredentialsProvider));
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(sqsConnectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setConcurrency("3-10");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
@Bean
public JmsTemplate defaultJmsTemplate() {
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
AmazonSQSClientBuilder.standard().withRegion(Regions.US_EAST_1).withCredentials(awsCredentialsProvider));
return new JmsTemplate(sqsConnectionFactory);
}
}
然后我创建了一个 JmsListener 方法来从 sqs 队列中读取消息
@Service
public class SQSQueueService {
private static final Logger log = LoggerFactory.getLogger(SQSQueueService.class);
@JmsListener(destination = "${aws.sqs.queueName}")
public void readPlan(SQSEmailStatusQueue sqsEmailStatusQueue) {
try {
log.info("SNS notification received from SQS queue");
String message = sqsEmailStatusQueue.getMessage();
System.out.println(message);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
在那之后,当我 运行 项目时,我得到了以下异常
java.lang.AbstractMethodError: org.springframework.jms.config.JmsListenerEndpointRegistry.isAutoStartup()Z
出现此异常的原因是什么?
问题出在依赖关系上。
`<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>`
我删除了这个版本。然后它起作用了。 谁能解释一下为什么会这样?
如果您的应用程序使用 spring-boot-starter-parent
并且还依赖于:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.jms.version}</version>
</dependency>
改为利用父级提供的依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>