Seasar DI Container with AOP

トランザクション連携

S2Maiには、メール送信処理をトランザクションと連携する機能があります。同一トランザクション内で送信されたメールは、トランザクションがコミットされた時点で送信されるようになります。

概要

例えば、ある1つのトランザクション内に以下のような順番で処理があるとします。

update1(); // DBへの更新

mai.sendMail1(dto);

update2(); //DBへの更新

mai.sendMail2(dto2);

update1で更新が成功し、update2で更新が失敗してロールバックがかかった場合、通常は、sendMail2()は実行されませんが、sendMail1()は実行され、メールは送信されます。

トランザクションがロールバックされた場合、sendMail1()とsendMail2()の両方の送信をストップしたい場合、つまり、トランザクションがコミットされて初めて全てのメールを送信したい場合、トランザクション連携機能を有効にします。

セットアップ

トランザクション連携を行うという事で、クラスパスに既にJTAの実装がある事を前提とします。

s2mai-x.x.x.jarの中にあるs2mai-core.diconを取り出し、ルートパッケージに置いて、下記の様に編集して下さい。

s2mai-core.dicon(編集前)
<components namespace="s2mai">
  <include path="org/seasar/mai/transport/transport.dicon"/>
  <!--<include path="org/seasar/mai/transport/transport-xa.dicon"/> -->
(以下略)
</components>
s2mai-core.dicon(編集後)
<components namespace="s2mai">
  <include path="org/seasar/mai/transport/transport-xa.dicon"/>
(以下略)
</components>

インクルードされている「transport.dicon」を「transport-xa.dicon」に置き換えるだけです。

また、トランザクション境界となっているコンポーネントに、アスペクトを追加します。例えば、HogeServiceImplをトランザクション境界とした場合、以下にようになります。

<components>
    <include path="j2ee.dicon"/>
    <include path="s2mai.dicon"/>

    <component class="com.example.HogeServiceImpl">
        <aspect>j2ee.requiresNewTx</aspect>
        <aspect>s2mai.XAResourceSortInterceptor</aspect>
    </component>
</components>

SMART deployの場合は、以下のようなAspectCustomizerを定義して、トランザクション境界となっている層のCustomizerにaddCustomizerで追加するとよいでしょう。

<component class="org.seasar.framework.container.customizer.AspectCustomizer">
  <initMethod name="addInterceptorName">
    <arg>"s2mai.XAResourceSortInterceptor"</arg>
  </initMethod>
</component>

これでトランザクション連携が行われます。