我想编写一个可以包装另一个MessageConverter的MessageConverter类。此MessageConverter将调用子转换器,假定生成TextMessage。它需要有效载荷和GZIP压缩它,创建一个BytesMessage,最终返回给发送者。
问题在于写入fromMessage()。我可以将有效负载转换回字符串,但后来我想创建一个“虚拟”TextMessage来填充字符串然后传递给子MessageConneverter的fromMessage()方法。在那里我碰到了一堵砖墙,因为我不能在没有JMS会话对象的情况下创建一个TextMessage,而且似乎根本无法在这种情况下获得会话。
我可以创建其他属性来将更多东西连接到这个类,但看起来我甚至不能轻易地从JMSTemplate对象获取会话,我无法想象还有什么我需要拥有的
我即将在此代码中创建一个私有TextMessage实现,只是为了包装子MessageConneverter的字符串。那个课程需要大量的虚拟方法来充实界面,所有这些打字都会让小耶稣哭泣。
有人能建议更好的方法吗?
答案 0 :(得分:2)
你真的想在其他MessageConverter实例中包装MessageConverter实例吗? MessageConverter的重点是将Message转换为其他东西(不是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)的Message实现? / p>
答案 1 :(得分:0)
事实上,我做了其中之一:
private static class FakeTextMessage implements TextMessage {
public FakeTextMessage(Message m) { this.childMessage = m; }
private String text;
private Message childMessage;
public void setText(String t) { this.text = t; }
public String getText() { return this.text; }
// All the rest of the methods are simply pass-through
// implementations of the rest of the interface, handing off to the child message.
public void acknowledge() throws JMSException { this.childMessage.acknowledge(); }
public void clearBody() throws JMSException { this.childMessage.clearBody(); }
public void clearProperties() throws JMSException { this.childMessage.clearProperties(); }
public Enumeration getPropertyNames() throws JMSException { return this.childMessage.getPropertyNames(); }
public boolean propertyExists(String pn) throws JMSException { return this.childMessage.propertyExists(pn); }
// and so on and so on
}
让我渴望目标C.这怎么可能? :)