Возможно, у кого-то есть идея для моей следующей проблемы:Как настроить обработчик сообщений программно в 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 здесь, хорошие или плохие?
Привет, ТНХ для ответа. К сожалению, это не то, что я намеревался. В моем случае использования я не знаю названия очереди - он создается динамически, например. по вызову API «createQueue (String name)». После этого я хотел бы динамически установить слушателя. – Ximon
О, ладно, это было непонятно мне из вопроса. Я просто пытался дать вам очень веский способ сделать это с очень маленьким кодом. Мне нравится, как Spring обертывает библиотеки AWS, но в нашем случае все Очереди предопределены, поэтому вы можете просто ввести имя очереди в SPEL. Этот подход не будет работать для вашего случая, так как когда вы встаете на сторону приложения, а Spring пытается встать на этот компонент, он еще не знает имя очереди (даже если вы установите для него переменную env и используете SPEL для доступа что). – haskovec