S2JMS 開発記 MessageEndpoint

MessageEndpoint のアクティブ化成功!! \(^o^)/
ActiveMQ のリソースアダプタを使って,Message Inflow によるメッセージの受信ができるようになりました.
これは S2JMS-Container のインフラとなる部分で,ここがちゃんと受信できるようになったのは個人的にとても意義深いのだ.
なんたって,JCA の仕様書読みながら試行錯誤って感じだったので,ちゃんとメッセージが受信できるまでは不安だったのです.
でもこれで一安心♪


S2JCA では,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
	"http://www.seasar.org/dtd/components23.dtd">
<components namespace="jms-activemq-cf">
	<include path="j2ee.dicon"/>
	<include path="jca.dicon"/>

	<component class="org.seasar.jca.deploy.impl.RarResourceAdapterDeployer">
		<property name="path">
			"ra/activemq-ra-3.2.1.rar"
		</property>
		<initMethod name="start"/>
		<destroyMethod name="stop"/>
	</component>
	
	<component class="org.seasar.jca.deploy.impl.MessageEndpointDeployer">
		<property name="activationSpecClassName">
			"org.activemq.ra.ActiveMQActivationSpec"
		</property>
		<initMethod name="setProperty">
			<arg>"destinationType"</arg>
			<arg>"javax.jms.Queue"</arg>
		</initMethod>
		<initMethod name="setProperty">
			<arg>"destination"</arg>
			<arg>"foo"</arg>
		</initMethod>
		<initMethod name="activate"/>
		<destroyMethod name="deactivate"/>
	</component>

	<component class="org.seasar.jca.mi.MessageEndpointFactory">
		<property name="endpointClass">
			@org.seasar.jca.mi.JmsMessageEndpointImpl@class
		</property>
	</component>

	<component class="org.seasar.jca.cm.jms.ActiveMQTest$MessageListenerImpl"/>
</components>

こんな dicon を用意すると,一番下に定義した ActiveMQTest$MessageListenerImpl (文字通り javax.jms.MessageListener を実装したクラス) の onMessage(Message) メソッドにメッセージが飛んできます.
ConnectionSession なんてまったく気にする必要なし!!
送信よりカッコいいじゃん♪
当然 JTA によるトランザクション制御付きで,スレッドプールを使って複数メッセージを並行にバッサバッサ捌いちゃいます.


最終的には,ActiveMQTest$MessageListenerImpl のところが S2JMS-Container の提供するクラスになります.
まだ動いたっていうレベルですが,ここまでできれば一安心.
まだ例外の扱いやロギングが手抜きしまくりなのですが,今日中 (一眠りした後) にコミットしようと思います.