Программа базы данных в файл запроса - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть программа Spring Batch, которая читает из базы данных и записывает в файл.

Задание:

<job id="MyTransactionJob" job-repository="jobRepository" incrementer="dynamicJobParameters">
<step id="TransactionfileGenerator">
        <tasklet transaction-manager="jobRepository-transactionManager">
            <chunk reader="MyItemReader" writer="MyItemWriter"  commit-interval="1000" skip-policy="skipPolicy"/>
        </tasklet>
        <listeners>
            <listener ref="MySkipListener"/>
    </listeners>
    </step> 
 </job>

Элемент Reader равен:

<beans:bean id="MyItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <beans:property name="dataSource" ref="jobRepository-dataSource" />
    <beans:property name="sql" value="${dbTofileDataReadSQL}"/>
    <beans:property name="rowMapper">
        <beans:bean class="com.mypackage.MyRowMapper" />
    </beans:property>
</beans:bean>

dbTofileDataReadSQL - это простой выбор SQL, основанный на некоторых условиях.Таким образом, если условие не выполнено, будет возвращено 0 строк.

Элемент записи:

<beans:bean id="MyItemWriter" class="com.mypackage.MyDbToFileItemWriter">
    <beans:property name="delegate">
        <beans:bean class="org.springframework.batch.item.file.FlatFileItemWriter">
            <beans:property name="resource" value="file:c:\output.dat" />
            <beans:property name="shouldDeleteIfExists" value="true"/>
            <beans:property name="lineAggregator">
                <beans:bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
            </beans:property>
        </beans:bean>
    </beans:property>
</beans:bean>

Проблема даже в том случае, если число возвращенных строк равно 0, будет создан пустой файл, так как программа записи всегда будет работать.

Isможно поставить условие, чтобы файл создавался тогда и только тогда, когда нужно написать хотя бы одну строку.В противном случае просто пропустите часть ItemWriter.

Спасибо за чтение !!

1 Ответ

1 голос
/ 05 декабря 2011

файл будет открыт при запуске шага, вы можете

  • создать пользовательский FlatFileItemWriter, который использует файл ленивым образом
  • создать последующий шаг, который удаляет файл, еслитам нет написанных строк, это может быть более общее решение, если вы используете flow
  • , используя простой скрипт оболочки, который проверяет файл после задания и удаляет его, если он пуст
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...