如何嵌套Spring JMS MessageConverters

时间:2008-10-27 19:48:31

标签: java spring jms

我想编写一个可以包装另一个MessageConverter的MessageConverter类。此MessageConverter将调用子转换器,假定生成TextMessage。它需要有效载荷和GZIP压缩它,创建一个BytesMessage,最终返回给发送者。

问题在于写入fromMessage()。我可以将有效负载转换回字符串,但后来我想创建一个“虚拟”TextMessage来填充字符串然后传递给子MessageConneverter的fromMessage()方法。在那里我碰到了一堵砖墙,因为我不能在没有JMS会话对象的情况下创建一个TextMessage,而且似乎根本无法在这种情况下获得会话。

我可以创建其他属性来将更多东西连接到这个类,但看起来我甚至不能轻易地从JMSTemplate对象获取会话,我无法想象还有什么我需要拥有的

我即将在此代码中创建一个私有TextMessage实现,只是为了包装子MessageConneverter的字符串。那个课程需要大量的虚拟方法来充实界面,所有这些打字都会让小耶稣哭泣。

有人能建议更好的方法吗?

2 个答案:

答案 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.这怎么可能? :)