问题标签 [spring-integration-jdbc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
347 浏览

java - 如何让spring为JdbcMetadataStore创建对应的schema?

我想使用这里描述的 jdbc 元数据存储: https ://docs.spring.io/spring-integration/docs/5.2.0.BUILD-SNAPSHOT/reference/html/jdbc.html#jdbc-metadata-store

引用:

org.springframework.integration.jdbc 包有几个 RDMBS 供应商的数据库模式脚本。例如,以下清单显示了元数据表的 H2 DDL:

我在 jar 文件中找到了我的 postgresql 的架构。当然,我可以只复制这个模式并在 pgAdmin 中运行一次,但我想要求 spring 检查我当前的模式是否存在,如果不存在 - 从 jar 文件创建相应的模式。

我怎样才能做到这一点?

附言

同样在我的项目中,我使用基于 beans(Entities) 定义的模式自动生成,所以spring.jpa.hibernate.ddl-auto = none+将模式从 jar 复制到本地shema.sql不是一个选项

0 投票
0 回答
53 浏览

spring - 云环境中Spring集成的JMS消息处理

我目前正在尝试重构 JMS 消息的处理以在分布式/云环境中工作。为了允许更好的重试和错误处理,消息首先使用 JPA 实体存储到数据库中,然后由 spring 集成 jpa 入站适配器读取。只要我的服务的一个实例正在运行,这就可以正常工作。但是,当多个实例正在运行时,即使在持久消息上引入处理状态后,这些实例也会尝试处理相同的消息。

我已经尝试将 JMS 消息保存在 JDBC 消息存储中,但是我必须定义一个组标识符,根据该组标识符,实例可以选择一条实际上不可能的消息,因为实例的数量是动态的,我不能为每个实例分配一个组 ID。另一种可能性可能是某种带有 LockRegistry 的分布式锁,但我无法做到这一点。

您是否有任何提示/建议我可以如何通过 Spring 集成最好地实现以下要求:

  • JMS 消息应该被持久化
  • 任何实例都可以获取消息并进行处理
  • 如果处理失败,将重试 x 次(也可以由另一个实例重试)
  • 如果实例在处理过程中崩溃或被杀死,则消息不能丢失

是否有一些可能有帮助的 spring-cloud 组件?我对我应该朝哪个方向前进的每一个提示感到高兴。

0 投票
3 回答
91 浏览

spring-integration - Spring Integration Mail:在所有数据库插入后发送电子邮件

您好,我有一个集成流程,它逐行拆分文件,将每一行转换为 POJO,然后通过 JDBC 出站网关将该 POJO 插入到数据库中。

一旦文件处理完成,我希望能够发送一封电子邮件。我目前在我的 jdbcOutboundGateway 之后发送到 smtpFlow 通道,但是这是在每次插入数据库后发送一封电子邮件。

这是我当前的流量 DSL

在处理完所有文件后,如何让此流程仅发送一封电子邮件jdbcOutboundGateway

这是我的splitFile()方法

这是我的transformToIndividualScore方法

0 投票
0 回答
52 浏览

spring-boot - 当有多个带有 SpringIntegration 的 IntegrationFlow 时,如何在特定的 IntegrationFlow 进程上赋予更多优先级

当使用 SpringIntegration 在同一个 SpringBoot 应用程序中运行多个 IntegrationFlow 实例时,我想为特定的 IntegrationFlow 进程分配更多资源(线程优先级)。

我有两个 IntegrationFlow 实例链接到两种不同的源类型。一个链接到 SFTP 源,另一个链接到数据源。当 SFTP 消息经过几个步骤(解压缩包含 XML 文件的文件、检查 XML 文件与 XSD 模式的有效性、拆分 XML 文件并持久化与 XML 文件的一部分相对应的数据)后,第二个工作流以并行方式运行,消耗每个持久化的来自数据源的数据,以便将它们推送到 Kafka 主题中。所以我想在第一个 IntegrationFlow 上分配更多资源。对于每个 InegrationFlow,最大获取大小设置为 1。

0 投票
1 回答
181 浏览

java - Spring JDBC 出站网关返回原始有效负载

使用JdbcOutboundGateway,我如何获得原始有效载荷的回复?

目前,响应负载是{UPDATED=1}. 参考文档(Spring 5.2.x)和源代码似乎都没有提供替代方案。

我应该扩展类并覆盖handleRequestMessage以返回原始有效负载吗?该方法protected对我来说是一个邀请,extend或者在 Spring Integration 中是否有一个首选的“模式”可以{UPDATED=1}在接下来处理@ServiceActivator并以某种方式恢复有效负载。

如果有人愿意回应,请举一个使用配置/注释而不是 XML 或 DSL 的示例。

编辑

我最终做了类似下面的事情。这样做是否可取?我是否因为不使用“集成-jdbc”方法而遗漏了什么?

0 投票
1 回答
60 浏览

spring-data-jpa - JDBCMetadataStore 与事务管理器

根据文档,JDBCMetadataStore需要一个DataSourceTransactionManager实例,这是有道理的。如果我在应用程序中使用 JPA 作为主要事务管理器会怎样?我如何告诉JDBCMetadataStore在调用@Transactional方法时它应该使用哪个事务管理器- 假设我必须在应用程序中有 2 种事务管理器 bean。欢迎提出建议!

0 投票
1 回答
64 浏览

spring - 使用 `JdbcChannelMessageStore` 时防止自动创建或删除表

我们想JdbcChannelMessageStore在我们的应用程序中使用一个持久化队列。

但是,包含在spring-integration-jdbc导致以下 DB 对象的自动创建(和删除?)中的 sql 脚本:

这不是我们在生产中不会有的行为。在那里,我们必须控制数据库上发生的一切。

有没有办法阻止加载这些脚本?

非常感谢您的回复。

0 投票
1 回答
132 浏览

spring-boot - Spring 集成 jdbc poller 线程始终挂起或轮询

我们有一个非常简单的应用程序,其中我们有一个 spring 集成入站jdbc轮询器,它从 db 表中轮询数据并将这些记录放在直接通道中。从那个通道我们有服务激活器,它获取这些记录并将其放入rabbitmq队列。轮询器被配置为使用用户定义ThreadPoolTaskExecutor的轮询,最小和最大 1 个线程,这就是我们想要的。

这个应用程序运行良好几天,它以 5 秒的固定延迟进行轮询。还监视这个线程看起来像在 200 毫秒内完成它的工作。

然后突然之间这个轮询线程停止轮询几分钟,这个间隙有时是 1 分钟,有时是 20 分钟。这是不一致的。如果我们重新启动应用程序,那么一旦它重新启动它就会轮询一次,然后它会再次回到不一致的轮询。

我们通过弹簧启动执行器进行了多个线程转储,如果我们分析这些转储,那么我们看不到任何死锁。所有线程转储上显示的所有轮询线程都是WAITING状态。

我们使用带有 spring 集成的 spring boot 2.2.6,并且应用程序部署在 PCF 中。

自从 Spring Boot 从 2.1.4 升级到 2.2.6 以来,我们已经看到了这种行为,但我不能自信地这么说。

有人可以提供一些可能导致这种奇怪行为的提示吗?

0 投票
0 回答
166 浏览

spring-integration-jdbc - Spring集成JDBC锁CannotAcquireLockException

我观察到以下异常。这是一个错误还是预期的?我应该处理这个异常吗?

使用的版本:spring-integration-jdbc:5.4.2 数据库:Oracle 12c 服务器:Tomcat 9

以下是 bean 的实例化方式。

以下是我使用 API 的方式

引发以下异常。请注意,这仅发生一次,并且不经常发生。请检查代码并建议是否应该这样使用 API。还要让我知道这是否是 API 的预期行为,我们必须处理它并忽略它。

2021-03-08 04:30:00,127 错误 osssTaskUtils$LoggingErrorHandler [scheduling-1] 计划任务 org.springframework.dao.CannotAcquireLockException 发生意外错误:无法在 532ee0eb-2d24-38af-823e-b5482c4e12f3 锁定互斥锁;嵌套异常是 org.springframework.transaction.TransactionSystemException: JDBC commit failed; 嵌套异常是 java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误 ORA-08177: 无法序列化此事务的访问

引起:org.springframework.transaction.TransactionSystemException: JDBC commit failed;嵌套异常是 java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误 ORA-08177: 无法序列化此事务的访问

原因:java.sql.SQLException:ORA-00604:递归 SQL 级别 1 发生错误 ORA-08177:无法序列化此事务的访问

0 投票
1 回答
22 浏览

spring-integration - Spring Integration - JDBC Inbound Channel - 一次处理一组相互关联的行

在我们的应用程序中,我们必须使用 Spring Integration JDBC Inbound Channel 来轮询包含客户订单的数据库表。我们需要一次性处理一个客户的所有订单。

所以我们有一个包含 order_number、customer_number 和一些附加数据的表。我们希望获得一个行集合,其中 customer_number 与入站通道适配器调用的方法的参数相同。

下面的数据库是 Oracle 19c。知道如何实现这一目标吗?