java - 如何在同一个项目中以不同方式配置两个rabbitlistener?

标签 java spring spring-boot rabbitmq spring-amqp

我有两个队列,每个队列上都有消息。队列一有鸟类对象,队列二有观鸟对象。我正在使用默认类映射器将消息转换回对象。有没有办法让我在我的两个兔子监听器上添加不同的配置。

我的听众。

 @Qualifier("bird")
@RabbitListener(queues = "vogels")
public void receiveBird(Bird in)  
    BirdSpotting birdSpotting = new BirdSpotting();
    birdSpotting.setBird(in);
    rabbitTemplate.convertAndSend("vogelspottings",birdSpotting);
}

@Qualifier("birdspotting")
@RabbitListener(queues = "vogelspottingmetlocatie")
public void receiveBirdWithLocation(BirdSpotting birdSpotting){
    service.saveBirdSpotting(birdSpotting);

}

我的配置类。

@Configuration
@EnableRabbit
public class RabbitConf2 implements RabbitListenerConfigurer {
    @Autowired
    DefaultClassMapper mapper;


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

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


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

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

    @Bean
    public Jackson2JsonMessageConverter producerJackson2MessageConverterService2() {
        final Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        jackson2JsonMessageConverter.setClassMapper(mapper);

        return jackson2JsonMessageConverter;
    }

我的两个队列的两个默认类映射器:

@Bean(value = "bird")
    public DefaultClassMapper classMapperService2() {
        DefaultClassMapper classMapper = new DefaultClassMapper();
        Map<String, Class<?>> idClassMapping = new HashMap<>();
        idClassMapping.put("be.kdg.birdgeneratorservice.Bird", Bird.class);
        classMapper.setIdClassMapping(idClassMapping);
        return classMapper;
    }

    @Bean(value = "birdspotting")
    public DefaultClassMapper classMapperService3() {
        DefaultClassMapper classMapper = new DefaultClassMapper();
        Map<String, Class<?>> idClassMapping = new HashMap<>();
        idClassMapping.put("be.kdg.locationservice.BirdSpotting", BirdSpotting.class);
        classMapper.setIdClassMapping(idClassMapping);
        return classMapper;
    }

最佳答案

您需要再引入一个具有适当配置的 RabbitListenerContainerFactory bean,并使用第二个 @RabbitListener 中的名称:

/**
 * The bean name of the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
 * to use to create the message listener container responsible to serve this endpoint.
 * <p>If not specified, the default container factory is used, if any.
 * @return the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
 * bean name.
 */
String containerFactory() default "";

通过这种方式,您将区分 Spring Boot 提供的默认选项,并为另一个用例提供您自己的自定义。

在文档中查看更多信息:https://docs.spring.io/spring-amqp/docs/2.1.4.RELEASE/reference/#async-annotation-driven

关于java - 如何在同一个项目中以不同方式配置两个rabbitlistener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54677152/

相关文章:

java - Mockito 中的 Spring @Value 字段注入(inject)

java - NoSuchMethodError : com. amazonaws.services.s3.model.S3ObjectInputStream.readAllBytes()

java - 如何从 2 个不同的父项创建 Maven 模块?

java - 动态识别测试类

java - 通过jar启动应用程序主类

java - Gradle 创建损坏的启动脚本。怎么修?

java - Android与Json获取数据

java - 即使在加载图像时,Spring Boot 应用程序也会为资源中的所有静态内容返回 401

spring - 在tomcat上更改spring mvc应用程序的应用程序根目录

java - 如何更改tomcat上的log4j2日志记录路径?