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