受信チャネルアダプター

受信チャネルアダプターを使用して、JPA QL を使用してデータベースに対して選択クエリを実行し、結果を返します。メッセージのペイロードは、単一のエンティティまたはエンティティの List のいずれかです。次の XML は inbound-channel-adapter を構成します。

<int-jpa:inbound-channel-adapter channel="inboundChannelAdapterOne"  (1)
                    entity-manager="em"                              (2)
                    auto-startup="true"                              (3)
                    query="select s from Student s"                  (4)
                    expect-single-result="true"                      (5)
                    max-results=""                                   (6)
                    max-results-expression=""                        (7)
                    delete-after-poll="true"                         (8)
                    flush-after-delete="true">                       (9)
    <int:poller fixed-rate="2000" >
      <int:transactional propagation="REQUIRED" transaction-manager="transactionManager"/>
    </int:poller>
</int-jpa:inbound-channel-adapter>
1query 属性で JPA QL を実行した後、inbound-channel-adapter がメッセージ(ペイロードを含む)を置くチャネル。
2 必要な JPA 操作の実行に使用される EntityManager インスタンス。
3 アプリケーションコンテキストの起動時にコンポーネントが自動的に起動するかどうかを示す属性。値のデフォルトは true です。
4 結果がメッセージのペイロードとして送信される JPA QL
5 この属性は、JPQL クエリが結果で単一のエンティティを提供するか、エンティティの List を提供するかを示します。値が true に設定されている場合、単一のエンティティがメッセージのペイロードとして送信されます。ただし、これを true に設定した後に複数の結果が返される場合、MessagingException がスローされます。値のデフォルトは false です。
6 この非ゼロ、非負の整数値は、選択操作の実行時に、指定された行数を超える行を選択しないようアダプターに指示します。デフォルトでは、この属性が設定されていない場合、すべての可能なレコードがクエリによって選択されます。この属性は max-results-expression と相互に排他的です。オプション。
7 結果セット内の結果の最大数を見つけるために評価される式。max-results と相互に排他的。オプション。
8 クエリの実行後に受信した行を削除する場合は、この値を true に設定します。コンポーネントがトランザクションの一部として動作することを確認する必要があります。そうしないと、次のような例外が発生する可能性があります。java.lang.IllegalArgumentException: Removing a detached instance …​
9 受信したエンティティを削除した直後に永続コンテキストをフラッシュする場合、および EntityManager の flushMode に依存したくない場合は、この値を true に設定します。値のデフォルトは false です。

構成パラメーターのリファレンス

次のリストは、inbound-channel-adapter に設定できるすべての値を示しています。

<int-jpa:inbound-channel-adapter
  auto-startup="true"           (1)
  channel=""                    (2)
  delete-after-poll="false"     (3)
  delete-per-row="false"        (4)
  entity-class=""               (5)
  entity-manager=""             (6)
  entity-manager-factory=""     (7)
  expect-single-result="false"  (8)
  id=""
  jpa-operations=""             (9)
  jpa-query=""                  (10)
  named-query=""                (11)
  native-query=""               (12)
  parameter-source=""           (13)
  send-timeout="">              (14)
  <int:poller ref="myPoller"/>
 </int-jpa:inbound-channel-adapter>
1 このライフサイクル属性は、アプリケーションコンテキストの起動時にこのコンポーネントが自動的に起動するかどうかを示します。この属性のデフォルトは true です。オプション。
2 アダプターが、目的の JPA 操作の実行からのペイロードを含むメッセージを送信するチャネル。
3 選択されたレコードがアダプターによってポーリングされた後に削除するかどうかを示すブールフラグ。デフォルトでは、値は false です(つまり、レコードは削除されません)。コンポーネントがトランザクションの一部として動作することを確認する必要があります。そうしないと、java.lang.IllegalArgumentException: Removing a detached instance …​ などの例外が発生する場合があります。オプション。
4 レコードを一括で削除できるか、一度に 1 レコードずつ削除する必要があるかを示すブールフラグ。デフォルトでは、値は false です (つまり、レコードを一括削除できます)。オプション。
5 データベースから照会されるエンティティクラスの完全修飾名。アダプターは、エンティティクラス名に基づいて JPA クエリを自動的に構築します。オプション。
6JPA 操作の実行に使用される jakarta.persistence.EntityManager のインスタンス。オプション。
7JPA 操作を実行する jakarta.persistence.EntityManager のインスタンスを取得するために使用される jakarta.persistence.EntityManagerFactory のインスタンス。オプション。
8 選択操作が単一の結果を返すか、結果の List を返すかを示すブールフラグ。このフラグが true に設定されている場合、選択された単一のエンティティがメッセージのペイロードとして送信されます。複数のエンティティが返されると、例外がスローされます。false の場合、エンティティの List がメッセージのペイロードとして送信されます。値のデフォルトは false です。オプション。
9JPA 操作の実行に使用される org.springframework.integration.jpa.core.JpaOperations の実装。独自の実装を提供するのではなく、デフォルトの org.springframework.integration.jpa.core.DefaultJpaOperations 実装を使用することをお勧めします。entity-managerentity-manager-factoryjpa-operations 属性のいずれかを使用できます。オプション。
10 このアダプターによって実行される JPA QL。オプション。
11 このアダプターで実行する必要がある名前付きクエリ。オプション。
12 このアダプターによって実行されるネイティブクエリ。jpa-querynamed-queryentity-class または native-query 属性のいずれかを使用できます。オプション。
13 クエリのパラメーターの値を解決するために使用される o.s.i.jpa.support.parametersource.ParameterSource の実装。entity-class 属性に値がある場合は無視されます。オプション。
14 チャネルにメッセージを送信するときに待機する最大時間(ミリ秒)。オプション。

Java 構成を使用した構成

次の Spring Boot アプリケーションは、Java で受信アダプターを構成する方法の例を示しています。

@SpringBootApplication
@EntityScan(basePackageClasses = StudentDomain.class)
public class JpaJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(JpaJavaApplication.class)
            .web(false)
            .run(args);
    }

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Bean
    public JpaExecutor jpaExecutor() {
        JpaExecutor executor = new JpaExecutor(this.entityManagerFactory);
        jpaExecutor.setJpaQuery("from Student");
        return executor;
    }

    @Bean
    @InboundChannelAdapter(channel = "jpaInputChannel",
                     poller = @Poller(fixedDelay = "${poller.interval}"))
    public MessageSource<?> jpaInbound() {
        return new JpaPollingChannelAdapter(jpaExecutor());
    }

    @Bean
    @ServiceActivator(inputChannel = "jpaInputChannel")
    public MessageHandler handler() {
        return message -> System.out.println(message.getPayload());
    }

}

Java DSL を使用した構成

次の Spring Boot アプリケーションは、Java DSL で受信アダプターを構成する方法の例を示しています。

@SpringBootApplication
@EntityScan(basePackageClasses = StudentDomain.class)
public class JpaJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(JpaJavaApplication.class)
            .web(false)
            .run(args);
    }

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Bean
    public IntegrationFlow pollingAdapterFlow() {
        return IntegrationFlow
            .from(Jpa.inboundAdapter(this.entityManagerFactory)
                        .entityClass(StudentDomain.class)
                        .maxResults(1)
                        .expectSingleResult(true),
                e -> e.poller(p -> p.trigger(new OnlyOnceTrigger())))
            .channel(c -> c.queue("pollingResults"))
            .get();
    }

}