Чтобы быть максимально кратким,
У меня есть главный шаг, который разделяет выполнение на параллельные подчиненные.
Каждое из этих ведомых устройств имеет свой собственный контекст, в котором хранится идентификатор потока, в котором они выполняются, runNumber. Это шаги читателя, процессора, писателя. Написание этого раба - вот что меня беспокоит. У меня есть CompositeItemWriter, у которого есть писатель, который я хочу выполнить оператор обновления SQL, который обновляет успех потока в базе данных. Этот писатель ниже:
@Bean
@StepScope
public JdbcBatchItemWriter<TraceDataDto> controlSuccessWriter(
@Value("#{jobExecutionContext['runNumber']}") int runNumber,
@Qualifier("veDataSource") DataSource veDataSource) {
JdbcBatchItemWriter<TraceDataDto> mysqlWriter = new JdbcBatchItemWriter<>();
mysqlWriter.setDataSource(veDataSource);
String sql = "UPDATE control SET status=1 WHERE run_number = " + runNumber;
mysqlWriter.setSql(sql);
return mysqlWriter;
}
Теперь у меня проблемы с этим, поскольку он выдает ошибку:
java.lang.IllegalArgumentException: Using SQL statement with '?' placeholders requires an ItemPreparedStatementSetter
Теперь я знаю, что есть путь, которым я могу пойти, чтобы создать собственный класс, реализующий ItemPreparedStatementSetter, но меня беспокоит, что это создаст ненужные накладные расходы, сопоставляя отдельные значения с объектами.
Есть ли простой способ просто выполнить этот оператор обновления как часть подчиненного шага?




Ожидается, что реализации ItemWriter, предоставляемые Spring Batch, сохранят элементы. Это не то, что вы пытаетесь сделать, поэтому я бы рекомендовал создать ItemWriter (или даже лучше слушателя), который просто использует JdbcTemplate для выполнения нужного вам запроса.