В следующем посте будет показано, как использовать шаблоны Spring JMS и DLMC’S вместе с AmazonSQS API для размещения очереди сообщений.
Зачем мне использовать Amazon SQS?
- Прост в настройке
- Кроссплатформенная поддержка
- Зарабатывайте на своих излишних заботах, связях и масштабировании.
Почему я не буду использовать Amazon SQS?
- Если требование задержки требует менее ~ 20 мс
- Стоимость ~ 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, который имеет возможность кэшировать соединения, запускать одновременных потребителей, устанавливать прослушиватели ошибок и многое другое.
12345678
<beanid="simpleMessageListenerContainer"class="org.springframework.jms.listener.SimpleMessageListenerContainer"><propertyname="connectionFactory"ref="connectionFactory"/><propertyname="messageListener"ref="listener"/><propertyname="destination"ref="myQueue"/><propertyname="errorHandler"ref="amazonMessageListener"/><propertyname="concurrency"value="20"/><propertyname="taskExecutor"ref="listenerThreadPoolTaskExecutor"/></bean> - 4.b Добавим Пул потоков для исполнителей слушателя:
123456
<beanid="listenerThreadPoolTaskExecutor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><propertyname="corePoolSize"value="70"/><propertyname="maxPoolSize"value="70"/><propertyname="daemon"value="true"/><propertyname="keepAliveSeconds"value="60"/></bean> - 4.c Добавлена поддержка кеширования соединений:
1234
<beanid="cachedConnectionFactory"class="org.springframework.jms.connection.CachingConnectionFactory"><propertyname="targetConnectionFactory"ref="connectionFactory"/><propertyname="sessionCacheSize"value="10"/></bean> - 4.d Создайте MessageAdapter, чтобы все подключить и установить pojo в качестве прослушивателя сообщений (amazonMessageListener):
12345
<beanid="listener"class="org.springframework.jms.listener.adapter.MessageListenerAdapter"><propertyname="delegate"ref="amazonMessageListener"/><propertyname="defaultListenerMethod"value="onMessage"/><propertyname="defaultResponseDestination"ref="myQueue"/></bean>
Ссылка: AmazonSQS и Spring для очереди сообщений от нашего партнера по JCG Идана Фридмана в блоге IdanFridman.com .