从activemq主题检索后的消息转换

时间:2018-03-20 16:50:13

标签: jms activemq converter messaging spring-messaging

我想在使用ActiveMQ作为代理的微服务之间实现消息传递,但是在设置了每个应用程序之后,有一件事让我陷入困境。在我描述问题之前,我正在接近消息传递:

制片人配置:

@Slf4j
@Configuration
@EnableJms
public class JmsConfig {

  public static final String EBAY_TOPIC = "ebay.topic";

  @Bean
  public ActiveMQTopic destinationTopic() {

    return new ActiveMQTopic(EBAY_TOPIC);
  }

  @Bean
  public JmsListenerContainerFactory<?> connectionFactory(ConnectionFactory connectionFactory,
                                                          DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setPubSubDomain(true);
    return factory;
  }

  @Bean
  public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    return converter;
  }

  @Bean
  public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    jmsTemplate.setDefaultDestinationName(EBAY_TOPIC);
    jmsTemplate.setConnectionFactory(connectionFactory);
    jmsTemplate.setMessageConverter(messageConverter);
    jmsTemplate.setPubSubDomain(true);
    return jmsTemplate;
  }
}

制作人发送消息:

@RequiredArgsConstructor
@Slf4j
@RestController
@RequestMapping("/message")
public class IntercommunicationController {

  private final JmsTemplate jmsTemplate;

  @PostMapping("/send")
  public void sendMessageToOtherService(@RequestBody Message message) {
    jmsTemplate.convertAndSend(JmsConfig.EBAY_TOPIC, message);
  }
}

接收者配置:

@Configuration
@EnableJms
public class JmsConfig {

  public static final String EBAY_TOPIC = "ebay.topic";

  @Bean
  public JmsListenerContainerFactory<?> connectionFactory(ConnectionFactory connectionFactory,
                                                          DefaultJmsListenerContainerFactoryConfigurer configurer,
                                                          ErrorHandler errorHandler) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setErrorHandler(errorHandler);
    factory.setPubSubDomain(true);
    return factory;
  }

  @Bean
  public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    return converter;
  }
}

接收者实施:

@Slf4j
@Component
public class MessageListener {

  @JmsListener(destination = JmsConfig.EBAY_TOPIC, containerFactory = "connectionFactory")
  public void receiveMessage(@Payload Message receivedMessage) {
    log.info("Got message saying {}", receivedMessage);
  }
}

正在发送的POJO:

@NoArgsConstructor
@Data
public class Message {
  String content;
  String from;
}

问题:

一旦我尝试通过json POST对象并将其发送到主题上,我就会收到错误。一旦消息到达主题,消费者就不能处理消息的反序列化,因为在TypeIdPropertyName中是我发送给我试图接收的对象的不同包路径,它们是在两个应用程序中都是1:1,但我得到了:

2018-03-20 16:32:08.601 ERROR 1568 --- [enerContainer-1] c.g.g.s.c.config.MessageErrorHandler     : Listener method 'public void com.gft.graduate2018.sabb.client.listener.MessageListener.receiveMessage(client.domain.Message)' threw exception; nested exception is org.springframework.jms.support.converter.MessageConversionException: Failed to resolve type id [backend.model.dtos.Message]; nested exception is java.lang.ClassNotFoundException: backend.model.dtos.Message

解决这个问题的正确方法是什么?我最终可能会从字符串到对象编写自定义解析器,但这可能不是最好的解决方案。希望有人之前处理过它并可以帮助解决这个问题:)

1 个答案:

答案 0 :(得分:0)

请参阅...

__type

...在转换器上。

设置两侧的映射,因此split标题只包含一个标记,该标记从发送方的类名和接收方的类名映射。