JBossSeam2.2.0GAでJMS

まずメッセージを送る方(JMSプロデューサー側)

使えるqueue,topicがアプリケーションサーバのJNDIに登録されているのを前提とします。

components.xmlに以下を追加:

に「xmlns:jms="http://jboss.com/products/seam/jms"」を追加し、「xsi:schemaLocation=」に「http://jboss.com/products/seam/jms http://jboss.com/products/seam/jms-2.2.xsd」を追加。




jms-2.2.xsdは、seamの中の以下に入っているのを参照ください。といっても設定できる項目はほぼ上記に書いたものだけですが。
jboss-seam-2.2.0.GA/src/main/org/jboss/seam/jms-2.2.xsd

queue-connection、topic-connectionにはnameを設定しない方が無難です。
queueSession、topicSessionを生成する際にデフォルトのqueue-connection、topic-connectionを使用するため、自分で名前を付けたqueue-connection、topic-connectionがあると、それと別にデフォルトのqueue-connection、topic-connectionをJNDI名:UIL2ConnectionFactoryを使って生成しようとします。
(JBossAS5.1環境ではJBossMQでなくJBossMessagingが組み込まれており、UIL2ConnectionFactoryは存在しないため、エラーになります…)

JMSメッセージを送信する方のSeamコンポーネントでは以下のようにします。

@In private QueueSender myQueueSender;
@In private QueueSession queueSession;

インジェクションは名前ベースで行われますので、
components.xmlで定義するmanaged-queue-sender/managed-topic-publisherのnameと変数名は一致させる必要があります。敢えて一致させない場合は@Inアノテーションの属性value="xxxx"で名前を指定しないといけません。
QueueSession/TopicSessionは固定でqueueSession/topicSessionという名前で生成されますので
その名前の変数を用意します。

QueueSession/TopicSessionの生成時にオプション(トランザクション管理,配信完了通知モード)を指定できないのかな?と思い
jboss-seam-2.2.0.GA/src/main/org/jboss/seam/jms/
に同名クラスがあるので見てみると、

//TODO: i really want a transactional session!

というコメントと共に、ソースコードにがっちり
createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

と書いてあります。

変更してみたい時、ここを変えてseam自体を再ビルドするのはさすがに面倒。
自力でcreateQueueSession/createTopicSessionする方が早いですね。

QueueSession queueSession = org.jboss.seam.jms.QueueConnection.instance().createQueueSession(true,Session.CLIENT_ACKNOWLEDGE);
//myQueueSenderはインジェクトされたQueueSender
QueueSender queueSender = queueSession.createSender(myQueueSender.getQueue());

これでcomponents.xmlにJNDI名の設定を外出しにしつつ、自由にオプションを設定できます。