问题标签 [jsr352]
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.
jsr352 - JSR 352. 重新启动分区:如何检查提交?
我有一个读取和写入数据库的分区作业。我的分块大小为 100。如果分区失败并且我希望从上次提交开始重新启动,我是否必须明确指定检查点?(在可序列化的 checkpointInfo() 中?)
如果是这样,如何/在哪里?
jsr352 - JSR 352:如何从分区步骤的每个分区的写入者那里收集数据?
因此,我在写入数据库的步骤中有 2 个分区。我想记录每个分区写入的行数,得到总和,打印到日志;
我正在考虑static
在 Writer 中使用一个变量,并使用 Step Context/Job Context 将其放入afterStep()
Step Listener。但是,当我尝试它时,我得到了null
. 我能够在close()
阅读器中获取这些值。
这是正确的方法吗?或者我应该使用 Partition Collector/Reducer/Analyzer?
我在 Websphere Liberty 中使用 java 批处理。我正在 Eclipse 中开发。
java - JSR 352:使用步骤上下文/作业上下文传递多个变量?
我需要在 Step Listener 和 Writer 之间传递多个变量。使用 StepCtx.setTransientUserData() 我只能传递 1 个变量。
所以要传递多个变量,我应该创建一个地图/类并传递它还是有更好的方法?
java - JSR352:注解 @Named 在 Java SE 中不起作用
我正在使用 JBoss 实现JBeret在 Java SE 下构建JSR352(Java 平台的批处理应用程序)演示。我想为这项工作运行集成测试。在这个批处理作业中,有 3 个组件:
io.mincong.batch.MyItemReader
io.mincong.batch.MyItemProcessor
io.mincong.batch.MyItemWriter
它们都被命名为带有注释的bean @Named
,例如
多亏了这个注释,我可以使用作业类,而无需io.mincong.batch
在我的作业文件中输入包名前缀myJob.xml
。这在 Java EE 容器中可以正常工作,例如 WildFly 10。但是,在 Java SE 中,它不再工作了,我必须添加包前缀。这里的工作 xml myJob.xml
:
你可以在附件中找到 2 mvn install log,有和没有包前缀。换句话说,使用和不使用@Named
。为什么会发生此错误?我是否缺少一些依赖项?任何想法 ?
你也可以在下面看到我的 pom.xml。附加信息:
- JBERET:设置 JBeret
- JBERET:最小的应用程序依赖
- JBERET:Java SE 批处理应用程序的附加依赖项
- JBERET:GitHub 上的 jberet/jsr352/test-apps
使用 @Named 时 Maven 安装失败
不使用 @Named 时 Maven 安装成功
pom.xml
file-io - JSR 352:如何从 Java Batch 程序写入 MVS 数据集?
我需要写入大型机中的非 VSAM 数据集。我知道我们需要使用 ZFile 库来做到这一点,我在这里找到了如何做到这一点
我正在 zOS 上的 WebSphere Liberty 中运行我的 Java 批处理作业。如何指定数据集?我可以直接给DataSet起这样的名字吗?
dsnFile = new ZFile("X.Y.Z", "wb,type=record,noseek");
我可以使用 Java 的 File Writers 将它写入服务器本身的文本文件,但我不知道如何访问 mvs 数据集。
我对 zOS 和大型机的世界还比较陌生。
spring-batch - ItemReader 中的中间结果集
Spring Batch 机制相当新——我设法让它启动并运行,但我的业务逻辑似乎不适合作为 Spring Batch 工作。请允许我解释一下:
该工作负责向用户发送电子邮件,如下所示:
- 获取满足特定条件的新闻项目集 (
Set<News>
) - 获取尚未收到新闻项目之一的用户集 (
Set<User>
) - 对于每个用户,为用户未收到的每个新闻发送一封电子邮件。
- “标记”已收到/已收到新闻的用户。
实体bean定义如下:
两者之间没有一对多的关系,因此为了检索未收到的新闻,可以按如下方式检索:
我决定使用 Spring Batch,因为我的用户群目前为 28,000 并且还在增加,将步骤 1 和 2 设置为 ,将ItemReader
步骤 3 和 4 设置为ItemWriter
.
问题在于前两个步骤:我决定使用JpaPagingItemReader<T>
我的读者,但不幸的是它非常严格,以至于我只能指定一个查询,而不会更改将结果集映射到其他东西。在我的示例中,我首先需要获取一组新闻,然后根据收到的新闻 ( Tuple<User, Set<News>>
) 查询数据库以获取一组用户。
我该怎么做才能让我的读者返回一组用户和他/她未收到的新闻集?我错过了什么?
非常感激。如果您需要更多信息,请告诉我。
java - JSR 352:是否可以在多个 JVM 中的同一作业中运行同一步骤的不同分区?
如果是这样,如何?
我在 WebSphere Liberty 上使用 IBM 的 JSR 352 实现。
java - JSR 352:Java Batch 确保最大性能和效率的最佳实践是什么?
我正在从数据库进行典型的读取,并且我将处理并写入具有数百万(> 1000 万)条记录的数据集上的文件步骤。
从设计或架构的角度来看,有什么需要牢记的吗?
还有需要牢记的任何 Java-Batch 特定的编码实践吗?(除了一般的 java 最佳实践)
我在 Websphere liberty 上使用 IBM 的 JSR352 实现。
java - JSR 352:连接已关闭如果连接在分区步骤中的 Readers close() 中关闭,则会出错
我在阅读器的打开中创建一个连接Connection con = ds.getConnection();
(其中 ds 是数据源)并在阅读器的 close() 中关闭它。
但是当我运行具有多个分区的作业时,在作业中间,我得到连接已关闭错误
Caused by: java.sql.SQLException: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003 DSRA0010E: SQL State = 08003, Error Code = -4,470
我假设当其中一个分区完成时会发生这种情况。
所以我的问题是为什么会发生这种情况?以及应该如何处理连接?还是 Java 负责关闭连接?
我在 WebSphere Liberty UPDATE 上使用 Java Batch:
}
完整的错误信息
[ERROR ] J2CA0024E: Method rollback, within transaction branch ID {XidImpl: formatId(57415344), gtrid_length(36), bqual_length(40),
data(0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c00000001)} of resource pool connectionManager[Pool], caught com.ibm.ws.exception.WsException: DSRA0080E: An exception was received by the Data Store Adapter. See original exception message: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003. with SQL State : 08003 SQL Code : -4470
multithreading - 如何在 JSR 352 中定义一个好的分区计划以确保 CPU 平衡?
JSR 352 - Java 平台的批处理应用程序使用分区提供并行功能。批处理运行时可以在不同的分区中执行一个步骤,以加快进度。JSR 352 还引入了threads
定义:我们可以定义要使用的线程数,例如
然后我就疑惑了:如何给出一个赞赏的分区方案,让每个线程都被占用,保证CPU的平衡?
比如有表A、B、C要做,它们的行分别是10亿、100万、1000。该步骤旨在将这些实体处理为文档,一个实体转到一个文档。文件生成的顺序并不重要。这些表实体的CPU时间分别为1s、2s、5s。线程数为 4。
如果有 3 个分区,每个表类型一个,那么该步骤将需要1 * 10^9
几秒钟才能完成,因为:
- 分区 A将占用
1 * 10^9 * 1s = 1 * 10^9s
,在线程 2 上运行 - 分区 B将占用
1 * 10^6 * 2s = 2 * 10^6s
,在线程 3 上运行 - 分区 C将占用
1 * 10^3 * 5s = 5 * 10^3s
,在线程 4 上运行
然而,当线程 2 被占用时,线程 3 是空闲的2 * 10^6s
,线程 4 是空闲的5 * 10^3s
。所以很明显,这不是一个好的分区计划。
我的问题是:
- 在上面的例子中是否有更好的分区计划来完成?
- 我可以考虑:分区是一个消费队列,线程消费这个队列吗?
- 一般来说,我可以/应该使用多少个线程?CPU核心数是一样的吗?
- 一般来说,如何给出一个赞赏的分区计划,让每个线程都被占用并保证CPU的平衡?