Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何嵌套Spring JMS消息转换器_Java_Spring_Jms - Fatal编程技术网

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

Java 如何嵌套Spring JMS消息转换器,java,spring,jms,Java,Spring,Jms,我想写一个MessageConverter类,它可以包装另一个MessageConverter。此MessageConverter将调用子转换器,该子转换器假定生成TextMessage。它将获取有效负载并对其进行GZIP压缩,从而创建一条BytesMessage,最终返回给发送方 问题在于写入fromMessage()。我可以将有效负载转换回字符串,但是我想创建一个“虚拟”文本消息,将字符串填充到其中,然后传递给子MessageConverter的fromMessage()方法。在这里,我遇到

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

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

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

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


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

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

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

是否确实要将MessageConverter实例包装到其他MessageConverter实例中?MessageConverter的全部要点是将消息转换为其他消息(这不是JMS消息)。它并不是真正用来链接它们的(每一步都会生成一条虚假的JMS消息)

为什么不引入自己的界面呢

interface MessageBodyConverter {
  /** return a converted body of the original message */
  Object convert(Object body, Message originalMessage);
}
然后,您可以创建一个MessageConverter,调用其中一个(然后可以嵌套到任意深度)


然后,您可以将这些MessageBodyConverter对象链接到您喜欢的最深位置,并且您可以访问原始JMS消息(以获取标题等),而无需尝试创建消息的伪(可能不符合JMS)实现?

我可以这样做,但关键是通过将GZIP压缩MessageConverter连接到位,使GZIP在运行时压缩JMS消息体成为可选的。这样我就不用在现有的MessageConverter中编写if/then/else代码了。哦,如果我实现了JMS TextMessage接口,并且如果除了setText()和getText()之外的所有方法都传递到真正的JMS消息,它怎么可能不兼容JMS呢?只要您将几乎所有的消息API委托给真正的JMS消息,您就应该可以了;但从价值的角度看,这听起来像是一堆工作,但收效甚微。e、 为什么不添加自己的支持链接的API而不必包装每条消息?在下面使用gzip的同时,您打算如何实现TextMessageAPI?那么,您不需要将TextMessage外观到ObjectMessage上吗?顺便说一句,gzip压缩通常是JMS提供程序在幕后为您所做的事情——ActiveMQThis converter肯定是这样的。该转换器从子级接收文本消息,gzip是主体,并在其位置发送ByteMessage。在返回的过程中,它接收ByteMessage,提取并解压缩正文,用未压缩的内容将原始消息包装在FakeTextMessage中,并将其发送给孩子。
class MyMessageConverter implements MessageConverter {
  private final MessageBodyConverter converter;

  public Object fromMessage(Message message) {
    if (message instanceof ObjectMessage) {
       return converter.convert(objectMessage.getObject(), message);
    ...
  }
}