2016-09-28 8 views
1

Возможно, у кого-то есть идея для моей следующей проблемы:Как настроить обработчик сообщений программно в Spring Cloud AWS SQS?

В настоящее время я нахожусь в проекте, где я хочу использовать AWS SQS с интеграцией Spring Cloud. Для части получателя я хочу предоставить API, где пользователь может зарегистрировать «обработчик сообщений» в очереди, который является интерфейсом и будет содержать бизнес-логику пользователя, например.

MyAwsSqsReceiver receiver = new MyAwsSqsReceiver(); 
receiver.register("a-queue-name", new MessageHandler(){ 
    @Override 
    public void handle(String message){ 
    //... business logic for the received message 
    } 
}); 

Я нашел примеры, например. https://codemason.me/2016/03/12/amazon-aws-sqs-with-spring-cloud/ и читать доку http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_sqs_support

Но единственное, что я нашел там «соединить» функциональность для обработки входящего сообщения является аннотацию по методу, например, @SqsListener или @MessageMapping.

Эти аннотации привязаны к определенной очереди. Итак, теперь я в недоумении, как динамически «подключить» предоставленный мной «MessageHandler» (от моего API) к входящему сообщению для указанного имени очереди.

В Config примере есть SimpleMessageListenerContainer, который получает QueueMessageHandler набор, но это QueueMessageHandler не кажется , чтобы быть в нужном месте, чтобы установить свой обработчик или переопределить его методы и предоставить свой собственный подкласс QueueMessageHandler.

Я уже сделал что-то подобное с интеграцией Spring Amqp и RabbitMq и подумал, что он также будет похож на AWS SQS.

У кого-нибудь есть идея, как это сделать?

ТНХ + свиданья, Ximon

EDIT:

Я обнаружил, что Spring JMS может на самом деле сделать это, например, www.javacodegeeks.com/2016/02/aws-sqs-spring-jms-integration.html. Кто-нибудь знает, какие последствия с использованием протокола JMS здесь, хорошие или плохие?

ответ

0

Когда мы делаем Spring и SQS, мы используем обмен сообщениями весеннего облака-aws.

Тогда просто создать прослушиватель класс

@Component 
public class MyListener { 

@SQSListener(value="myqueue") 
public void listen(MyMessageType message) { 
//process the message 
} 
} 
+0

Привет, ТНХ для ответа. К сожалению, это не то, что я намеревался. В моем случае использования я не знаю названия очереди - он создается динамически, например. по вызову API «createQueue (String name)». После этого я хотел бы динамически установить слушателя. – Ximon

+0

О, ладно, это было непонятно мне из вопроса. Я просто пытался дать вам очень веский способ сделать это с очень маленьким кодом. Мне нравится, как Spring обертывает библиотеки AWS, но в нашем случае все Очереди предопределены, поэтому вы можете просто ввести имя очереди в SPEL. Этот подход не будет работать для вашего случая, так как когда вы встаете на сторону приложения, а Spring пытается встать на этот компонент, он еще не знает имя очереди (даже если вы установите для него переменную env и используете SPEL для доступа что). – haskovec