0

Outbound Channel Adapter を使用してエンティティを削除しようとすると、常にデタッチされたインスタンスの例外が削除されます。この例外を回避するには、同じトランザクションでエンティティを取得して削除する必要があることは知っていますが、Spring Integration でそれを実現するにはどうすればよいですか?

問題を実証するために、JPA サンプルを次のように変更しました。

PersonService.java

public interface PersonService {
    ...
    void deletePerson(Person person);
}

Main.java

private static void deletePerson(final PersonService service) {
    final List<Person> people = service.findPeople();
    Person p1 = people.get(0);
    service.deletePerson(p1);
}

spring-integration-context.xml

<int:gateway id="personService"
service-interface="org.springframework.integration.samples.jpa.service.PersonService"
    default-request-timeout="5000" default-reply-timeout="5000">
    <int:method name="createPerson" request-channel="createPersonRequestChannel"/>
    <int:method name="findPeople"   request-channel="listPeopleRequestChannel"/>
    <int:method name="deletePerson" request-channel="deletePersonChannel"/>
</int:gateway>

<int:channel id="deletePersonChannel"/>

<int-jpa:outbound-channel-adapter entity-manager-factory="entityManagerFactory"
channel="deletePersonChannel" persist-mode="DELETE" >
    <int-jpa:transactional transaction-manager="transactionManager" />
</int-jpa:outbound-channel-adapter>

deletePerson を呼び出すと、例外が発生します。

スレッド「メイン」での例外 java.lang.IllegalArgumentException: デタッチされたインスタンスの削除 org.springframework.integration.samples.jpa.Person#1001

アップデート:

Artem が行ったように、ここではプログラムで新しいトランザクションを作成し、関数呼び出しの取得と削除の両方をラップできるため、実際のプロジェクトに近いサンプルを選択する必要があったようです。

私のプロジェクトでは、アウトバウンドチャネルアダプターに接続されたトランスがあります。トランスフォーマーがエンティティーを取得し、outbound-channel-adapter がそれを削除します。この場合、Transformer と outbound-channel-adapter で同じトランザクションを使用するにはどうすればよいですか?

4

1 に答える 1

2

deletePersonそれを機能させるには、 to トランザクションですべての操作をラップする必要があります。

private static void deletePerson(final PersonService service) {
         new new TransactionTemplate(transactionManager)
       .execute(new TransactionCallbackWithoutResult() {

            protected void doInTransactionWithoutResult(TransactionStatus status) {
                 final List<Person> people = service.findPeople();
                 Person p1 = people.get(0);
                 service.deletePerson(p1);

            }
        });
}

この場合、どうにかしてメソッドtransactionManager Bean にも提供する必要があります。

アップデート:

元の質問でユースケースのサンプルを示しました。今再。<transformer>-> <jpa:outbound-channel-adapter>. これで、メッセージ フローが開始される場所を理解する必要があります。

  1. <inbound-channel-adapter>ポーラーを使用している場合は、<poller> <transactional>
  2. それなら<gateway>、誰が を呼び出す<transformer>ので、ゲートウェイのメソッドを次のようにマークするだけで十分です@Transactional
  3. もう 1 つのトランザクション アドバイストリックを次に示します。Spring Integration フロー内でトランザクションを保持します。

<transactional>すべての場合において、あなたはあなたから取り除くべきです<jpa:outbound-channel-adapter>

于 2013-10-07T18:17:18.253 に答える