В следующем посте будет показано, как использовать шаблоны 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
<
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 Добавим Пул потоков для исполнителей слушателя:
123456
<
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 Добавлена поддержка кеширования соединений:
1234
<
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):
12345
<
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 .