1

別の MessageConverter をラップできる MessageConverter クラスを作成したいと思います。この MessageConverter は、TextMessage を生成すると想定される子コンバーターを呼び出します。ペイロードを受け取り、それを GZIP 圧縮して、最終的に送信者に返される BytesMessage を作成します。

問題は fromMessage() の書き込みにあります。ペイロードを文字列に変換して戻すことはできますが、「ダミー」の TextMessage を作成して文字列を詰め込み、子 MessageConverter の fromMessage() メソッドに渡したいと考えています。JMS セッション オブジェクトなしでは TextMessage を作成できず、このコンテキストでセッションを取得する方法がまったくないように見えるため、ここで壁にぶつかっています。

追加のプロパティを作成して、このクラスにさらに多くのものを接続することもできますが、JMSTemplate オブジェクトからセッションを簡単に取得することさえできそうになく、他に何が必要か想像もつきません。

子 MessageConverter の文字列をラップするためだけに、このコード内にプライベート TextMessage 実装を作成しようとしています。そのクラスでは、インターフェースを具体化するために大量のダミー メソッドが必要になります。

誰かがより良い方法を提案できますか?

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);
}

次に、これらの1つを呼び出す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メッセージにアクセスできます(ヘッダーなどを取得するため)。

于 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
    }

Objective C が待ち遠しくなります。どうしてそれが可能なのでしょうか? :)

于 2008-10-27T23:19:50.560 に答える