Как вложить Spring JMS MessageConverters - PullRequest
1 голос
/ 27 октября 2008

Я хотел бы написать класс MessageConverter, который может обернуть другой MessageConverter. Этот MessageConverter вызвал бы дочерний конвертер, который, как предполагается, генерирует TextMessage. Он берет полезную нагрузку и GZIP сжимает ее, создавая сообщение BytesMessage, которое в конечном итоге возвращается отправителю.

Проблема в письменной форме из сообщения (). Я могу преобразовать полезную нагрузку обратно в строку, но затем я хочу создать «фиктивное» TextMessage, чтобы вставить строку, чтобы затем передать ее методу fromMessage () дочернего MessageConverter. Там я бью кирпичную стену, потому что не могу создать TextMessage без объекта сеанса JMS, и кажется, что вообще нет способа получить сеанс в этом контексте.

Я мог бы создать дополнительные свойства, чтобы связать больше вещей с этим классом, но не похоже, что я могу легко получить сеанс из объекта JMSTemplate, и я не могу представить, что еще мне нужно .

Я нахожусь на пороге создания частной реализации TextMessage в этом коде только для того, чтобы обернуть строку для дочернего MessageConverter. Этому классу потребуются тонны фиктивных методов, чтобы конкретизировать Интерфейс, и все это печатание заставляет младенца Иисуса плакать.

Кто-нибудь может предложить лучший способ?

Ответы [ 2 ]

2 голосов
/ 28 октября 2008

Вы действительно хотите обернуть экземпляры 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-совместимые) реализации Message? 1009 *

0 голосов
/ 28 октября 2008

Итак, я сделал одно из них:

    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. Как это возможно? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...