我想编写一个可以包装另一个MessageConverter的MessageConverter类。此MessageConverter将调用子转换器,假定该子转换器生成TextMessage。它需要有效载荷并用GZIP对其进行压缩,从而创建BytesMessage,最终将其返回给发送方。
问题在于编写fromMessage()。我可以将有效负载转换回字符串,但是然后我想创建一个“虚拟” TextMessage,将字符串填充到其中,然后传递给子MessageConverter的fromMessage()方法。因为没有JMS会话对象就无法创建TextMessage,所以我遇到了麻烦,而且看来在这种情况下根本没有办法获得会话。
我可以创建其他属性来将更多内容连接到此类,但是看起来我什至无法轻松地从JMSTemplate对象获取会话,而且我无法想象还有什么需要。
我即将在此代码中创建私有TextMessage实现,只是为了包装子MessageConverter的字符串。该课程将需要大量的虚拟方法来充实界面,所有这些键入都会使婴儿耶稣哭泣。
谁能提出更好的方法?
最佳答案
您是否真的想将MessageConverter实例包装在其他MessageConverter实例中? MessageConverter的全部目的是将消息转换为其他内容(不是JMS消息)。它并不是真正设计用来链接它们的(每个步骤都会生成伪造的JMS消息)。
为什么不介绍自己的界面
interface MessageBodyConverter {
/** return a converted body of the original message */
Object convert(Object body, Message originalMessage);
}
然后,您可以创建一个MessageConverter来调用其中之一(然后可以嵌套至所需的深度)
class MyMessageConverter implements MessageConverter {
private final MessageBodyConverter converter;
public Object fromMessage(Message message) {
if (message instanceof ObjectMessage) {
return converter.convert(objectMessage.getObject(), message);
...
}
}
然后,您可以随意链接那些MessageBodyConverter对象,而且可以访问原始JMS消息(获取标头等),而不必尝试创建Message的伪(可能不符合JMS的)实现?