Tag: spring batch

读取CSV中的换行符,它在Spring批处理的FlatfileItemReader中的文件中引用

我试图用FlatFileItemReader解析CSV文件。 此CSV包含一些引用的换行符,如下所示。 email, name abc@z.com, “NEW NAME ABC” 但是这个解析失败了,必填字段为2但实际为1。 我在FlatFileReader配置中缺少什么?

从tasklet步骤向作业上下文添加参数,并在Spring Batch的后续步骤中使用

现在,我正在使用jobParameters来获取我的FlatFileItemReader和FlatFileItemWriter的文件名。 可以测试我的批处理,但我的目标是读取某个目录中的文件(此目录中只有此文件),文件名可能会更改。 输出文件名应取决于输入文件名。 因此,我考虑在我的工作中添加一个新步骤,此步骤将通过搜索好目录并在其中查找文件来设置输出和输入文件名。 我从Spring Doc读取了将数据传递给Future Steps ,以及来自SO的这个post ,但是我无法使它工作,文件总是“空”。 首先,我定义了以下Tasklet public class SettingFilenamesTasklet implements Tasklet { private StepExecution stepExecution; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { // TODO Search folder and set real filenames String inputFilename = “D:/TestInputFolder/dataFile.csv”; String outputFilename = “D:/TestOutputFolder/dataFile-processed.csv”; ExecutionContext stepContext = stepExecution.getExecutionContext(); stepContext.put(“inputFile”, inputFilename); stepContext.put(“outputFile”, outputFilename); return RepeatStatus.FINISHED; […]

有没有办法正确地集成spring-batch-admin和spring-boot?

根据文档 spring批处理管理员很容易嵌入到现有的应用程序中。 只需复制web.xml和index.jsp,然后添加所需的依赖项即可使其正常工作。 但是,如果我想在现有的春季启动项目中使用它,它会变得更糟。 根据这个例子 ,配置有点hacky但它​​的工作原理。 我尝试在配置bean中使用@EnableBatchProcessing注释。 然后我得到以下exception。 Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘jobBuilders’ defined in class path resource [org/springframework/batch/core/configuration/annotation/SimpleBatchConfiguration.class]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.batch.core.configuration.annotation.JobBuilderFactory org.springframework.batch.core.configuration.annotation.AbstractBatchConfiguration.jobBuilders() throws java.lang.Exception] threw exception; nested exception is java.lang.ClassCastException: org.springframework.batch.core.repository.support.JobRepositoryFactoryBean$$EnhancerBySpringCGLIB$$49fa0273 cannot be cast to org.springframework.batch.core.repository.JobRepository at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:597) at […]

如何使用spring-batch和MultiResourceItemReader读取文件夹中的所有文件?

