Несколько слушателей из одной очереди RabbitMQ Spring - PullRequest
0 голосов
/ 24 апреля 2019

Я занимаюсь примером примера, у меня есть одна очередь и 2 слушателя из этой очереди, небольшой вопрос и проблема ... Когда у вас много сообщений, предположите, что потоки убивают себя, когда низкое количество сообщений приходит в норму

Первый прослушиватель

@RabbitListener(queues = "FilaSoftware")
    public void receiver(UsuarioModel fileBody) {
        System.out.println("Mensagem Nome - " + fileBody.getNome() + " com a idade " + String.valueOf(fileBody.getIdade()));

    }

Второй прослушиватель

@RabbitListener(queues = "FilaSoftware")
    public void receiver(AlunoModel aluno) {
        System.out.println("Aluno Nome - " + String.valueOf(aluno.getNomeAluno()) + " sala - " + String.valueOf(aluno.getSalaAluno()) + " numero - " + String.valueOf(aluno.getNumeroAluno()));

    }

И вернуть это значение

Mensagem Nome - null com a idade 0
Aluno Nome - Aluno 99 sala - 99 numero - 99
Mensagem Nome - Usuario numero 75 com a idade 75
Aluno Nome - Aluno 39 sala - 39 numero - 39
Mensagem Nome - null com a idade 0
Aluno Nome - Aluno 80 sala - 80 numero - 80
Mensagem Nome - null com a idade 0
Aluno Nome - null sala - 0 numero - 0
Mensagem Nome - null com a idade 0
Aluno Nome - Aluno 40 sala - 40 numero - 40
Mensagem Nome - null com a idade 0
Aluno Nome - Aluno 8 sala - 8 numero - 8
Mensagem Nome - Usuario numero 89 com a idade 89
Aluno Nome - Aluno 67 sala - 67 numero - 67

Здесь мой файл конфигурации

 private static final String QUEUE_SOFTWARE = "FilaSoftware";

    @Bean
    Queue queueSoftware() {
        return new Queue(QUEUE_SOFTWARE, false);
    }

    @Bean
    Exchange exchangeDefault() {
        return ExchangeBuilder.topicExchange("ExchangeSoftware")
                .durable(false)
                .autoDelete()
                .build();
    }

    @Bean
    Binding binding() {
        return BindingBuilder.bind(queueSoftware())
                .to(exchangeDefault())
                .with("keyAPI")
                .noargs();
    }

    @Bean
    public Jackson2JsonMessageConverter listnerMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

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

Здесь издатели

@Scheduled(fixedDelay = 250L)
    public void runAluno() {
            System.out.println("Publicando mensagem aluno na mensageria");
            Random random = new Random();
            int randomNum = random.nextInt(100);
            AlunoModel alunoModel = new AlunoModel();
            alunoModel.setNomeAluno("Aluno " + String.valueOf(randomNum));
            alunoModel.setNumeroAluno(randomNum);
            alunoModel.setSalaAluno(randomNum);
            rabbitTemplate.convertAndSend("ExchangeSoftware", "keyAPI", alunoModel);
    }

    @Scheduled(fixedDelay = 1000L)
    public void runUsuario() {

            System.out.println("Publicando mensagem usuario na mensageria");
            UsuarioModel usuarioModel = new UsuarioModel();
            Random random = new Random();
            int randomNum = random.nextInt(100);
            usuarioModel.setNome("Usuario numero " + String.valueOf(randomNum));
            usuarioModel.setIdade(randomNum);
            rabbitTemplate.convertAndSend("ExchangeSoftware", "keyAPI", usuarioModel);
    }

Можете помочь?:)

Примечание: я использую random для генерации значений типа 'idade (number)'

1 Ответ

0 голосов
/ 25 апреля 2019

Это было добавлено в качестве редактирования вопроса ОП.Поскольку вопрос должен оставаться вопросом, он переносится на ответ.ОП в идеале должен принять это, чтобы пометить вопрос как решенный.

Решил проблему с классом для Джексона в моей конфигурации потребителя

@Bean
    public Jackson2JsonMessageConverter listnerMessageConverter(){
        Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
        DefaultClassMapper classMapper = new DefaultClassMapper();

        Map<String, Class<?>> idClassMapping = new HashMap<String, Class<?>>();
        idClassMapping.put(
                "com.rabbitmq.example.AlunoModel", AlunoModel.class);
        idClassMapping.put(
                "com.rabbitmq.example.UsuarioModel", UsuarioModel.class);
        classMapper.setIdClassMapping(idClassMapping);
        converter.setClassMapper(classMapper);

        return converter;
    }

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

Изменил мои слушатели для этого:

@Component
@RabbitListener(queues = "FilaSoftware")
public class EventFilter {

    private final static Logger logger = LoggerFactory.getLogger(EventFilter.class);

    @RabbitHandler
    public void receiver(UsuarioModel fileBody) {
        System.out.println("Mensagem Nome - " + fileBody.getNome() + " com a idade " + String.valueOf(fileBody.getIdade()));
    }

    @RabbitHandler
    public void receiver(AlunoModel aluno) {
        System.out.println("Aluno Nome - " + String.valueOf(aluno.getNomeAluno()) + " sala - " + String.valueOf(aluno.getSalaAluno()) + " numero - " + String.valueOf(aluno.getNumeroAluno()));
    }
}

И вот результат:

Mensagem Nome - Usuario numero 70 com a idade 70
Aluno Nome - Aluno 83 sala - 83 numero - 83
Aluno Nome - Aluno 56 sala - 56 numero - 56
Aluno Nome - Aluno 48 sala - 48 numero - 48
Aluno Nome - Aluno 24 sala - 24 numero - 24
Mensagem Nome - Usuario numero 7 com a idade 7
Aluno Nome - Aluno 44 sala - 44 numero - 44
Aluno Nome - Aluno 70 sala - 70 numero - 70
Aluno Nome - Aluno 55 sala - 55 numero - 55
Aluno Nome - Aluno 96 sala - 96 numero - 96 
...