Tag: spring batch

无法打开JPA EntityManager进行交易; 嵌套exception是java.lang.IllegalStateException

我对Spring和Spring-Batch特别陌生。 我还是设法安装了Spring Batch-Admin 。 我添加了自定义作业和Hibernate / JPA以实现持久性。 一切都按预期工作,直到第一个块应该持久化。 然后我收到以下错误消息: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@60d31437] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@12da4b19] bound to thread [jobLauncherTaskExecutor-1] 这是完整的堆栈跟踪 : org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@43f9e588] for key [org.springframework.jdbc.datasource.DriverManagerDataSource@84f171a] bound to thread [jobLauncherTaskExecutor-1] […]

我们可以在Spring批处理中使用AmqpItemReader和AmqpItermWriter作为请求/回复用例吗?

我见过AmqpJobSample http://docs.spring.io/spring-batch/spring-batch-samples/#AmqpJobFunctionalTests 它使用AmqpItemReader从rabbitmq消息队列中读取,使用消息处理程序处理它,然后使用AmqpItemWriter写回队列。 我的用例是,从我实现的listItemReader中读取项目,然后将项目发送到消息队列,消息队列将由运行在不同服务器(rabbitmq集群)上的消费者处理,并且这些消费者将回复是否成功处理了iterm每个物品。 然后我将从消息队列(在itemWriter中)读取它,如果检查项目处理的状态,如果成功则返回itemWriter的状态,否则将抛出exception(如果失败)。 我的应用程序是在PHP Symfony框架中,但我正在介绍批处理的弹簧批处理,目前是shell脚本。 我使用spring批处理来生成消息,但我的消费者使用的是PHP,它运行在不同的服务器上。 我只想将id作为消息传递,并希望使用不同服务器上的PHP使用者来处理id。 如何进行远程分块或分区? http://docs.spring.io/spring-batch/reference/html/scalability.html 是否有任何样本用于使用消息传递进行远程分块和分区,例如RabbiyMq? 我怎么能使用AmqpItemReader和AmqpItemWriter? 我需要使用请求/回复吗? 我可以设置回复队列吗? 什么是最好的方法呢?

处理弹簧批处理中的两个文件

需要在spring批处理中读取文件,处理它并将其作为一个feed保存。 一个Feed包含50%的信息。 当我必须坚持Feed中的最终结果时,我需要使用一个公共字段将它们组合起来并像一个项目一样坚持下去。 请参阅下面的示例。 Feed1 fields: A|B|C|D|E Feed2 fields: A|I|J|K|L 我需要坚持的最终信息如下: A|B|C|D|E|I|J|K|L 请建议我如何在春季批量工作中实现这一目标。 谢谢。

SpringBatch – javaconfig vs xml

我一直在为Spring Batch使用Xml配置,感觉它更简单和简洁。 但是,现在人们建议使用javaconfig而不是xml。 我用Google搜索了这个话题。 这个网站告诉我们为什么javaconfig更好https://blog.codecentric.de/en/2013/06/spring-batch-2-2-javaconfig-part-1-a-comparison-to-xml/ 选择javaconfig而不是xml的主要原因 : 我们想在框架中做一些基本配置。 人们为我们的框架库添加依赖项,并根据需要导入这些配置。 如果这些配置是用XML编写的,那么他们很难打开它们来查看它们正在做什么。 在Java中没问题。 XML中没有可导航性。 只要您没有太多XML文件并且所有这些文件都在您的工作区中,这可能没问题,因为这样您就可以利用Spring IDE支持。 但是框架库通常不应该作为项目添加到工作区。 使用基于Java的配置时,您可以完美地跳转到框架配置类。 我将在以下博客文章中详细讨论这个主题。 在一个框架中,您经常需要库的用户必须满足的要求才能使一切工作,例如需要DataSource,PlatformTransactionManager和线程池。 从框架的角度来看,实现无关紧要,只需要在那里。 在XML中,你必须为框架的用户编写一些文档,告诉他们需要将这个以及这个以及此名称的Spring bean添加到ApplicationContext中。 在Java中,您只需编写一个描述该契约的接口,使用该库的人实现该接口并将其作为配置类添加到ApplicationContext。 这就是我对界面所做的。 这个网站告诉我们为什么xml更好https://dzone.com/articles/consider-replacing-spring-xml 选择xml而不是javaconfig的主要原因 配置是集中的,它不会分散在所有不同的组件中,因此您可以在一个地方对bean及其布线进行很好的概述。 如果您需要拆分文件,没问题,Spring会让您这样做。 然后,它在运行时通过内部标记或外部上下文文件聚合重新组合它们。 只有XML配置允许显式连接 – 而不是自动assembly。 有时,后者对我自己的品味来说有点太神奇了。 它显而易见的简单性隐藏了真正的复杂性:我们不仅需要在按类型和按名称自动assembly之间切换,更重要的是,在所有符合条件的版本中选择相关bean的策略可以逃脱,但是经验丰富的Spring开发人员。 配置文件似乎使这更容易,但相对较新,并为少数人所知。 最后但并非最不重要的是,XML与Java文件完全正交:2之间没有耦合,因此该类可以在具有不同配置的多个上下文中使用。 我总结说,如果您正在创建独立的批处理作业,并且您没有通过与Spring Batch集成来创建任何新框架,那么仍然可以使用xmls。 我错过了xmls的任何缺点吗?

