Объединение @sqslistener и @requestmapping

В настоящее время мы находимся в процессе миграции нашей текущей архитектуры на микросервисы на основе Spring-AWS. Одна из моих задач - исследовать, как наши микросервисы взаимодействуют друг с другом. Я стремлюсь создать гибридную систему конечных точек RESTful HTTP и производителей и потребителей SQS.

В качестве примера у меня есть код ниже:

@SqsListener("request_queue")
@SendTo("response_queue")
@PostMapping("/send")
public Object send(@RequestBody Request request, @Header("SenderId") String senderId) {
    if (senderId != null && !senderId.trim().isEmpty()) {
        logger.info("SQS Message Received!");
        logger.info("Sender ID: ".concat(senderId));
        request = new Gson().fromJson(payload, Request.class);
    }

    Response response = processRequest(request); // Process request

    return response;
}

Теоретически этот метод должен обрабатывать следующее:

  1. Получить объект Запрос по HTTP
  2. Постоянно опрашивайте request_queue на предмет сообщения, содержащего объект Запрос

В качестве конечной точки HTTP метод не возвращает ошибок. Однако как прослушиватель SQS он сталкивается со следующим исключением:

org.springframework.messaging.converter.MessageConversionException: 
    Cannot convert from [java.lang.String] to [com.oriente.salt.Request] for 
    GenericMessage [payload={"source":"QueueTester","message":"This is a wonderful 
    message send by queue from Habanero to Salt. Spicy.","msisdn":"+639772108550"}, 
    headers={LogicalResourceId=salt_queue, ApproximateReceiveCount=1, 
    SentTimestamp=1523444620218, ....

Я пытался аннотировать параметр Запрос с помощью @Payload, но безуспешно. В настоящее время я также настроил конфигурацию AWS через Java, как показано ниже:

ConsuerAWSSQSConfig.java

@Configuration
public class ConsumerAWSSQSConfig {

@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer() {
    SimpleMessageListenerContainer msgListenerContainer = simpleMessageListenerContainerFactory()
            .createSimpleMessageListenerContainer();
    msgListenerContainer.setMessageHandler(queueMessageHandler());
    return msgListenerContainer;
}

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {
    SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
    msgListenerContainerFactory.setAmazonSqs(amazonSQSClient());
    return msgListenerContainerFactory;
}

@Bean
public QueueMessageHandler queueMessageHandler() {
    QueueMessageHandlerFactory queueMsgHandlerFactory = new QueueMessageHandlerFactory();
    queueMsgHandlerFactory.setAmazonSqs(amazonSQSClient());
    QueueMessageHandler queueMessageHandler = queueMsgHandlerFactory.createQueueMessageHandler();
    List<HandlerMethodArgumentResolver> list = new ArrayList<>();
    HandlerMethodArgumentResolver resolver = new PayloadArgumentResolver(new MappingJackson2MessageConverter());
    list.add(resolver);
    queueMessageHandler.setArgumentResolvers(list);
    return queueMessageHandler;
}

@Lazy
@Bean(name = "amazonSQS", destroyMethod = "shutdown")
public AmazonSQSAsync amazonSQSClient() {
    AmazonSQSAsync awsSQSAsync = AmazonSQSAsyncClientBuilder.standard().withRegion(Regions.AP_SOUTHEAST_1).build();
    return awsSQSAsync;
}
}

Что вы ребята думаете?

Почему? Имея две точки входа, вы пытаетесь объединить очень разные технологии с предположением, что источники Blackmagic всегда справятся с этим .. Очередь и маршруты HTTP и просто направляют их через общий компонент / службу. Что, если ваш HTTP API когда-нибудь понадобится изменить?

Darren Forsythe 11.04.2018 13:46
1
1
1 068
0

Другие вопросы по теме