Tag: spring batch

Spring Batch – 进程在哪里运行

我试图围绕Spring Batch,虽然很多教程都展示了很好的代码示例,但我觉得我很想念“spring batch engine”是如何工作的。 场景1 – 在用户创建时,在外部服务上创建用户。 网络请求 CreateLocalUser() 启动作业CreateExternalUser() 由于许多原因,CreateExternalUser()可能会失败,因此我们希望能够重试并记录Spring Batch可以为我们执行的错误。 它也是一个与我们本地用户的创建无关的解耦过程。 工作在哪里? 它是否会与Web请求在同一个线程中运行,这意味着最终用户必须等待作业完成才能获得http状态200? 想象一下,我有一个Web服务器和一个批处理服务器。 我希望所有作业都在批处理服务器上运行,但作业本身可以从Web服务器启动。 Spring Batch可以这样做吗? 我是否需要某种可以从Web服务器写入的队列和来自批处理服务器的消费,实际的工作将从哪里开始? 场景2 – 在巨大的文件中处理行,为每一行开始新的工作 读取大文件中的行(1.000.000行) 使用文件中的输入参数为每一行开始新作业。 处理1.000.000行很快,同时启动1.000.000个新作业或多或少。 这些运行在哪里? 他们是否与初始工作异步? 我的服务器是否能够同时或多或少地处理所有这些操作。 其他问题:是否可以根据作业输入参数查询作业。 即场景1,我想在我的网页上查看ID为1234的本地用户时显示CreateExternalUser作业状态/错误。 CreateExternalUser作业具有输入参数userId:1234

使用JdbcBatchItemWriter更新重复键

spring批量为我的项目,我只是尝试从csv文件读取并将数据加载到数据库,使用JdbcBatchItemWriter作为编写器。 我正在寻找一种方法来告诉编写器插入一个新行,但是,在重复键(或重​​复的唯一标识符)更新行而不是失败。 我知道我可以直接在sql语句中执行此操作,但这将特定于Mysql,但我希望我的代码与DBMS无关。 这是我在java配置中的编写器声明 @Bean @StepScope public ItemWriter writerHeadingCollectionsToDb(DataSource datasource) { String sqlStatement = “INSERT INTO abcd(id, first_name, last_name, phone_number” + “VALUES (:id, :firstName, :lastName, :phoneNumber)”; JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter(); itemWriter.setSql(sqlStatement ); itemWriter.setDataSource(dataSource); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); return itemWriter; } 在此先感谢您的帮助

用spring批处理读取复杂的json文件

