1

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

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

我可以创建额外的属性来将更多的东西连接到这个类,但看起来我什至不能轻松地从 JMSTemplate 对象获取会话,而且我无法想象我还需要什么。

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

任何人都可以提出更好的方法吗?

4

2 回答 2

2

您真的想将 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)实现?

于 2008-10-28T06:16:04.853 回答
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。这怎么可能?:)

于 2008-10-27T23:19:50.560 回答