繁体   English   中英

Spring Rabbit MQ侦听器问题

[英]Spring Rabbit MQ listener issues

我的配置类别如下:-

@Configuration
@EnableRabbit
public class NeuwMessagingConfig implements RabbitListenerConfigurer {

private Logger logger = Logger.getLogger(this.getClass());

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    connectionFactory.setPort(5672);
    return connectionFactory;
}


@Bean
public AmqpAdmin amqpAdmin() {
    RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
    return rabbitAdmin;
}

@Bean
public Queue myQueue() {
    return new Queue("event", true);
}


@Bean
public DirectExchange directExchange(){
    DirectExchange directExchange = new DirectExchange("neuw.direct.exchange",true,false);
    return directExchange;
}


@Bean
public Binding binding() {
    Binding binding = BindingBuilder
            .bind(new Queue("event"))
            .to(directExchange()).with("type");
    return binding;
}

@Bean()
public RabbitListenerContainerFactory listenerFactory(){
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setMessageConverter(jsonMessageConverter());
    return factory;
}

@Bean
public MappingJackson2MessageConverter consumerJackson2MessageConverter() {
    return new MappingJackson2MessageConverter();
}

@Bean
public MessageConverter jsonMessageConverter(){
    Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
    /*DefaultClassMapper classMapper = new DefaultClassMapper();
    messageConverter.setClassMapper(classMapper);*/
    return messageConverter;
}

@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setMessageConverter(jsonMessageConverter());
    return rabbitTemplate;
}


@Bean
public MappingJackson2MessageConverter jackson2Converter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setObjectMapper(new ObjectMapper());
    return converter;
}

@Bean
public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() {
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
    factory.setMessageConverter(jackson2Converter());
    return factory;
}


@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
    registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
}
}

DTO是:-

public class TestDto {

private String message;
private int code;

@JsonProperty(value = "co-relation-id")
private String coRelationID;

public TestDto(String message, int code) {
    this.message = message;
    this.code = code;
    UUID uuid = UUID.randomUUID();
    this.coRelationID = uuid.toString();
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public int getCode() {
    return code;
}

public void setCode(int code) {
    this.code = code;
}

public String getCoRelationID() {
    return coRelationID;
}

public void setCoRelationID(String coRelationID) {
    this.coRelationID = coRelationID;
}
}

发布消息的代码段为:-

TestDto testDto = new TestDto("test",200);

rabbitTemplate.convertAndSend("neuw.direct.exchange","type", testDto);

收听消息的代码段是:

private Logger logger = Logger.getLogger(this.getClass());

@RabbitListener(queues = "event", containerFactory = "listenerFactory")
public void Test(Message<TestDto> testDto){
    logger.info("TEST info "+testDto.getPayload().getCoRelationID());
    logger.error("TEST error "+testDto.getPayload().getCoRelationID());
    logger.warn("TEST warn "+testDto.getPayload().getCoRelationID());
    logger.debug("TEST debug "+testDto.getPayload().getCoRelationID());
    logger.trace("TEST trace "+testDto.getPayload().getCoRelationID());
}

问题是这里的日志没有显示

但是,如果我尝试使用下面的代码段,那么它会起作用:-

public void Test(Object testDto){
   logger.info("TEST info");
   logger.error("TEST error");
   logger.warn("TEST warn");
   logger.debug("TEST debug");
   logger.trace("TEST trace");
}

它确实去了日志,但是在这种情况下如何获取TestDto? 如果我在配置中做错了事还是没有正确使用列表器? 需要一些解决方案

通过POJO类的构造函数解决了问题-没有默认的构造函数,现在的解决方案是使用默认的或使用@JsonCreator构造函数

例:-

@JsonCreator
public TestDto(@JsonProperty("message") String message,
               @JsonProperty("code") int code,
               @JsonProperty(value = "co-relation-id") String coRelationID) {
        this.message = message;
        this.code = code;
        this.coRelationID = coRelationID;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM