有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何嵌套Spring JMS消息转换器

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

问题在于写入fromMessage()。我可以将有效负载转换回字符串,但是我想创建一个“虚拟”文本消息,将字符串填充到其中,然后传递给子MessageConverter的fromMessage()方法。在这里,我遇到了麻烦,因为如果没有JMS会话对象,我无法创建TextMessage,而且在这种上下文中似乎根本无法获取会话

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

我即将在这段代码中创建一个私有TextMessage实现,只是为了包装子MessageConverter的字符串。该类将需要大量的虚拟方法来充实接口,所有这些类型都让baby Jesus哭了

有人能提出更好的办法吗


共 (2) 个答案

  1. # 1 楼答案

    事实上,我做了其中一个:

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

  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消息(以获取头等等),而无需尝试创建消息的伪(可能不符合JMS)实现