Статьи

AmazonSQS и Spring для очереди сообщений

В следующем посте будет показано, как использовать шаблоны Spring JMS и DLMC’S вместе с AmazonSQS API для размещения очереди сообщений.

Зачем мне использовать Amazon SQS?

  1. Прост в настройке
  2. Кроссплатформенная поддержка
  3. Зарабатывайте на своих излишних заботах, связях и масштабировании.

Почему я не буду использовать Amazon SQS?

  1. Если требование задержки требует менее ~ 20 мс
  2. Стоимость ~ 0.00005 $ за сообщение

Я наткнулся на хороший проект с открытым исходным кодом под названием Nevado, который очень аккуратно оборачивает API Amazon SQS.

Добавьте это к вашей зависимости maven:

1
2
3
4
5
<dependency>
 <groupId>org.skyscreamer</groupId>
 <artifactId>nevado-jms</artifactId>
 <version>1.2.4</version>
 </dependency>

Теперь давайте настроим компоненты Spring для приятной интеграции с AmazonSQS:

1. Фабрика соединений:

1
<bean id="sqsConnectorFactory" class="org.skyscreamer.nevado.jms.connector.amazonaws.AmazonAwsSQSConnectorFactory"/>

Обратите внимание, что в этой оболочке нам нужно установить aws.accessKey и aws.secretKey. Мы получаем эти ключи от портала учетной записи AmazonSQS:

1
2
3
4
5
6
<bean id="connectionFactory" class="org.skyscreamer.nevado.jms.NevadoConnectionFactory">
 <property name="sqsConnectorFactory" ref="sqsConnectorFactory"/>
 <property name="awsAccessKey" value="${aws.accessKey}"/>
 <property name="awsSecretKey" value="${aws.secretKey}"/>
 
</bean>

2. Создайте очередь

1
2
3
<bean id="myQueue" class="org.skyscreamer.nevado.jms.destination.NevadoQueue">
 <constructor-arg value="${aws.sqs.queue.name}"/>
 </bean>

3. Создайте шаблон Jms (который будет добавлен позже в код для отправки сообщений):

1
2
3
4
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
 <property name="defaultDestinationName" value="${aws.sqs.queue.name}"/>
 <property name="connectionFactory" ref="cachedConnectionFactory"/>
 </bean>

4. Добавьте слушателей:

  • 4.a Я использую SimpleMessageListenerContainer, который имеет возможность кэшировать соединения, запускать одновременных потребителей, устанавливать прослушиватели ошибок и многое другое.
    1
    2
    3
    4
    5
    6
    7
    8
    <bean id="simpleMessageListenerContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
     <property name="connectionFactory" ref="connectionFactory"/>
     <property name="messageListener" ref="listener"/>
     <property name="destination" ref="myQueue"/>
     <property name="errorHandler" ref="amazonMessageListener"/>
     <property name="concurrency" value="20"/>
     <property name="taskExecutor" ref="listenerThreadPoolTaskExecutor"/>
     </bean>
  • 4.b Добавим Пул потоков для исполнителей слушателя:
    1
    2
    3
    4
    5
    6
    <bean id="listenerThreadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
     <property name="corePoolSize" value="70"/>
     <property name="maxPoolSize" value="70"/>
     <property name="daemon" value="true"/>
     <property name="keepAliveSeconds" value="60"/>
     </bean>
  • 4.c Добавлена ​​поддержка кеширования соединений:
    1
    2
    3
    4
    <bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
     <property name="targetConnectionFactory" ref="connectionFactory"/>
     <property name="sessionCacheSize" value="10"/>
     </bean>
  • 4.d Создайте MessageAdapter, чтобы все подключить и установить pojo в качестве прослушивателя сообщений (amazonMessageListener):
    1
    2
    3
    4
    5
    <bean id="listener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
     <property name="delegate" ref="amazonMessageListener"/>
     <property name="defaultListenerMethod" value="onMessage"/>
     <property name="defaultResponseDestination" ref="myQueue"/>
     </bean>

Ссылка: AmazonSQS и Spring для очереди сообщений от нашего партнера по JCG Идана Фридмана в блоге IdanFridman.com .