DataLoader使用Spring Batch – 分区

我正在研究一个读取平面文件的数据加载器,一些处理和写入数据库。 dataloader.properties文件包含该值 LOAD=MM1,MM2,MM3,MM4,MM5… 我必须阅读这个属性文件并使用spring batch的partition step和partitioner ,我想要文件夹内的所有文件(MM1),读取和写入db parallel,特定文件的任何db错误都应回滚该内容文件,类似于其他文件夹(MM2)因为我是春季批处理的新手,我想知道如何对文件夹和XML配置文件中的文件名进行后期绑定,并且需要进行适当的回滚。 我还想在文件夹分区步骤中共享数据 以下是执行此操作的粗略配置。 根据上述要求,这是一种正确的方法吗?

Spring Batch Java Config事务 – 属性等价

在Spring批处理中,您可以像这样设置事务isolation和propagation : 我找不到相同的java配置。

无法将’org.springframework.batch.item.xml.StaxEventItemWriter’类型的值转换为必需的类型’org.springframework.batch.item.ItemReader’

我正在开发Spring Batch MongoDB to XML示例。 我已经成功创建了这个项目,但是当我运行它时,我看到下面的错误即将来临,我不知道这里出了什么问题。 参考错误 Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘step1’: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type ‘org.springframework.batch.item.xml.StaxEventItemWriter’ to required type ‘org.springframework.batch.item.ItemReader’ for property ‘itemReader’; nested exception is java.lang.IllegalStateException: Cannot convert value of type ‘org.springframework.batch.item.xml.StaxEventItemWriter’ to required type ‘org.springframework.batch.item.ItemReader’ […]

Spring批处理从文件中检索对象列表并在输出文件中返回单行

我使用spring batch读取CSV文件作为输入,我有2个CSV文件作为输出。 第一个文件包含大约100行。 输入文件包含5个colones id,typeProduct和price。 我只有两种类型的产品 我遍历所有这些行,我写了两个输出文件。 对于这两个文件,包含产品类型的单行和具有相同类型的所有这些产品的价格总和。 所以我需要在写入输出文件之前。 我希望得到一个列表中的所有行来创建条件并向我的对象添加一个新属性,例如结果if sum> 5000将取得好的值,其他将不会很好。例如。 并将它们显示在文件中存在的输出行中 这是我的产品 public class Product { private Long idt; private String typeProduct; private Double price; private String result; } 这是我工作的定义 这是分类器方法 public class ExampleWriterRouteImpl { @Classifier public String classify(Product batch){ if(batch.getTypeProduct().equals(“Telephone”)) return “tel”; else if(batch.getTypeProduct()).equals(“PC”))) return “pc”; return null; } } 因此,我需要对所有具有相同类型的产品求和,并且只有一个单独的输出行,其中包含产品类型以及每个输出文件的价格和结果的总和。 我不知道如何检索这些对象的列表,并在最后只检索一行。 […]

如何在spring批处理中读取ini文件(key = value)

我想创建一个批处理使用Spring批处理从ini文件中读取数据并将数据保存在数据库中但是当我查询org.springframework.batch.item.file.FlatFileItemReader类时,我没有找到解析数据的方法在ini文件中,我试图将ini4j API与spring批处理相结合但没有结果 我的ini文件: [Cat] a=1 b= 2 c= 3 d= 4 e= 5 f= 6 [Cat2] a=11 b= 21 c= 31 d= 41 e= 51 f= 61

Spring Batch Partitioning在itemReader中注入stepExecutionContext参数

我正在尝试使用Partitioner学习Spring Batch。 问题是我需要从Partitioner实现动态设置文件名。 我试图在itemReader获取它。 但它给出了文件名null 。 我的Spring Batch配置: @Bean @StepScope public ItemReader itemReader(@Value(“#{stepExecutionContext[filename]}”) String filename) throws UnexpectedInputException, ParseException { FlatFileItemReader reader = new FlatFileItemReader(); DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); String[] tokens = { “username”, “userid”, “transactiondate”, “amount” }; tokenizer.setNames(tokens); reader.setResource(new ClassPathResource( “input/”+filename)); DefaultLineMapper lineMapper = new DefaultLineMapper(); lineMapper.setLineTokenizer(tokenizer); lineMapper.setFieldSetMapper(new RecordFieldSetMapper()); reader.setLinesToSkip(1); reader.setLineMapper(lineMapper); return reader; } […]