---
schema_version: "1"
id: 7573f7f7260baf519989c54f121f7efe5a100a33b7f8ec60d0e8e0504a6c4113
title: トランザクションメッセージソース
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-sdk/1.1/sources-transactions.md
canonical_url: https://docs.mulesoft.com/jp/mule-sdk/1.1/sources-transactions
source_site: docs.mulesoft.com
content_type: documentation
content_hash: a00fdb7d62fe2bf9ee13b14d8ca231f0b0d009fcec4ce55208aba68b71a18619
description: MuleSoft Documentation Site
release: "1.1"
latest: false
---
# トランザクションメッセージソース

操作と同様に、メッセージソースではトランザクションがサポートされています。メッセージソースの例としては、JMS や VM Connector リスナーがあります。どちらのリスナーも、キューからメッセージを取得してフローにプッシュします。メッセージ処理が成功すると、トランザクションがコミットされます。失敗すると、トランザクションがロールバックされ、メッセージがキューに戻ります。

操作と同様に、メッセージソースはトランザクションになるように ​`TransactionalConnection`​ インターフェースを実装する接続種別で動作する必要があります。接続で ​`XATransactionalConnection`​ が実装されている場合、XA トランザクションも自動的にサポートされます。

例: トランザクションメッセージソース

```java
public class TransactionalSource extends Source<Serializable, Void> {

  @Connection
  private ConnectionProvider<MyTransactionalConnection> connectionProvider;

  ....
}
```

## [](#メッセージソースのトランザクションアクション)メッセージソースのトランザクションアクション

メッセージソースがトランザクションの場合、​`transactionalAction`​ という名前の合成パラメーターが自動的に追加されます。そのパラメーターは、次の値を取ることができる ​`enum`​ 型です。

- ALWAYS\_BEGIN​: 呼び出しごとに新しいトランザクションが作成されます。
- NONE: ソースがトランザクションを開始せずに、フローで開いているトランザクションに参加しないことを示します。

## [](#メッセージソースのトランザクション種別)メッセージソースのトランザクション種別

ソースで XA トランザクションがサポートされている場合、​`transactionType`​ パラメーターが追加されます。このパラメーターは、次の値を取ることができます。

- LOCAL: 通常のトランザクションを開始します。
- XA: 代わりに XA トランザクションを開始します。

## [](#トランザクションの処理)トランザクションの処理

SDK では、トランザクションは接続を介してモデル化されます。そのため、トランザクションごとに異なる接続インスタンスが必要になります。これは、メッセージソースでは並列性がサポートされている必要がありますが、同じ接続で異なる 2 つのトランザクションを同時に提供できないためです。

そのため、SDK ドキュメントの他の場所で使用されている HTTP リスナーサンプルとは異なるモデルが必要になります。そこで、VM Connector の ​`<vm:listener />`​ を使用する次の簡略化された例を考えてみましょう。

```java
public VMListener extends Source<Serializable, VMMessageAttributes> {

	@Connection
	private ConnectionProvider<QueueSession> sessionProvider;

	@Override
  public void onStart(SourceCallback<Serializable, VMMessageAttributes> sourceCallback) throws MuleException {
		while(notStopped()) {
			QueueSession session =  sessionProvider.connect(); (1)
      CallbackContext ctx = callback.createContext(); (2)
			TransactionHandle status = ctx.bindConnection(session); (3)

			try {
				callback.handle(session.poll(), ctx); (4)
			} catch (Exception e) {
				status.rollback();
			}
		}
	}

	@OnSuccess
	public void onSuccess(SourceCallbackContext context) {
		handleSuccess(context.getConnection()); (5)
	}

	@OnError
	public void onError(SourceCallbackContext context, Error error) {
		handleError(context, error);
	}
}
```

<table><tbody><tr><td><i class="conum" data-value="1"></i><b>1</b></td><td>複数の接続が取得されます。</td></tr><tr><td><i class="conum" data-value="2"></i><b>2</b></td><td>接続ごとに新しい​<code>CallbackContext</code>​ が作成されます。</td></tr><tr><td><i class="conum" data-value="3"></i><b>3</b></td><td>作成された ​<code>SourceCallbackContext</code>​ の ​<code>bindConnection()</code>​ メソッドを介して各接続がコンテキストに登録されます。</td></tr><tr><td><i class="conum" data-value="4"></i><b>4</b></td><td>コンテキストが ​<code>handle</code>​ メソッドに渡されます。</td></tr><tr><td><i class="conum" data-value="5"></i><b>5</b></td><td>接続は後で ​<code>SourceCallbackContext.getConnection()</code>​ メソッドを介してすべての ​<code>onSuccess</code>​、​<code>onError</code>​、​<code>onTerminate methods</code>​ で使用できるようになります。</td></tr></tbody></table>

接続はコンテキストにバインドされているため、Runtime は必要に応じて自動的に接続を終了します。接続がトランザクションで、ソースもトランザクションになるように設定されている場合、​`bindConnection()`​ メソッドをコールすると、その接続で自動的にトランザクションが開始されます。また、接続がトランザクションの場合、Runtime は ​`onSuccess()`​ メソッドの後に自動的にトランザクションをコミットしたり、​`onError()`​ メソッドの後にロールバックしたりします。

<table><tbody><tr><td class="icon"><i class="fa icon-tip" title="Tip"></i></td><td class="content">このケースでは、トランザクションはキューからメッセージをポーリングする前に開始する必要があります。接続の取得直後に ​<code>bindConnection()</code>​ をコールすることをお勧めします。</td></tr></tbody></table>

## [](#カスタムトランザクション処理)カスタムトランザクション処理

コネクタによっては、カスタムトランザクション処理を提供することが必要になる場合があります。たとえば、エラーの場合にエラー応答をパブリッシュしたいとします。この場合、ロールバックされると応答が宛先に到達しなくなるため、トランザクションをコミットする必要があります。

例: カスタムトランザクション処理

```java
  @OnError
  public void onError(SourceCallbackContext context, Error error) {
    ctx.getConnection().publish(buildErrorResponse(error)); (1)
    ctx.getTransactionHandle().commit(); (2)
  }
```

<table><tbody><tr><td><i class="conum" data-value="1"></i><b>1</b></td><td><code>onSuccess()</code>​ および ​<code>onError()</code>​ メソッドを実行するとき、接続はまだオープン状態です。</td></tr><tr><td><i class="conum" data-value="2"></i><b>2</b></td><td>コンテキストには、手動でトランザクションを操作できる ​<code>TransactionHandle</code>​ が設定されています。トランザクションを手動で解決する場合、Runtime でそのことが考慮され、後で自動的に解決されなくなります。最も一般的なユースケースでは、この作業を行う必要はありません。</td></tr></tbody></table>