S2JMS開発記 - ヘッダとプロパティのマッピングを考える

メッセージのペイロードに関するマッピングが一通り検討し終わったので、ヘッダとプロパティのマッピングについても検討していきます。

プロパティのマッピング

プロパティの方が簡単そうなので、まずはこちらから。

JMSのメッセージには、「追加ヘッダ」という位置づけのプロパティが存在します。本来は、これを元にしてメッセージ配信時のフィルタリングを行ったりするのに利用しますが、アプリケーション側からもプロパティを参照することができます。(私自身、本格的にJMSを利用したことがないので、アプリケーション側からプロパティを参照する可能性がどのくらいあるのかわかりませんが)

プロパティはJavaのMapと同じように「名前=値」形式で格納されているので、単純にPOJO側に同じ名前のプロパティが存在していれば、セットしてあげます(S2JSFとまったく同じですね)。

例えば、

message.setStringProperty("name", "foo");

とセットされたプロパティは、POJO側に以下のメソッドが存在すれば自動的にせっとされます。

public void setName(String name)

メッセージが持つプロパティの型と、POJOが持つプロパティの型が一致しない場合は、JMSの型変換規則に従って変換するものとします。

あと、検討事項が一つ。メッセージがMapMessageの場合、ペイロードとプロパティに同じ名前の要素が存在した場合、どのように扱うか決めておく必要があります。基本は、ペイロード側優先でよいかな。

ヘッダのマッピング

JMSのメッセージが持つヘッダには、以下のようなものがあります。

  • Destination JMSDestination
  • int JMSDeliverMode
  • String JMSMessageID
  • long JMSTimestamp
  • long JMSExpiration
  • boolean JMSRedelivered
  • int JMSPriority
  • Destination JMSReplyTo
  • String JMSCorrelationID

このうち、送信先を意識する JMSDestination と JMSReplyTo 以外は、そのままPOJO側の同名のプロパティにマッピングします。

これで、ヘッダ、プロパティ、ペイロードマッピングまで検討しました。だいぶ多くのマッピングが出てきましたが、基本的にはPOJO側に存在する set*** メソッドに対して、***の部分に対応するものが存在するかどうかをペイロード、プロパティ、ヘッダの順で探していくだけです。

POJOを作る側は、必要なプロパティだけを用意したPOJOを用意するだけ。setter の作成が面倒なら、それこそ PropertyInterType が使えそうです。