我想在使用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
解决这个问题的正确方法是什么?我最终可能会从字符串到对象编写自定义解析器,但这可能不是最好的解决方案。希望有人之前处理过它并可以帮助解决这个问题:)
答案 0 :(得分:0)
请参阅...
__type
...在转换器上。
设置两侧的映射,因此split
标题只包含一个标记,该标记从发送方的类名和接收方的类名映射。