Spring integration 将SqsConsumer从spring coud aws消息传递迁移到spring integration aws

Spring integration 将SqsConsumer从spring coud aws消息传递迁移到spring integration aws,spring-integration,spring-cloud-aws,spring-integration-aws,Spring Integration,Spring Cloud Aws,Spring Integration Aws,我想使用spring集成aws向aws SNS发送消息,并从aws SQS接收消息。我在理解如何将我的应用程序从spring coud aws消息迁移到使用它时遇到了一些困难。我的代码基本上是一个SQS配置类: @Configuration @EnableConfigurationProperties(SqsProperties.class) @Profile("!test") public class SqsConfiguration { private final SqsProp

我想使用spring集成aws向aws SNS发送消息,并从aws SQS接收消息。我在理解如何将我的应用程序从spring coud aws消息迁移到使用它时遇到了一些困难。我的代码基本上是一个SQS配置类:

@Configuration
@EnableConfigurationProperties(SqsProperties.class)
@Profile("!test")
public class SqsConfiguration {

     private final SqsProperties sqsProperties;  

     @Autowired  
     public SqsConfiguration(SqsProperties sqsProperties) {  
          this.sqsProperties = sqsProperties;  
     }  

     @Bean  
     public SimpleMessageListenerContainer simpleMessageListenerContainer() {  
          SimpleMessageListenerContainer msgListenerContainer =  
                simpleMessageListenerContainerFactory().createSimpleMessageListenerContainer();  
          msgListenerContainer.setMessageHandler(queueMessageHandler());  
          return msgListenerContainer;  
     }  

     @Bean  
     public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {  
          SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();  
      msgListenerContainerFactory.setAmazonSqs(amazonSQSClient());  
      msgListenerContainerFactory.setDestinationResolver(customDestinationResolver(sqsProperties));  
     return msgListenerContainerFactory;  
      }  

        @Bean  
      public QueueMessageHandler queueMessageHandler() {  
            QueueMessageHandlerFactory queueMsgHandlerFactory = new QueueMessageHandlerFactory();  
      queueMsgHandlerFactory.setAmazonSqs(amazonSQSClient());  
     return queueMsgHandlerFactory.createQueueMessageHandler();  
      }  


        @Bean(name = "amazonSQS", destroyMethod = "shutdown")  
        public AmazonSQSAsync amazonSQSClient() {  
            return AmazonSQSAsyncClientBuilder.defaultClient();  
      }  

        @Bean  
      public SqsQueuesDestinationResolver customDestinationResolver(SqsProperties sqsProperties) {  
            return new SqsQueuesDestinationResolver(sqsProperties);  
      }  
    }
使用customDestinationResolver(基本上是因为队列名称只能因不同的部署而动态)的定义为:

    public class SqsQueuesDestinationResolver implements DestinationResolver<String> {  

        private static final Logger LOG = LoggerFactory.getLogger(SqsQueuesDestinationResolver.class);  

     private SqsProperties sqsProperties;  

      @Autowired  
      private AmazonSQSAsync amazonSQSAsync;  

     public SqsQueuesDestinationResolver(SqsProperties sqsProperties) {  
            this.sqsProperties = sqsProperties;  
      }  

        @Override  
      public String resolveDestination(String queueName) throws DestinationResolutionException {  
            String finalQueueName = getFinalQueueName(queueName);  
     try {  
                return amazonSQSAsync.getQueueUrl(finalQueueName).getQueueUrl();  
      }  
            catch (QueueDoesNotExistException queueDoesNotExistException) {  
                LOG.error(String.format("The '%s' queue was not found.", finalQueueName));  
      }  
            return null;  
      }  

        private String getFinalQueueName(String queueName) {  
            String finalQueueName;  
     switch (queueName) {  
                case "queue-foo":  
                    finalQueueName = sqsProperties.getFooQueue();  
     break; case "queue-bar":  
                    finalQueueName = sqsProperties.getBarQueue();  
     break;  
     default:  
                    finalQueueName = null;  
      }  
            return finalQueueName;  
      }  
    }
我一直在尝试遵循中的文档,而我在SQS部分中努力理解的是“入站通道适配器”一章中的内容。由于我使用的是自定义destinationResolver,我应该为SqsMessageDrivenChannelAdapter()的构造函数提供哪些队列作为参数,我应该如何使用这些消息,或者它是否应该像以前一样使用SpringCloudAWS消息传递中的@SqsListener注释


非常感谢您的帮助,如果这不是一个合适的地方,或者这是一个非常愚蠢的问题,我很抱歉,我只是第一次尝试:)

我不确定您缺少什么,但您仍然可以在
SqsMessageDrivenChannelAdapter中使用
foo queue
bar queue
(amazonsqasync amazonSqs,字符串…队列)
ctor

您的自定义
DestinationResolver
也可以在那里使用:

public void setDestinationResolver(DestinationResolver<String> destinationResolver) {
    this.simpleMessageListenerContainerFactory.setDestinationResolver(destinationResolver);
}
public void setDestinationResolver(DestinationResolver DestinationResolver){
this.simpleMessageListenerContainerFactory.setDestinationResolver(destinationResolver);
}
事实上,此
SqsMessageDrivenChannelAdapter
完全基于相同的
SimpleMessageListenerContainerFactory

要使用接收到的frm SQS消息,您只需使用
MessageChannel
配置此通道适配器以生成消息。然后订阅该下游通道


查看Spring集成参考手册中有关通道和消息的更多信息:

我不确定您缺少了什么,但您仍然可以在
SqsMessageDrivenChannelAdapter(amazonsqasync amazonSqs,String…queues)中使用
foo队列
bar队列

您的自定义
DestinationResolver
也可以在那里使用:

public void setDestinationResolver(DestinationResolver<String> destinationResolver) {
    this.simpleMessageListenerContainerFactory.setDestinationResolver(destinationResolver);
}
public void setDestinationResolver(DestinationResolver DestinationResolver){
this.simpleMessageListenerContainerFactory.setDestinationResolver(destinationResolver);
}
事实上,此
SqsMessageDrivenChannelAdapter
完全基于相同的
SimpleMessageListenerContainerFactory

要使用接收到的frm SQS消息,您只需使用
MessageChannel
配置此通道适配器以生成消息。然后订阅该下游通道


请参阅《Spring集成参考手册》中有关频道和消息的更多信息:

消息是在不同的应用程序中生成的。因此,这不是问题所在。我已经设置了destinationResolver。因此,我想我缺少的是如何正确订阅下游频道。我已尝试使用@SqsL注释消息istener(“foo队列”)注释和@ServiceActivator(inputChannel=“foo队列”),我不能使用任何消息,正如我所说:你需要熟悉EIP概念a
MessageChannel
。看看我们的测试,例如:消息是在不同的应用程序中生成的。所以这不是问题。我已经设置了destinationResolver。所以我想我缺少的是如何订阅c直接到下游通道。我已尝试使用@SqsListener(“foo queue”)注释和@ServiceActivator(inputChannel=“foo queue”)注释消息,但无论使用哪种注释,我都无法使用任何消息,正如我所说:您需要熟悉EIP概念a
MessageChannel
。请参阅我们的测试示例: