Reputation: 21
I'am stuyding a sample exemple, have one queue and 2 listeners from this queue, little question and the problem... When have much messages, supose the threads are killing yourself, when have low messages come normals
First Listener
@RabbitListener(queues = "FilaSoftware")
public void receiver(UsuarioModel fileBody) {
System.out.println("Mensagem Nome - " + fileBody.getNome() + " com a idade " + String.valueOf(fileBody.getIdade()));
}
Second Listener
@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()));
}
And return this values
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
Here my config file
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;
}
Here the publishers
@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);
}
Can give a help? :)
Note: I'am using random to generate values like 'idade (number)'
Upvotes: 1
Views: 4045
Reputation: 189307
This was added as an edit to the question by the OP. Because the question should remain a question, this is being moved to an answer. The OP should ideally accept this to mark the question as resolved.
Solved the problem with a classmapper to jackson in my consumer config
@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;
}
Changed my listeners for this:
@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()));
}
}
And this is the result:
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
Upvotes: 1