S2JMS on GlassFish その2

前回はうっかりS2JTAのままで動かしてしまったので、今回はアプリケーションサーバ側のJTAを使って動かしたいと思います。

s2container.dicon

Sun Java System Application Server用の設定ファイルが用意されているようなので、それを使うように変更します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="cooldeploy.dicon"/>
    <component class="org.seasar.framework.container.factory.SimplePathResolver">
  		<initMethod name="addRealPath">
    		<arg>"jta.dicon"</arg>
    		<arg>"jta-sun9.dicon"</arg>
  		</initMethod>
	</component>
</components>
JmsPage.java

画面はロールバック感を出すために、基本的に1〜10を送信するがXが入力された場合だけ10を送信せずに例外を投げるように変更。また、受信側もタイムアウトの設定を追加。

package hatena.beerman.web.jms;

import org.seasar.jms.core.MessageReceiver;
import org.seasar.jms.core.MessageSender;

public class JmsPage {

	public String sendMessage;

	public String recieveMessage;

	public MessageSender messageSender;

	public MessageReceiver messageReceiver;

	public javax.jms.ConnectionFactory connectionFactory;

	public void doSend() {
		final int LOOP = 10;
		final String ROLL_BACK = "X";
		for (int i = 1; i <= LOOP; i++) {
			if (i == LOOP && ROLL_BACK.equals(sendMessage)) {
				throw new RuntimeException();
			} else {
				messageSender.send(String.valueOf(i));
			}
		}
	}

	public void doRecieve() {
		final long TIMEOUT = 1000L;
		recieveMessage = messageReceiver.setTimeout(TIMEOUT).receiveText();
	}
}

今回も無事動きました!と言いたいところでしたが、TransactionManagerのlookupに失敗してしまいました。TransactionManagerの部分は

@org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:appserver/TransactionManager")

とやるのが正解みたいです。という訳でそこだけ書き換えたjta-sun9.diconを用意してみたところ無事に動きました!