代码之家  ›  专栏  ›  技术社区  ›  nsayer

如何嵌套Spring JMS消息转换器

  •  1
  • nsayer  · 技术社区  · 16 年前

    我想编写一个messageconverter类,它可以包装另一个messageconverter。此messageconverter将调用子转换器,假定子转换器生成一条textmessage。它将获取有效负载并gzip压缩它,创建一个字节消息,最终返回给发送者。

    写入frommessage()时出现问题。我可以将有效负载转换回字符串,但是接下来我想创建一个“虚拟”的文本消息,将字符串填充到中,然后传递给子messageconverter的frommessage()方法。在这里,我碰到了一堵砖墙,因为没有JMS会话对象,我无法创建一条文本消息,而且在这种情况下,似乎根本无法获取会话。

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

    为了包装子messageconverter的字符串,我即将在此代码中创建私有的textmessage实现。这个类需要大量的虚拟方法来充实接口,所有这些类型都会让小耶稣哭泣。

    有人能提出更好的方法吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   James Strachan    16 年前

    是否确实要将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消息(获取消息头等),而不必尝试创建伪(可能不符合JMS)消息实现?

        2
  •  0
  •   nsayer    16 年前

    实际上,我做了一个:

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