java - 在 Spring Batch 中,如何一个接一个地运行 2 个选择查询,我必须将第一个查询结果传递给第二个查询

标签 java spring spring-batch

我是 Spring Batch 的新手。我的第一个查询返回一个客户端 ID,必须在第二个查询中使用该 ID 来检索结果。我还需要在 ItemReaders 中进行这两个查询

我尝试过以下方法:

第一项阅读器:

@Component
public class ClientItemReader extends RepositoryItemReader<Client>{

private ClientRepository clientRepository;
private StepExecution stepExecution;

@BeforeStep
private void beforeStep(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}

public ClientItemReader(ClientRepository clientRepository) {
    this.clientRepository= clientRepository;
    super.setRepository(clientRepository);
    super.setMethodName("findAll");
    super.setPageSize(500);
}

@Override
public Client read()
        throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { 
    Client client= super.read();
    ExecutionContext stepExecutionContext = this.stepExecution.getExecutionContext();
    stepExecutionContext.put("clientId", client.getClientId());
    return client;
}       
}

第二个项目阅读器:

@Component
public class BillItemReader extends 
RepositoryItemReader<Bill>{

private BillRepository billRepository;
public static final String REPO_METHOD_NAME = "findByClientId";
private StepExecution stepExecution;

@BeforeStep
private void beforeStep(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}

public BillItemReader(BillRepository billRepository) {
    this.billRepository= billRepository;
    super.setRepository(billRepository);
    super.setMethodName(REPO_METHOD_NAME);
}

@Override
public Bill read()
        throws Exception, UnexpectedInputException, ParseException, 
NonTransientResourceException {
    ExecutionContext executionContext = stepExecution.getExecutionContext();
    if(executionContext.containsKey("clientId")) { 
       super.setArguments(Collections.singletonList
       (executionContext.getLong("clientId")));
       return super.read();
    } else {
        return null;
    }
}
}

自定义项目阅读器:

@Component
public class ClientBillItemReader implements ItemReader<List<Bill>>{

private final ClientItemReader clientItemReader;
private final BillItemReader billItemReader;

public ClientBillItemReader (ClientItemReader clientItemReader, 
BillItemReader billItemReader) {
    this.clientItemReader= clientItemReader;
    this.billItemReader= billItemReader;
}

@Override
public List<Bill> read()
        throws Exception, UnexpectedInputException, ParseException, 
NonTransientResourceException {
    List<Bill> items = new ArrayList<>();
    Client client= clientItemReader.read();
    Bill bill= billItemReader.read();
    items.add(bill);
    while(bill != null && Objects.equal(client.getBisId(), 
    bill.getClientId())) {
        bill = billItemReader.read();
        items.add(bill);
    }
    return items;
}
}

作业配置:

@Configuration
public class ClientBillJobConfig {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final ClientBillItemReader itemReader;
private final ClientBillItemProcessor itemProcessor;
private final ClientBillItemWriter itemWriter;

public ClientBillJobConfig(JobBuilderFactory jobBuilderFactory, 
StepBuilderFactory stepBuilderFactory, ClientBillItemReader itemReader, 
ClientBillItemProcessor itemProcessor, ClientBillItemWriter 
itemWriter) {
    this.jobBuilderFactory = jobBuilderFactory;
    this.stepBuilderFactory = stepBuilderFactory;
    this.itemReader = itemReader;
    this.itemProcessor = itemProcessor;
    this.itemWriter= itemWriter;
}

@Bean
public Step createClientBillStep() {
    return stepBuilderFactory.get("step"). 
<List<Bill>, 
clientBillResponse>chunk(1000).reader(itemReader)
.processor(itemProcessor).writer(itemWriter).build();
}

@Bean
public Job clientBillJob() {
    return jobBuilderFactory.get("jobName").incrementer(new 
    RunIdIncrementer()).flow(createClientBillStep()).end().build();
}
}

我遇到以下异常 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ClientBillJobConfig' defined in file [C:\Source\xyz\bin\main\com\xyz\client\config\ClientBillJobConfig.class]: Unsatisfied dependency expressed through constructor parameter 4; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ClientItemReader' defined in file [C:\Source\xyz\bin\main\com\xyz\client\job\reader\ClientItemReader.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: A sort is required

最佳答案

错误中写的是:

java.lang.IllegalStateException: A sort is required

您需要使用setSort()

关于java - 在 Spring Batch 中,如何一个接一个地运行 2 个选择查询,我必须将第一个查询结果传递给第二个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60327193/

相关文章:

java - Spring Batch Integration 远程分块错误 - 消息包含错误的作业实例 ID [25] 应该是 [24]

java - Spring 3.2 表单错误长静态 URL

java - 使用 JobRegistryBeanPostProcessor bean 时,sql 脚本不起作用

java - 使用 StaxEventItemWriter 构建重要的 XML 文件

java - Spring cvc-elt.1 : Cannot find the declaration of element 'beans' and similar problems

java - Spring validator 错误代码不会自动解析

java - 如何设置MongoTemplate集合映射

java - StringUtils.countMatches() 不适用于制表符字符

Java onCreate 带有参数,如 initWithParameter c++

java - 为什么 String.class == "test".class