首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQSListener不使用队列中的消息

SQSListener不使用队列中的消息
EN

Stack Overflow用户
提问于 2021-12-15 21:28:26
回答 2查看 1.2K关注 0票数 2

我无法看到@SqsListener正在使用SQS队列中的消息

代码语言:javascript
复制
import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener; //others

@Component
public class Consumer{
  private static final Logger logger = LoggerFactory.getLogger(Consumer.class);

  @SqsListener(value = "TEST-MY-QUEUE")
  public void receiveMessage(String stringJson)  {
    System.out.println("***Consuming message: " + stringJson);
    logger.info("Consuming message: " + stringJson);
  }

}

我的配置(在这里,我打印客户端队列,我可以发现我想使用的队列-测试-我的队列。它在区域中正确地打印URL。我还能够在regionProvider中正确地看到加载的区域(与队列相同)

代码语言:javascript
复制
@Configuration

public class AwsConfiguration { 

  @Bean
  @Primary
  AmazonSQSAsync sqsClient() {
    AmazonSQSAsync amazonSQSAsync = AmazonSQSAsyncClientBuilder.defaultClient();
    System.out.println("Client queues = " + amazonSQSAsync.listQueues()); //The queue I want to consume is here
    return amazonSQSAsync;
  }

  @Bean
  AwsRegionProvider regionProvider() {
    DefaultAwsRegionProviderChain defaultAwsRegionProviderChain = new DefaultAwsRegionProviderChain();
    System.out.println("Region = " + defaultAwsRegionProviderChain.getRegion());
    return defaultAwsRegionProviderChain;
  }

@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(AmazonSQSAsync amazonSQSAsync, QueueMessageHandler queueMessageHandler) {
    
    SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
    simpleMessageListenerContainer.setAmazonSqs(amazonSQSAsync);
    simpleMessageListenerContainer.setMessageHandler(queueMessageHandler);
    simpleMessageListenerContainer.setMaxNumberOfMessages(10);
    simpleMessageListenerContainer.setTaskExecutor(threadPoolTaskExecutor());
    return simpleMessageListenerContainer;
  }

  @Bean
  public QueueMessageHandler queueMessageHandler(AmazonSQSAsync amazonSQSAsync) {
    QueueMessageHandlerFactory queueMessageHandlerFactory = new QueueMessageHandlerFactory();
    queueMessageHandlerFactory.setAmazonSqs(amazonSQSAsync);
    QueueMessageHandler queueMessageHandler = queueMessageHandlerFactory.createQueueMessageHandler();
    return queueMessageHandler;
  }

  public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(10);
    executor.initialize();
    return executor;
  }

和pom.xml (Java 11,spring引导,)

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-aws-core</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-aws-autoconfigure</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws-messaging</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

我在这里注意到了非常类似的问题,我将pom.xml中的依赖项改为spring aws消息,但没有为我修复。当我运行我的应用程序时,我双重检查了名字(队列、注释),这些看起来都很好,但是我没有看到任何日志或异常。没有一条信息被消耗掉。我遗漏了什么?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-20 17:36:21

最后,这是配置的一个问题(使用凭据)

在application.yml中

代码语言:javascript
复制
credentials:
  useDefaultAwsCredentialsChain: true #Will use credentials in /.aws 

然后在您创建AmazonSQSAsync的AmazonSQSAsync类中,让它使用该配置

代码语言:javascript
复制
public AmazonSQSAsync amazonSQSAsync() {
  DefaultAWSCredentialsProviderChain defaultAWSCredentialsProviderChain = new DefaultAWSCredentialsProviderChain();
  return AmazonSQSAsyncClientBuilder.standard().withRegion(region)
            .withCredentials(defaultAWSCredentialsProviderChain)
            .build();
票数 2
EN

Stack Overflow用户

发布于 2021-12-15 22:56:18

您正在使用第三方API。要从Java项目调用(SQS),请使用官方的AWS V2。如果您不知道如何使用此SDK,请参阅本DEV指南:

开发者指南-AWSSDKforJava2.x

有关AWS SQS的特定信息,请参见:

使用Amazon简单队列服务

这里有指向AWS Github的链接,在那里您可以找到POM依赖项、代码等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70370539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档