1

メッセージングフレームワークの構築を開始し、JMSMessageの作成にデコレーションパターンを使用することにしました。

class BaseMessage implements Message { ... }

抽象的な装飾

class AbstractDecoration implements Message {
   Message message;

   public AbstractDecoration(Message message) {
      this.message = message
   }
}

装飾例:

class JsonPayloadDecoration extends AbstractDecoration { ... }

使用例:

...

IMessage m = new BaseMessage(...);
m = new ExpireDecoration(m, 10, TimeUnit.MINUTES);
m = new TextPayloadDecoration(m, "Text!");
m = new CorrelationDecoration(m, "123456");
m = new PriorityDecoration(m, 9);
m = new NonPersistentDecoration(m);
m = new QueueDestinationDecoration(m, "JMSTEST.DECORATIONTEST1");
m = new ErrorHandlerDecoration(m, errorhandler, 1000);

// requestor handles MessageProducers
// m.send will create the real JMSMessage and use the requestor
// to send the message with a MessageProducer
m.send(requestor);

最初に、装飾のアイデア全体についていくつかの意見を聞きたいと思います。次に、私の本当の質問に答えたいと思います。errorhandlerofErrorHandlerDecorationにはタイムアウトがあります。timeoutいつ始めるべきですか?いつ作成されたのですか、それともいつm.send呼び出されたのですか?私はそれについて同僚と議論しています。

4

1 に答える 1

1

メッセージの送信に時間がかかりすぎると、「タイムアウト」がトリガーされませんか?sendコンストラクターがフィールドへの入力以外の特別なことを行っていない限り、おそらく呼び出されたときに開始する必要があります。

デコレータパターンを使用することの知恵についての質問について:デコレータパターンは、機能の順列を提供するのに最適です。これはあなたの場合のようです(ただし、この使用法はコードサンプルには含まれていません)。メッセージにデコレータを1つだけ適用する場合は、代わりにストラテジーパターンの使用を検討してください。

また、相互に排他的なデコレータにも注意してください。これらが多すぎると、どのデコレータがどのデコレータと互換性があるかを追跡するのが混乱する可能性があります。

コメントに応じて編集する:互換性のないデコレータが一緒に使用されていないことを確認する1つの方法は、これまでにオブジェクトに適用されたデコレータのリストを取得し、競合が発生したときに例外をスローすることです。デコレータのリストを取得するには、次のメソッドをAbstractDecorationに追加します。

List<AbstractDecoration> getDecorations() {
    List<AbstractDecoration> decorations;
    if (message instanceof AbstractDecoration) {
        decorations = ((AbstractDecoration) message).getDecorations();
    }
    else {
        decorations = new ArrayList<AbstractDecoration>();
    }

    decorations.add(this);
    return decorations;
}

したがって、デコレータのリストをすでに適用したら、それぞれのデコレータのinstanceofをチェックするだけで、競合を検出できます。問題の相互に排他的なデコレータの両端でこれを行う必要があることに注意してください。そうしないと、デコレータが一方の順序で適用された場合、もう一方の順序で適用された場合、この検証は行われません。

少しハックのように感じます。私はデコレータパターンのプロではないので、この問題を解決するための標準が何であるかわかりません。私はその場でこれを思いついた。

編集:これについてもう少し考えた後、AbstractDecorationのコンストラクターでこの検証を行う方が理にかなっているかもしれません。次に、ルールが一元化され、別のクラスに委任することもできます。

于 2013-03-13T10:44:10.277 に答える