问题标签 [spring-batch-tasklet]

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 回答
106 浏览

java - Spring Batch:然后如何将 stepContext.getJobExecutionContext() 转换为 mockito 中的自定义 Map 实现

这个问题与This相关。为什么我在这里问而不是更新问题,因为这可能是一个有用的问题,并且与我之前提出的问题无关。

在测试类中,我如何转换以下实现:假设我有一张这样的地图:TreeMap<String, Map<Integer, Set<Student>>>

我想在我的测试类中强制转换默认chunkContext.getStepContext().getJobExecutionContext()值。Map<String, Object>TreeMap<String, Map<Integer, Set<Student>>>

现有的实现是:

当我将鼠标悬停在 时getJobExecutionContext(),它会显示Map<String, Object>并希望以可以更改为的方式进行更改TreeMap<String, Map<Integer, Set<Student>>>

抱歉,如果有任何不清楚的地方。我可以根据您的评论更新问题。:)

0 投票
2 回答
389 浏览

spring-boot - 将数据发送到 Spring Batch Item Reader(或 Tasklet)

我有以下要求:

  1. 一个端点 http://localhost:8080/myapp/jobExecution/myJobName/execute 接收 CSV 并使用单一性来应用一些验证并生成一些 pojo 的列表。
  2. 将该列表发送到 Spring Batch Job 进行一些处理。
  3. 多个用户可以这样做。

我想知道使用 Spring Batch 是否可以实现这一目标?

我正在考虑使用队列,放置数据并执行从该队列中提取对象的作业。但是我怎么能确定如果其他人执行端点并且其他 Job 正在执行,Spring Batch 知道哪个 Item 属于某个执行?

0 投票
2 回答
1052 浏览

spring - TransactionRequiredException:没有事务正在进行中,sping 批处理作业和休眠

我正在使用休眠学习 Spring 批处理作业,但我面临一个问题。

TransactionRequiredException:没有正在进行的事务

我已经创建了阅读器、处理器和编写器。我正在更新处理器中的用户,并且在编写器之后我收到此错误。我已经尝试在处理器上使用 @Transacional 方法,但它不起作用。我不确定这里有什么问题。添加我的作业配置文件。在此之前,我面临与事务管理器相关的问题。我也不确定我使用的事务管理器是否合适。请让我知道我在哪里犯错。

测试作业.Java

测试处理器.java

Testwriter.java

也添加错误

0 投票
1 回答
1349 浏览

java - Spring批处理如何在Skip Listener中获取作业执行上下文

我正在寻求帮助以找到在我的块侦听器中设置作业执行上下文的方法。

跳过监听器

我正在设置作业执行 ID

这在我的处理器和编写器中工作正常,但在跳过侦听器时,它是空的

0 投票
1 回答
255 浏览

spring-boot - 使用 SystemCommandTasklet 拆分文件

我想通过 SystemCommandTasklet 运行系统命令。使用下面的示例代码对此进行了尝试,但出现错误。

我认为这是因为命令参数,但我无法修复它。

如果有帮助,我会很高兴。

参考例子;

错误详情;

“CreateProcess error=2,系统找不到指定的文件”

代码示例;

0 投票
1 回答
706 浏览

java - 在 Spring Batch Tasklet 中使用多个数据源

我是 Spring Batch 的新手,在我的 Batch 中使用多个数据源时遇到了问题。

让我解释。

我在我的服务器中使用 Spring Boot 中的 2 个数据库。

到目前为止,我的 RoutingDataSource 实现一切正常。

该实现需要一个 DatabaseContextHolder,这里是:

当我在我的服务器上收到一个请求时,我有一个基本的拦截器,它根据我在请求中的一些输入设置当前数据库。使用方法DatabaseContextHolder.setDatabase(db);一切都适用于我的实际控制器。

当我尝试使用一个 tasklet 运行作业时,情况会变得更加复杂。

我的一个控制器启动了这样的异步任务。

还有我的小任务:

