我试图围绕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
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; } 在此先感谢您的帮助
我有一个复杂的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 […]
我需要编写一个批处理作业,该作业从数据库表中提取行并基于某些条件,写入其他表或使用特定值更新此行。 我们使用spring和jdbc来获取结果集,并使用计划每周运行的独立java程序迭代并处理记录。 我知道这不是正确的方法,但我们必须将其作为临时解决方案。 随着记录增长到数百万,我们最终会出现内存exception,所以我知道这不是最好的方法。 你们中的任何人都可以推荐一种处理这种情况的最佳方法吗? 使用线程并为每个线程获取1000条记录并并行处理它们? (要么) 使用任何其他批处理机制来执行此操作(我知道有弹簧批但从未使用过此) (要么) 还有其他想法吗?
我正在寻找Spring Batch 2.0来实现管道流程。 该过程正在侦听某些事件,并且需要根据事件类型及其内容执行一组转换步骤。 Spring批次似乎很合适。 但是,通过文档,每个示例都将它们的作业及其步骤配置为xml。 框架是否支持在运行时创建作业并动态配置步骤?
我有一个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批处理作业时,我们面临以下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: […]
我正在尝试使用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 […]
我的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和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 […]