我想配置spring-batch以按顺序读取特定文件夹中的所有csv文件。 以下方法不起作用,因为委托将尝试打开名为*.csv的文件,这当然是无效的。 我需要在这里更改什么? @Bean public ItemReader reader() { MultiResourceItemReader reader = new MultiResourceItemReader(); reader.setResources(new Resource[] {new FileSystemResource(“/myfolder/*.csv”)}); reader.setDelegate(new FlatFileItemReader(..)); return reader; } 等效的xml配置将编写如下,我怎么能将它重写为仅java配置?

unit testing中Spring Batch JobRepository的事务问题

任何人都可以帮我找出以下exception的解决方案,我想我只是不太了解事务传播机制,这阻碍了我理解下面显示的exception消息的真正含义,所以请帮助我理解整个事情,非常感谢你! java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (eg remove @Transactional annotations from client). at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:164) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at com.sun.proxy.$Proxy15.createJobExecution(Unknown Source) at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:111) at TestJob.testExcelParserTasklet(TestJob.java:36) 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.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:169) at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:158) 以下是导致上述exception的代码: public class TestJob extends BaseTest { @Test […]

Spring Batch:从一个带有新线程的Spring MVC控制器中启动一个作业

我有一个Spring-Batch作业,我从Spring MVC控制器启动。 控制器从用户获取上传的文件,该作业应该处理该文件: @RequestMapping(value = “/upload”) public ModelAndView uploadInventory(UploadFile uploadFile, BindingResult bindingResult) { // code for saving the uploaded file to disk goes here… // now I want to launch the job of reading the file line by line and saving it to the database, // but I want to launch this job in a […]

Spring批处理并行执行多个步骤?

我已经为一个步骤实现了弹簧批处理分区,其中主步骤将其工作委托给多个并行执行的从属线程。 如下图所示。(参考Spring文档 ) 现在如果我有多个并行执行的步骤怎么办? 如何在批量配置中配置它们? 我目前的配置是 我的架构图应该如下图所示: 即使有可能使用弹簧批,我也不确定。任何想法或者我都想实现它。谢谢。

Spring:获取FactoryBean对象而不是FactoryBean.getObject()

简短的问题:如果我有类可以阻止FactoryBean接口,那么如何从FactoryBean对象本身而不是FactoryBean.getObject()获取? 长问题:我必须使用第三方基于Spring的库,这很难使用FactoryBean接口。 现在我总是必须配置2个bean: 实际上定义名为“XYZ”的bean(与“XYZ2”相比)永远不会改变,但由于工厂性质,我必须复制每个配置的代码。 名称为“aName”的bean的定义始终是新的(即每个配置都有自己的objectContext值)。 我想简化配置有一个工厂bean(删除“XYZ2”并删除链接到“aName”): 不幸的是,它并不像我预期的那么简单。 我想在运行时将工厂(即示例中的XYZ bean)与必要的对象(即“aName”,“aName2”)粘合在一起。 这种方法不起作用,因为当我向Spring询问FactoryBean对象时,它返回给我的FactoryBean.getObject(),由于缺少itemReader值,因此无法在那时实例化。 我希望SpringSource可以预见我的情况我可以通过“挂钩”FactoryBean.getObject()调用来在运行时提供所有必需的属性。 另一个复杂性让我误解了它的工厂链(Factory1从Factory2获取一个对象,我必须在运行时“挂钩”)。 任何想法将不胜感激。

减少内存流失的方法

背景 我有一个Spring批处理程序,它读取一个文件(我正在使用的示例文件大小约为4 GB),对该文件进行少量处理,然后将其写入Oracle数据库。 我的程序使用1个线程来读取文件,使用12个工作线程来进行处理和数据库推送。 我正在搅拌很多很多年轻的生成记忆,这导致我的程序比我想象的要慢。 建立 JDK 1.6.18 Spring批次2.1.x 4核心机器16 GB内存 -Xmx12G -Xms12G -NewRatio=1 -XX:+UseParallelGC -XX:+UseParallelOldGC 问题 有了这些JVM参数,我可以为Tenured Generation提供大约5.x GB的内存,为Young Generation提供大约5.X GB的内存。 在处理这个文件的过程中,我的Tenured Generation很好。 它增长到最大可能3 GB,我从来不需要做一个完整的GC。 然而,年轻一代最多次击中它。 它达到5 GB范围,然后发生并行次要GC并将Young Gen清除至500MB。 Minor GCs比完整的GC更好,但是它仍然会减慢我的程序(我很确定当年轻的gen集合发生时应用程序仍然会冻结,因为我看到数据库活动已经消失)。 我花费超过5%的计划时间用于较小的GC,这似乎过多。 我会说在处理这个4 GB文件的过程中,我会通过50-60GB的年轻生成内存进行流失 。 我在程序中没有看到任何明显的缺陷。 我试图遵守一般的OO原则并编写干净的Java代码。 我试图不要无缘无故地创建对象。 我正在使用线程池,并且尽可能传递对象而不是创建新对象。 我将开始分析应用程序,但我想知道是否有人有一些良好的一般经验法则或反模式,以避免导致过多的内存流失 ? 50-60GB的内存流失是否可以处理4GB文件? 我是否必须恢复到像对象池这样的JDk 1.2技巧? (尽管Brian Goetz做了一个演示文稿,其中包括为什么对象池是愚蠢的,我们不再需要这样做。我相信他比我更信任自己.. :))

为什么使用Java配置配置的JPAPagingItemReader的destroy方法’close’会失败?

我们正在尝试将Spring-Batch作业从XML配置转换为Java配置。 我们使用的是Spring 4.0.1.RELEASE和Spring Batch 2.2.1.RELEASE。 转换一个作业后,以下警告开始出现在日志文件中: 2014年4月15日09:59:26.335 [Thread-2] WARN osbfsDisposableBeanAdapter – 在名为’fileReader’的bean上调用destroy方法’close’失败:org.springframework.batch.item.ItemStreamException:关闭项目阅读器时出错 完整的堆栈跟踪是: org.springframework.batch.item.ItemStreamException: Error while closing item reader at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.close(AbstractItemCountingItemStreamItemReader.java:131) ~[spring-batch-infrastructure-2.2.1.RELEASE.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_25] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_25] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_25] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_25] at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:349) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:272) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:540) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:516) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:824) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:485) [spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE] at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:921) […]