My Configuration Class is below:-
@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());
}
}
The DTO is :-
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;
}
}
The Snippet for publishing the message is:-
TestDto testDto = new TestDto("test",200);
rabbitTemplate.convertAndSend("neuw.direct.exchange","type", testDto);
And the snippet to listen the message is:-
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());
}
The issue is the logs here are not coming up
but if I try with The snippet below then it works:-
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");
}
it does goes to the logs but how to get the TestDto in that case? If I am doing something wrong in the configuration or not using the listner correctly? Need some resolution on this issue
Problem solved with issue with the constructor of the POJO class - no default constructor, now the resolution was either to have a default one or have a constructor with @JsonCreator
Example:-
@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;
}