此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

入站通道适配器用于使用 JPA QL 对数据库执行选择查询并返回结果。 消息有效负载可以是单个实体,也可以是实体之一。 以下 XML 配置:Listinbound-channel-adapterSpring中文文档

<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>
1 在属性中执行 JPA QL 后,将消息(带有有效负载)放在该通道上。inbound-channel-adapterquery
2 用于执行所需 JPA 操作的实例。EntityManager
3 属性指示组件是否应在应用程序上下文启动时自动启动。 该值默认为 。true
4 JPA QL,其结果作为消息的有效负载发送出去
5 此属性指示 JPQL 查询是在结果中提供单个实体还是实体。 如果该值设置为 ,则单个实体将作为消息的有效负载发送。 但是,如果在将 设置为 后返回多个结果,则会抛出 a。 该值默认为 。ListtruetrueMessagingExceptionfalse
6 此非零、非负整数值告诉适配器在执行选择操作时不要选择超过给定行数的行数。 默认情况下,如果未设置此属性,则查询将选择所有可能的记录。 此属性与 互斥。 自选。max-results-expression
7 计算结果集以查找最大结果数的表达式。 与 互斥。 自选。max-results
8 如果要删除执行查询后收到的行,请将此值设置为。 您必须确保该组件作为事务的一部分运行。 否则,您可能会遇到异常,例如:truejava.lang.IllegalArgumentException: Removing a detached instance …​
9 如果要在删除收到的实体后立即刷新持久性上下文,并且不想依赖 的 . 该值默认为 。trueflushModeEntityManagerfalse
1 在属性中执行 JPA QL 后,将消息(带有有效负载)放在该通道上。inbound-channel-adapterquery
2 用于执行所需 JPA 操作的实例。EntityManager
3 属性指示组件是否应在应用程序上下文启动时自动启动。 该值默认为 。true
4 JPA QL,其结果作为消息的有效负载发送出去
5 此属性指示 JPQL 查询是在结果中提供单个实体还是实体。 如果该值设置为 ,则单个实体将作为消息的有效负载发送。 但是,如果在将 设置为 后返回多个结果,则会抛出 a。 该值默认为 。ListtruetrueMessagingExceptionfalse
6 此非零、非负整数值告诉适配器在执行选择操作时不要选择超过给定行数的行数。 默认情况下,如果未设置此属性,则查询将选择所有可能的记录。 此属性与 互斥。 自选。max-results-expression
7 计算结果集以查找最大结果数的表达式。 与 互斥。 自选。max-results
8 如果要删除执行查询后收到的行,请将此值设置为。 您必须确保该组件作为事务的一部分运行。 否则,您可能会遇到异常,例如:truejava.lang.IllegalArgumentException: Removing a detached instance …​
9 如果要在删除收到的实体后立即刷新持久性上下文,并且不想依赖 的 . 该值默认为 。trueflushModeEntityManagerfalse

配置参数参考

以下列表显示了可以为 :inbound-channel-adapterSpring中文文档

<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 一个布尔标志,指示是否在适配器轮询所选记录后删除这些记录。 默认情况下,该值为 (即,不删除记录)。 您必须确保该组件作为事务的一部分运行。 否则,您可能会遇到异常,例如:. 自选。falsejava.lang.IllegalArgumentException: Removing a detached instance …​
4 一个布尔标志,指示记录是可以批量删除还是必须一次删除一条记录。 默认情况下,该值为 (即,可以大容量删除记录)。 自选。false
5 要从数据库查询的实体类的完全限定名称。 适配器会根据实体类名称自动构建 JPA 查询。 自选。
6 用于执行 JPA 操作的实例。 自选。jakarta.persistence.EntityManager
7 用于获取执行 JPA 操作的实例的实例。 自选。jakarta.persistence.EntityManagerFactoryjakarta.persistence.EntityManager
8 一个布尔标志,指示选择操作是返回单个结果还是返回结果。 如果此标志设置为 ,则选定的单个实体将作为消息的有效负载发送。 如果返回多个实体,则会引发异常。 如果 ,则 的实体作为消息的有效负载发送。 该值默认为 。 自选。ListtruefalseListfalse
9 用于执行 JPA 操作的实现。 我们建议不要提供自己的实现,而是使用默认实现。 您可以使用任何 、 或 属性。 自选。org.springframework.integration.jpa.core.JpaOperationsorg.springframework.integration.jpa.core.DefaultJpaOperationsentity-managerentity-manager-factoryjpa-operations
10 要由此适配器执行的 JPA QL。 自选。
11 此适配器需要执行的命名查询。 自选。
12 此适配器执行的本机查询。 您可以使用任何 、 、 或 属性。 自选。jpa-querynamed-queryentity-classnative-query
13 用于解析查询中参数值的实现。 如果属性具有值,则忽略。 自选。o.s.i.jpa.support.parametersource.ParameterSourceentity-class
14 向通道发送消息时等待的最长时间(以毫秒为单位)。 自选。
1 此生命周期属性指示此组件是否应在应用程序上下文启动时自动启动。 此属性默认为 。 自选。true
2 适配器向其发送消息的通道,其中包含执行所需 JPA 操作的有效负载。
3 一个布尔标志,指示是否在适配器轮询所选记录后删除这些记录。 默认情况下,该值为 (即,不删除记录)。 您必须确保该组件作为事务的一部分运行。 否则,您可能会遇到异常,例如:. 自选。falsejava.lang.IllegalArgumentException: Removing a detached instance …​
4 一个布尔标志,指示记录是可以批量删除还是必须一次删除一条记录。 默认情况下,该值为 (即,可以大容量删除记录)。 自选。false
5 要从数据库查询的实体类的完全限定名称。 适配器会根据实体类名称自动构建 JPA 查询。 自选。
6 用于执行 JPA 操作的实例。 自选。jakarta.persistence.EntityManager
7 用于获取执行 JPA 操作的实例的实例。 自选。jakarta.persistence.EntityManagerFactoryjakarta.persistence.EntityManager
8 一个布尔标志,指示选择操作是返回单个结果还是返回结果。 如果此标志设置为 ,则选定的单个实体将作为消息的有效负载发送。 如果返回多个实体,则会引发异常。 如果 ,则 的实体作为消息的有效负载发送。 该值默认为 。 自选。ListtruefalseListfalse
9 用于执行 JPA 操作的实现。 我们建议不要提供自己的实现,而是使用默认实现。 您可以使用任何 、 或 属性。 自选。org.springframework.integration.jpa.core.JpaOperationsorg.springframework.integration.jpa.core.DefaultJpaOperationsentity-managerentity-manager-factoryjpa-operations
10 要由此适配器执行的 JPA QL。 自选。
11 此适配器需要执行的命名查询。 自选。
12 此适配器执行的本机查询。 您可以使用任何 、 、 或 属性。 自选。jpa-querynamed-queryentity-classnative-query
13 用于解析查询中参数值的实现。 如果属性具有值,则忽略。 自选。o.s.i.jpa.support.parametersource.ParameterSourceentity-class
14 向通道发送消息时等待的最长时间(以毫秒为单位)。 自选。

使用 Java 配置进行配置

以下 Spring Boot 应用程序显示了如何使用 Java 配置入站适配器的示例:Spring中文文档

@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 配置入站适配器的示例:Spring中文文档

@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();
    }

}