Тасклет для удаления таблицы в весеннем пакете

У меня есть шаги в пакетном задании, которые делают разные вещи.

Но прежде чем я начну все эти шаги, мне нужно очистить стол. Есть ли простой способ написать тасклет, который удалит таблицу непосредственно из XML-файла задания?

Я использую ibatis в качестве ORM


person user2434    schedule 20.10.2011    source источник


Ответы (3)


вы имеете в виду даже более простой, чем тасклет, например. нравится этот псевдокод?

<!-- xml bean config -->
<bean id="deleteTableTaskletStep" class="...">
   <property name="dataSource" ref="dataSource" />
   <property name="sql" value="delete from ..." />
</bean>

// java code
public class DeleteTableTasklet implements Tasklet {

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
    new JdbcTemplate(this.dataSource).executeQuery(this.sql)
    return RepeatStatus.FINISHED;
}
}
person Michael Pralow    schedule 20.10.2011
comment
Я сделал это ... только если бы я мог прочитать вопрос, прежде чем я ответил бы на него первым, Майкл :) :) :) :) - person Vicky; 20.10.2011
comment
Не могли бы вы добавить лучший способ убедиться, что это выполняется только один раз в начале задания? - person k-den; 20.03.2013
comment
шаг_задачи используется как любой другой шаг, просто используйте его (один раз) в качестве первого шага в конфигурация задания - person Michael Pralow; 21.03.2013
comment
У меня та же проблема, так почему же, когда я пытаюсь отправить источник данных в тасклет, я получаю исключение? - person Shilan; 27.02.2017

Для пакетной конфигурации Java. Шаг:

@Bean
private Step dropTable() {
  return stepBuilderFactory
    .get("dropTable")
    .transactionManager(transactionManager)
    .tasklet(dropTableTasklet())
    .build();
}

Тасклет:

private Tasklet dropTableTasklet() {
  return (contribution, chunkContext) -> {
    new JdbcTemplate(this.dataSource).execute(DROP_SCRIPT);
    return RepeatStatus.FINISHED;
  };
}

Скрипт (SQL-сервер):

private static final String DROP_SCRIPT = "IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES "
  + "WHERE TABLE_NAME = 'some_table') "
  + "BEGIN "
  + " DROP TABLE some_table "
  + "END";
person salerokada    schedule 20.07.2020

К вашему сведению, вместо тасклета вы можете использовать <jdbc:initialize-database>, чтобы указать на сценарий инициализации со всеми вашими SQL-запросами, используемыми для инициализации базы данных. Таким образом, запросы будет легче поддерживать.

<!-- xml bean config -->
<jdbc:initialize-database data-source="dataSource">
       <jdbc:script location="file:C:/db/initial-query.sql" />
</jdbc:initialize-database>

Просто не забудьте включить это вверху

<beans xmlns="http://www.springframework.org/schema/beans"
       ...
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="...
           http://www.springframework.org/schema/jdbc
           http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd">
person eureka    schedule 14.12.2016