У меня есть служба, которая читает все сообщения из AWS SQS.
@Slf4j
@Configuration
@EnableJms
public class JmsConfig {
private SQSConnectionFactory connectionFactory;
public JmsConfig(
@Value("${amazon.sqs.accessKey}") String awsAccessKey,
@Value("${amazon.sqs.secretKey}") String awsSecretKey,
@Value("${amazon.sqs.region}") String awsRegion,
@Value("${amazon.sqs.endpoint}") String awsEndpoint) {
connectionFactory = new SQSConnectionFactory(
new ProviderConfiguration(),
AmazonSQSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(
new BasicAWSCredentials(awsAccessKey, awsSecretKey)))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(awsEndpoint, awsRegion))
.build());
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(this.connectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setConcurrency("3-10");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setReceiveTimeout(2000L); //??????????
return factory;
}
@Bean
public JmsTemplate defaultJmsTemplate() {
return new JmsTemplate(this.connectionFactory);
}
Я слышал о длительных опросах, поэтому мне интересно, как я могу использовать его в моем случае.Интересно, как работает этот слушатель - я не хочу создавать ненужные вызовы в AWS SQS.
Мой слушатель, который читает сообщения и преобразует их в объект и сохраняет в Redis db:
@JmsListener(destination = "${amazon.sqs.destination}")
public void receive(String requestJSON) throws JMSException {
log.info("Received");
try {
Trace trace = Trace.fromJSON(requestJSON);
traceRepository.save(trace);
(...)
Мне бы хотелось узнать ваше мнение - каков наилучший подход к минимизации ненужных вызовов в SQS для получения сообщений.Может быть, я использую, например,
factory.setReceiveTimeout(2000L);
К сожалению, в Интернете слишком мало информации об этом
Спасибо,
Мэтью