Изменить тип получаемого объекта с помощью SQS и JMS - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь получить сообщения из очереди SQS локального стека из проекта Spring Boot, используя spring-cloud-starter-aws-messaging

Config

@Configuration
public class SQSConfig {

private final SQSConnectionFactory connectionFactory;


public SQSConfig() {
    connectionFactory = SQSConnectionFactory.builder()
            .withEndpoint("http://localhost:4576")
            .withAWSCredentialsProvider(new StaticCredentialsProvider(
                    new BasicAWSCredentials("", "")
            ))
            .build();
}


@Bean
public JmsListenerContainerFactory jmsListenerContainerFactory(){
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

    factory.setConnectionFactory(this.connectionFactory);
    factory.setDestinationResolver(new DynamicDestinationResolver());
    factory.setConcurrency("3-10");
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    factory.setMessageConverter(messageConverter());

    return factory;
}

@Bean
public MessageConverter messageConverter() {

    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);

    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setObjectMapper(builder.build());
    converter.setTargetType(MessageType.OBJECT);

}

Услуги:

@Service
public class QueueService {

@JmsListener(destination = "myqueuename")
public String listen(Object message){
    System.out.println(message);
    return null;
}
}

Системный администратор показывает мне, что объект, который я получаю, - SQSTextMessage

com.amazon.sqs.javamessaging.message.SQSTextMessage@8390af8

Чтобы я мог сделать это:

@JmsListener(destination = "e-legajo")
public String listen(SQSTextMessage message){
    try {
        String message1 = message.getText();
    } catch (JMSException e) {
        e.printStackTrace();
    }
    System.out.println(message);
    return null;
}

И работа с сообщением String.

Но вот мои сомнения. Я видел, что amazon также предоставляет другие типы сообщений, такие как SQSObjectMessage и SQSBytesMessages, я пытаюсь выяснить, как использовать SQSObjectMessage, чтобы я мог напрямую получать объект Java, но не могу найти способ.

Я не нашел ни одного примера этой реализации, и, поскольку я впервые с очередями в целом (SQS или JMS), я не знаю, кто отвечает за это, JMSListener, MessageConverter или любой другой другой боб AWS JDK, создающий магию в середине?

...