Асинхронный приемник Amazon SQS для расширенной клиентской библиотеки с использованием Spring JmsListener - PullRequest
0 голосов
/ 13 декабря 2018

Моя команда пытается внедрить Async Listener для расширенной клиентской библиотеки Java SQS Amazon , потому что, как отмечено на , * и , , ссылки отсутствуют.не будет никакой поддержки в ближайшее время.

Первоначальная проблема заключается в том, что нам нужно отправить очень большую полезную нагрузку через SQS.Чтобы решить эту проблему, мы использовали вышеупомянутые функциональные возможности расширенной клиентской библиотеки Java SQS Java Amazon.Он будет автоматически загружать большие полезные нагрузки на S3, а затем извлекать их в виде сообщений, при этом потребитель никогда не будет беспокоиться о том, как извлечь их из S3.К сожалению, это может быть сделано только синхронно из коробки.

Поэтому, чтобы заставить его работать асинхронно, мы придумали следующий код, используя JmsListener .Это работает, и мы получаем сериализованный объект в формате String.

AWS / SQS Beans

import com.amazon.sqs.javamessaging.AmazonSQSExtendedClient;
import com.amazon.sqs.javamessaging.ExtendedClientConfiguration;
import com.amazon.sqs.javamessaging.ProviderConfiguration;
import com.amazon.sqs.javamessaging.SQSConnectionFactory;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.sqs.AmazonSQSAsync;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;

@Configuration
public class AWSConfig {

    @Bean
    public AWSCredentialsProvider awsCredentialsProvider() {
        return new DefaultAWSCredentialsProviderChain();
    }

    @Bean
    public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
        final DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
        jmsListenerContainerFactory.setConnectionFactory(connectionFactory);

        return jmsListenerContainerFactory;
    }

    @Bean
    public ConnectionFactory connectionFactory(final AmazonS3Client amazonS3Client, final AmazonSQSAsync amazonSqs) {
        final ExtendedClientConfiguration extendedClientConfig = new ExtendedClientConfiguration()
                .withLargePayloadSupportEnabled(amazonS3Client, "my-bucket-name");

        final ProviderConfiguration providerConfiguration = new ProviderConfiguration();
        providerConfiguration.setNumberOfMessagesToPrefetch(10);

        final SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(providerConfiguration,
                new AmazonSQSExtendedClient(amazonSqs, extendedClientConfig));

        return sqsConnectionFactory
    }
}

Слушатель, который использует аннотацию @JmsListener:

@Component
public class QueueListener {

    ...

    @JmsListener(destination = "my-queue-name", containerFactory = "jmsListenerContainerFactory")
    public void consumeMessage(String queueMessage) {
        System.out.println(queueMessage);
    }
}

Проблема в том, что , хотя работает, большие сообщения, прочитанные с S3, появляются как String.Мы бы на самом деле действительно хотели бы, чтобы сообщения автоматически анализировались в определенном объекте (например, @SqsListener уже позволяет нам без необходимости разбирать строку самим), например:

@JmsListener(destination = "my-queue-name", containerFactory = "jmsListenerContainerFactory")
public void consumeMessage(SomeObject queueMessage) ...

Уже существует подобный вопрос , но ссылка на ответ мертва, и описание ничего не делает для нас.И это руководство по обмену сообщениями JMS не будет хорошо работать в сочетании с расширенной библиотекой SQS.Чтобы усложнить задачу, мы можем использовать только классы org.springframework.jms.support.converter при установке конвертера на jmsListenerContainerFactory, поэтому мы не можем использовать те же картографы Джексона, которые использует AWS.

...