Как настроить несколько прослушивателей SQS JMS для SpringBoot.? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть 2 AWS SQS, в которых один содержит Activity, а другой содержит информацию о вложениях, у меня есть JmsSqsListener и ActivitySqsConfig, как показано ниже.

Использование DefaultMessageListenerContainer Я могу настроить только один JmsSqsListener одновременно либо дляАктивность или вложение, но я хочу настроить JmsSqsListener как для SQS, так и для DefaultMessageListenerContainer, что мне этого не позволяет.Я также настраиваю две разные конфигурации JmsSqsListener, используя разные классы, но даже это не сработало.Он просто слушает только одну очередь.

@Configuration
public class JmsSqsListener {

    @Value("${aws.access.key}")
    private String accessKey;

    @Value("${aws.secret.key}")
    private String secretKey;

    @Value("${aws.queue.region}")
    private String region;

    @Value("${leaks.activity.queue}")
    private String activityQueue;

    @Value("${leaks.attachment.queue}")
    private String attachmentQueue;

    @Autowired
    private ActivityEngine activityListener;

    @Autowired
    private AttachmentEngine attachmentListener;   // How to add Listener for attachmentQueue

    @Bean
    public DefaultMessageListenerContainer jmsListenerContainer() {
        SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
                AmazonSQSClientBuilder.standard().withRegion(region).withCredentials(awsCredentialsProvider));
        DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
        dmlc.setConnectionFactory(sqsConnectionFactory);
        dmlc.setDestinationName(activityQueue);// Also want to add attachmentQueue
        dmlc.setMessageListener(activityListener);  // Also want to add attachmentListener

        return dmlc;
    }

    @Bean
    public JmsTemplate createJMSTemplate() {
        SQSConnectionFactory sqsConnectionFactory = new SQSConnectionFactory(new ProviderConfiguration(),
                AmazonSQSClientBuilder.standard().withRegion(region).withCredentials(awsCredentialsProvider));

        JmsTemplate jmsTemplate = new JmsTemplate(sqsConnectionFactory);
        jmsTemplate.setDefaultDestinationName(queueName);
        jmsTemplate.setDeliveryPersistent(false);

        return jmsTemplate;
    }

    private final AWSCredentialsProvider awsCredentialsProvider = new AWSCredentialsProvider() {
        @Override
        public AWSCredentials getCredentials() {
            return new BasicAWSCredentials(accessKey, secretKey);
        }

        @Override
        public void refresh() { }
    };
}

Конфигурация SQS

@Configuration
public class SqsConfig {

    @Value("${aws.access.key}")
    private String accessKey;

    @Value("${aws.secret.key}")
    private String secretKey;

    @Value("${aws.queue.endpoint}")
    private String endpoint;

    @Value("${aws.queue.region}")
    private String region;

    @Value("${leaks.activity.queue}")
    private String activityQueue;

    @Value("${leaks.attachment.queue}")
    private String attachmentQueue;

    @Bean
    public AmazonSQS createSQSClient() {
        AmazonSQSClientBuilder builder = AmazonSQSClientBuilder.standard().withCredentials(awsCredentialsProvider);
        builder.setEndpointConfiguration(new EndpointConfiguration(endpoint, region));
        AmazonSQS amazonSQSClient = builder.build();
        amazonSQSClient.createQueue(activityQueue); // want to create attachmentQueue also

        return amazonSQSClient;
    }

    private final AWSCredentialsProvider awsCredentialsProvider = new AWSCredentialsProvider() {
        @Override
        public AWSCredentials getCredentials() {
            return new BasicAWSCredentials(accessKey, secretKey);
        }

        @Override
        public void refresh() { }
    };
}

Пожалуйста, помогите мне настроить прослушиватели JMS, чтобы 1) ActivityEngine мог слушать ActivityQueue и одновременно 2)AttachmentEngine может прослушивать attachmentQueue;

...