我有一个复杂的json文件(具有嵌套的json数组)结构,如下所示: {“persons”:[ {“id”:”1″, “firstName”: “X”, “lastName”: “X”, “infos”: [{“address”:[{“city”: “X”, “country”: “X”}]}]}, {“id”:”2″, “firstName”: “Y”, “lastName”: “Y”, “infos”: [{“address”:[{“city”: “Y”, “country”: “Y”}]}]} ]} 我想分别阅读每一行(一个人) 所以我的弹簧批量配置是这样的 mapper类看起来像 public class PersonLineMapper implements LineMapper { private JsonLineMapper delegate; public mapLine(String line, int lineNumber) throws Exception { Map personAsMap = delegate.mapLine(line, lineNumber); Person person = new Person(); // map […]

用Java处理数百万个数据库记录

我需要编写一个批处理作业,该作业从数据库表中提取行并基于某些条件,写入其他表或使用特定值更新此行。 我们使用spring和jdbc来获取结果集,并使用计划每周运行的独立java程序迭代并处理记录。 我知道这不是正确的方法,但我们必须将其作为临时解决方案。 随着记录增长到数百万,我们最终会出现内存exception,所以我知道这不是最好的方法。 你们中的任何人都可以推荐一种处理这种情况的最佳方法吗? 使用线程并为每个线程获取1000条记录并并行处理它们? (要么) 使用任何其他批处理机制来执行此操作(我知道有弹簧批但从未使用过此) (要么) 还有其他想法吗?

可以在运行时使用动态步骤配置Spring Batch作业吗?

我正在寻找Spring Batch 2.0来实现管道流程。 该过程正在侦听某些事件,并且需要根据事件类型及其内容执行一组转换步骤。 Spring批次似乎很合适。 但是,通过文档,每个示例都将它们的作业及其步骤配置为xml。 框架是否支持在运行时创建作业并动态配置步骤?

如何在执行测试时阻止我的Spring Boot Batch应用程序运行?

我有一个Spring Boot Batch应用程序,我正在编写集成测试。 当我执行测试时,整个批处理应用程序运行。 如何只执行测试中的应用程序代码? 这是我的测试代码。 执行时,将运行整个批处理作业步骤(阅读器,处理器和编写器)。 然后,测试运行。 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = BatchApplication.class)) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, StepScopeTestExecutionListener.class }) public class StepScopeTestExecutionListenerIntegrationTests { @Autowired private FlatFileItemReader reader; @Rule public TemporaryFolder testFolder = new TemporaryFolder(); public StepExecution getStepExection() { StepExecution execution = MetaDataInstanceFactory.createStepExecution(); return execution; } @Test public void testGoodData() throws Exception { //some test code on one met […]

spring batch exception无法构造java.util.Map $ Entry

从命令行执行spring批处理作业时,我们面临以下exception。 Spring Batch Version – 3.0.2.RELEASE Spring Version – 4.0.0.RELEASE xStream version – 1.4.7 Data Base – mysql(我连接到新的数据库模式。)使用以下命令执行作业时,我遇到exception… java %JAVA_OPTS% org.springframework.batch.core.launch.support.CommandLineJobRunner config/spring-config.xml partitionJdbcJob Exception ———- INFO: Loaded JDBC driver: com.mysql.jdbc.Driver Feb 20, 2015 3:22:28 PM org.springframework.batch.core.launch.support.SimpleJobLauncher afterPropertiesSet INFO: No TaskExecutor has been set, defaulting to synchronous executor. Feb 20, 2015 3:22:29 PM org.springframework.batch.core.launch.support.SimpleJobLauncher run INFO: […]

Spring Batch ItemReader列表只处理一次

我正在尝试使用ListItemReader , ItemProcessor和ItemWriter创建Spring Batch作业。 XML如下所示, doc1.xkbml doc2.xkbml doc3.xkbml 读者,处理器和作者都是香草, public class SvnSourceItemReader extends ListItemReader { public SvnSourceItemReader(List list) { super(list); System.out.println(“Reading data list ” + list); } @Override public String read() { String out = (String) super.read(); System.out.println(“Reading data ” + out); return out; } } public class MetadataItemProcessor implements ItemProcessor { @Override public String […]

使用Java Config时的Spring批处理表前缀

我的Spring Batch存储库(部署在Oracle数据库上)位于不同的模式中,因此我需要预先添加模式名称。 使用XML配置时,这很容易做到: 但是,当我使用Java Config时,事实certificate这更棘手。 我找到的最佳解决方案是让我的Java Config类extend DefaultBatchConfigurer并覆盖createJobRepository()方法: @Configuration @EnableBatchProcessing public class BatchConfiguration extends DefaultBatchConfigurer{ @Autowired private DataSource dataSource; @Autowired private PlatformTransactionManager transactionManager; @Override protected JobRepository createJobRepository() throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(transactionManager); factory.setTablePrefix(“GFA.BATCH_”); factory.afterPropertiesSet(); return factory.getObject(); } … } 与XML解决方案相比,这几乎是代码! 而且它也不合逻辑 – 我的第一个猜测是提供一个@Bean方法,如下所示: @Bean public JobRepository jobRepository() throws Exception { […]

Spring Batch – 并非所有记录都是从MQ检索中处理的

我是Spring和Spring Batch的新手,如果你有任何问题,请随时提出任何澄清问题。 我看到Spring Batch的问题,我无法在我们的测试或本地环境中重新创建。 我们有一个日常工作,通过JMS连接到Websphere MQ并检索一组记录。 此作业使用开箱即用的JMS ItemReader。 我们实现了自己的ItemProcessor,但它除了记录之外没有做任何特殊的事情。 没有应该影响传入记录的filter或处理。 问题是,在MQ上的每日10,000多条记录中,只有大约700个左右(确切的数字每次不同)通常会记录在ItemProcessor中。 所有记录都已成功从队列中删除。 记录的记录数每次都不同,似乎没有模式。 通过将日志文件与MQ中的记录列表进行比较,我们可以看到一个看似随机的记录子集正在被我们的工作“处理”。 可能会拾取第一条记录,然后跳过50条记录,然后连续5条等等。每次作业运行时,模式都不同。 也没有记录exception。 在localhost中运行相同的应用程序并使用相同的数据集进行测试时,ItemProcessor将成功检索并记录所有10,000多条记录。 该作业在生产中运行20到40秒(也不是常数),但在测试和本地,它需要几分钟才能完成(这显然是有意义的,因为它处理了更多的记录)。 因此,这是解决问题的难题之一,因为我们无法重新创建它。 一个想法是实现我们自己的ItemReader并添加额外的日志记录,以便我们可以看到记录是否在读者之前或读者之后丢失 – 我们现在知道的是ItemProcessor只处理了一部分记录。 但即使这样也无法解决我们的问题,并且考虑到它甚至不是一个解决方案,它将在某种程度上及时实施。 还有其他人看过像这样的问题吗? 任何可能的想法或疑难解答建议将不胜感激。 以下是我们用于参考的一些jar版本号。 spring – 3.0.5.RELEASE Spring Integration – 2.0.3.RELEASE Spring Batch – 2.1.7.RELEASE 活动MQ – 5.4.2 Websphere MQ – 7.0.1 提前感谢您的意见。 编辑:每个请求,处理器的代码: public SMSReminderRow process(Message message) throws Exception { SMSReminderRow retVal […]