Аннотация Spring Cloud AWS SQS SendTo с заполнителем свойства

Эта проблема предполагает, что аннотация @SendTo поддерживает заполнители свойств, но я не могу заставить его работать. Вот несколько упрощенных фрагментов кода того, что я пытаюсь сделать (проще, чем пытаться объяснить словами). У меня версия spring-cloud-aws 1.2.1.

Это работает:

@Component
public class InputQueueListener {

    @Value("${replyQueueProperty}")
    private String replyQueue;

    @Autowired
    private QueueMessagingTemplate messagingTemplate;

    @SqsListener(value = "${inputQueueProperty}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    private void receiveMessage(final Message message, final Acknowledgment acknowledgment, @Header("ApproximateReceiveCount") final int receiveCount) throws Exception {
        final Reply reply = doStuff(message);

        messagingTemplate.convertAndSend(replyQueue, reply);
    }
}

И это работает:

@Component
public class InputQueueListener {

    @SqsListener(value = "${inputQueueProperty}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    @SendTo("replyQueueActualName")
    private Reply receiveMessage(final Message message, final Acknowledgment acknowledgment, @Header("ApproximateReceiveCount") final int receiveCount) throws Exception {
        final Reply reply = doStuff(message);

        return reply;
    }
}

Но это не работает:

@Component
public class InputQueueListener {

    @SqsListener(value = "${inputQueueProperty}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    @SendTo("${replyQueueProperty}")
    private Reply receiveMessage(final Message message, final Acknowledgment acknowledgment, @Header("ApproximateReceiveCount") final int receiveCount) throws Exception {
        final Reply reply = doStuff(message);

        return reply;
    }
}

Это не удается с исключением NonExistentQueue. Но очередь существует, и первые два метода прекрасно отправляют в нее сообщения. Что мне не хватает?! Я проверил на опечатки миллион раз, я почти уверен, что это не так :)

На всякий случай вот моя конфигурация:

@Bean
public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs, final ResourceIdResolver resourceIdResolver) {
    final QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs, resourceIdResolver);
    return queueMessagingTemplate;
}

@Lazy
@Bean(name = "amazonSQS", destroyMethod = "shutdown")
public AmazonSQSAsync amazonSQSClient() {

    final AmazonSQSAsync awsSQSAsyncClient;

    awsSQSAsyncClient = AmazonSQSAsyncClientBuilder
            .standard()
            .withRegion(Regions.fromName(System.getProperty("cloud.aws.region.static")))
            .withCredentials(new DefaultAWSCredentialsProviderChain())
            .build();
    return awsSQSAsyncClient;
}

@Bean
public QueueMessageHandler queueMessageHandler(final AmazonSQSAsync amazonSqs) {
    final QueueMessageHandlerFactory queueMsgHandlerFactory = new QueueMessageHandlerFactory();
    queueMsgHandlerFactory.setAmazonSqs(amazonSqs);

    final QueueMessageHandler queueMessageHandler = queueMsgHandlerFactory.createQueueMessageHandler();

    return queueMessageHandler;
}

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(final AmazonSQSAsync amazonSqs) {
    final SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
    msgListenerContainerFactory.setAmazonSqs(amazonSqs);
    msgListenerContainerFactory.setMaxNumberOfMessages(5);
    msgListenerContainerFactory.setWaitTimeOut(20);

    return msgListenerContainerFactory;
}


@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(final QueueMessageHandler messageHandler, final SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory) {
    final SimpleMessageListenerContainer msgListenerContainer = simpleMessageListenerContainerFactory.createSimpleMessageListenerContainer();
    msgListenerContainer.setMessageHandler(messageHandler);

    return msgListenerContainer;
}

@Bean
public DynamicQueueUrlDestinationResolver destinationResolver(final AmazonSQSAsync amazonSqs, final ResourceIdResolver resourceIdResolver) {
    DynamicQueueUrlDestinationResolver destinationResolver = new DynamicQueueUrlDestinationResolver(amazonSqs, resourceIdResolver);
    return destinationResolver;
}

@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory(final AmazonSQSAsync amazonSqs) {
    QueueMessageHandlerFactory factory = new QueueMessageHandlerFactory();
    factory.setAmazonSqs(amazonSqs);

    return factory;
}

person orange    schedule 02.03.2018    source источник
comment
Возможно, вы захотите увидеть: stackoverflow.com/a/51621607/499635   -  person nemo    schedule 31.07.2018