但是 RoutingDataSource 不起作用,即使我在开始工作之前设置了我的上下文。例如,如果我将数据库设置为 B,则 repo 将在数据库 A 上运行。它始终是选择的默认数据源。(因为这条线 setDefaultTargetDataSource(datasourceA);

我尝试通过在 tasklet 内传递参数中的值来设置数据库,但仍然遇到同样的问题。

我觉得问题是因为数据库设置在不同的线程中,因为我的工作是异步的。因此它无法在启动作业之前获取数据库集。但到目前为止我找不到任何解决方案。

问候

0 投票
0 回答
671 浏览

spring-batch - Tasklet中的Spring Batch跳过异常和回滚

我想实现一个可以跳过异常并正确回滚事务的小任务,但我看不到实现这两件事的方法。

我的 tasklet 从构造函数中填充的 id 队列中读取。在执行方法的每次调用中,都会处理一个 id,这取决于队列是否仍有要处理的元素,或者没有返回RepeatStatus.FINISHEDRepeatStatus.CONTINUABLE。我使用的是 tasklet 而不是块,因为每个元素的处理都相当复杂,并且意味着执行多个查询,实例化许多对象,这些对象稍后都会写入数据库。

主要问题是如果我定义一个 try/catch 块来包装实现,我可以毫无问题地跳过异常,并且仍然能够使用队列中的下一个元素重新执行 tasklet,但问题是所有内容都保存在数据库。另一方面,即使一个元素的处理正确完成而没有问题,如果提交由于某种原因而失败,因为错误发生在我的代码无法控制的范围内,我的代码和 tasklet 不会捕获到异常执行完成,不能跳过并继续队列的下一个元素。

这是我的 tasklet 的简化架构:

有没有办法通过 tasklet 实现这两个要求:

  • 如果在执行方法的实现中捕获到异常,则能够告诉框架回滚事务
  • 如果提交失败,继续执行(连续调用)tasklet
0 投票
1 回答
182 浏览

spring-batch - 使用 Tasklet 方法时 FlatFileItemWriter 不生成文件

我使用方法编写了以下代码tasklet来生成包含数据的文件。

上面的代码编译并运行没有错误,但它没有在磁盘上生成任何文件。

我尝试调试以检查是否在缓冲区上创建了 fileName 和 etc 值以写入磁盘,并且除了生成数据并将数据写入文件之外,一切都按预期工作。

如果我使用基于块的方法编写代码,它工作正常。

如果我做错了什么,请告诉我。我在这里先向您的帮助表示感谢。

编辑:添加建议的更改后,文件正在磁盘上创建,但文件丢失了我使用 setHeaderCallback() 设置的标题

0 投票
1 回答
307 浏览

oracle - 如何在线程被阻塞时保留数据库连接

我集成的数据库配置为好像连接处于空闲状态(一段时间未使用),然后连接被丢弃。由于我在持久配置中使用弹簧批处理,因此在运行线程上总是有一个活动的数据库连接。

我的一项春季批处理作业依赖于来自外部 Web 服务的数据,这需要很长时间才能执行。这就是为什么当我得到结果时我已经失去了数据库连接。

我尝试在 Web 请求发生之前使用 taskscheduler 注册一个心跳查询(从 dual 中选择 1),它每 5 分钟执行一次查询以保持连接处于活动状态,但即使查询定期执行,我猜它也会单独执行查询连接,因为它在另一个线程上运行。

有没有人有其他建议可以在锁定线程时保持连接处于活动状态?

我使用 JPA 的 EntityManager 进行 haertbeat 查询

0 投票
1 回答
84 浏览

spring - 如何在春季批处理中使用 MultiResourceItemReader 在读取单个 csv 后指定任务执行器以生成线程

尝试使用 MultiResourceItemReader 在春季批处理中读取多个文件,并且还让 taskExecutor 用于每个文件中的记录以在多线程中读取。假设一个文件夹中有 3 个 csv 文件, MultiResourceItemReader 应该一个一个地执行它,但是因为我有 taskExecutor ,不同的线程占用了 csv 文件,就像两个 csv 文件被同一文件夹中的线程占用并开始执行。

期望:- MultiResourceItemReader 应该读取第一个文件,然后 taskExecutor 应该产生不同的线程并执行。然后应该拾取另一个文件,并由 taskExecutor 执行。

代码片段/Batch_Configuration :- @Bean public Step Step1() { return stepBuilderFactory.get("Step1") .<POJO, POJO>chunk(5) .reader(multiResourceItemReader()) .writer(writer()) .taskExecutor( taskExecutor()).throttleLimit(throttleLimit).build(); }