Tag: spring batch

Spring批处理聚合值并写入单个值

我正在使用spring批次,我需要实现以下目标 阅读csv文件,其中包含日期和金额等详细信息 汇总同一日期的所有金额的总和 持有一个日期和总和的条目 我过去使用过批处理,我想到了以下方法。 创建一个包含2个步骤的批处理 步骤1: Reader:使用FlatFileItemReader遍历整个文件 处理器:使用Key填充地图作为日期和值作为金额。 如果存在条目,则获取该值并将其添加到新值 作家:没有作家,因为我不想写 第2步: Reader:循环遍历地图的值 作家:坚持价值观 我能够实现第一步,我填充了Map 。 此Map已使用@JobScope声明 我陷入困境,如何为step2创建只需读取值列表的阅读器。 我尝试了ListItemReader但我无法从ListItemReader访问Map 。 请告知解决方案,或者您是否有更好的方法来解决这个问题 谢谢

如何使用需要2个参数的查询进行batchUpdate,并且只有其中一个存储在列表中

我使用Spring-JDBC在我的MySQL数据库中为用户插入facebook好友列表。 我有一个包含用户uid的最终Long和包含他朋友列表的List。 我的查询是: final String sqlInsert=”insert into fb_user_friends(fb_uid,friend_uid) values(?,?)”; 我使用SqlParameterSourceUtils创建批处理参数 SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(friendsList.toArray()); 我使用以下命令执行插入: int[] insertCounts = this._jdbcTemplate.batchUpdate(sqlInsert,batch); 这里的问题是列表只包含查询所需的第二个参数。 我是否必须修改friendsList以将其添加到另一列或是否有其他方法? 谢谢!

如何在Spring-Batch中跳过ItemReader的行?

我有一个自定义项目阅读器,可以将文本文件中的行转换为我的实体: public class EntityItemReader extends AbstractItemStreamItemReader { @Override public MyEntity read() { String line = delegate.read(); //analyze line and skip by condition //line.split //create entity with line values } } 这类似于FlatFileItemReader 。 然后,读取的MyEntity将由JdbcItemReader持久保存到DB。 问题:有时我的行包含应该跳过的值。 但是当我在read()器的read()方法中return null时,不仅会跳过此项,而是完全终止读取,并且将跳过所有其他行。 因为null元素是所有弹簧阅读器的“信号”,所以要读取的文件已完成。 那么:如果我不能返回null,我可以通过读取器内的条件跳过特定行? 因为读者的性质,我不得不在这里归还一个物体。

如何从Spring Batch中的ItemReader动态设置MultiResourceItemWriter的资源

批处理作业是: 从csv文件中读取 为csv中的每个记录(行)创建一个xml文件,名称为Patent.ID.xml(其中ID是csv中的字段,Patent是我的模型类),例如:1.xml,2.xml 问题是我找不到一种方法来动态地将文件名设置为csv文件中的每个ID 这是我的配置:

如何从Spring批处理器process()方法向Spring批处理作业启动方法抛出exception?

我正在使用Web服务方法来启动Spring批处理作业。如果在Spring批处理控制中发生任何exception,则会返回处理器处理方法。 但是我需要控制器回到web服务方法,我必须抓住并编写代码来发送该exception。 网络服务方式: public void processInputFiles() throws ServiceFault { String[] springConfig = { CONTEXT_FILE_NAME }; ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); try { setClientInfo(); JobLauncher jobLauncher = (JobLauncher) context.getBean(JOB_LAUNCHER); Job job = (Job) context.getBean(REMITTANCE_JOB); jobLauncher.run(job, new JobParameters()); }catch (Exception e) { String errorMessage = “LockboxService exception:: Could not process Remittance(CSV) files”; final Message message = MessageFactory.createErrorMessage(MyService.class, […]

java.lang.NoSuchMethodError:org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava / lang / String;)V

下面是我的spring批处理项目的pom.xml,如果我在jboss 5中部署,我得到以下exception,但如果我在本地windows机器上部署,同样的战争工作正常。 我怀疑jar中的org.springframework:spring-context:jar:2.5.6存在冲突org.springframework:spring-context:jar:2.5.6 。 即使我尝试在春季批量依赖中排除弹簧核心jar,但我无法解决这个问题,任何人都可以提前帮助。有没有办法排除spring-context:jar:2.5.6 Error Trace java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:369) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4389) at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:313) at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:145) at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461) at org.jboss.web.deployers.WebModule.startModule(WebModule.java:122) at org.jboss.web.deployers.WebModule.start(WebModule.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) at org.jboss.mx.server.Invocation.invoke(Invocation.java:88) at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668) at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206) mvn依赖:树 +- org.springframework:spring-context:jar:2.5.6:compile | \- […]

一步后弹簧批流/分流

我正在构建一个包含以下过程的弹簧批处理解决方案: 步骤1:将列表拆分为多个列表步骤2:处理每个子列表步骤3:合并子列表 生成的子列表可以并行处理,并且根据spring-batch文档支持。 遗憾的是,我只能找到以并行步骤开始的弹出批处理示例作业,而不是按顺序开始的示例。 以下作业无法编译。 Spring给了我一个错误:’无法解决step2′ 那么,如何将作业配置为首先运行单个步骤,而不是并行运行多个步骤,然后运行最后一个步骤?

如果抛出exception,则使用非零代码创建一个spring-batch作业出口

我正在尝试修复从shell脚本启动的弹出批处理作业。 然后,脚本检查进程退出代码以确定作业是否成功。 但是,即使程序以exception结束,Java也会退出0,除非使用不同的代码专门调用System.exit,因此脚本始终报告成功。 有没有办法让spring-batch在失败时返回非零代码? 要清楚,我不是在讨论ExitStatus或BatchStatus,而是Java进程的实际退出代码。 如果没有办法告诉spring-batch返回非零,我是否可以在Tasklet(或Listener)中安全地使用System.exit而不会干扰Spring-batch在exception后执行的任何操作? 如果做不到这一点,是否有人可以建议一种方法将BatchStatus或其他一些失败指标恢复到shell脚本?

手动更改Spring Batch元数据表是不是一个坏主意?

背景 我正在使用Spring Batch 2.1.8,并通过CommandLineJobRunner运行作业。 如: java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId 问题 在某些情况下,例如服务器崩溃,可能会中断正在运行的作业。 但中断的作业在Spring Batch Meta-Data表中保持STARTED状态,无法再次运行。 org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running 我可以想到两个解决方案: 解决方法1 添加一个新的作业参数并每次更改它以使其成为Spring Batch的“新”作业。 如: java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId times=0 当需要重新运行它时,请清除所有相应的输出数据,计算一次,然后重新运行作业。 溶液2 手动更改Spring Batch元数据表。 更新状态以使作业可重新启动。 如: UPDATE BATCH_JOB_EXECUTION SET END_TIME = SYSTIMESTAMP, STATUS = ‘FAILED’, EXIT_CODE = ‘FAILOVER’ WHERE JOB_EXECUTION_ID = […]

Spring批量仅限制单个作业实例

我有一个春季批处理作业,可以通过restURL踢。 我想确保只允许一个作业实例运行。 如果另一个实例已经运行,那么不要启动另一个 即使参数不同。 我搜查了一下,没有找到任何解决方案。 考虑扩展SimpleJobLauncher。 检查作业的任何实例是否正在运行。