Запуск весеннего пакетного задания - PullRequest
2 голосов
/ 18 августа 2011

У меня проблема с тем, что мне нужно получить серию сообщений из очереди MQ, записать это в файл и запустить пакетное задание пружины с файлом в качестве входных данных.Прямо сейчас я думаю о запуске работы с проводной @Autowired JobLauncher jobLauncher and @Autowired Job job; из самой MDB. Но я чувствую, что это не очень хороший подход, так как подпружиненный пакет может создать серию потоков, а EJB как таковой не поддерживает многопоточность.

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

Спасибо.

Ответы [ 2 ]

9 голосов
/ 24 сентября 2011
  • У меня проблема с тем, что мне нужно получить серию сообщений из очереди MQ, записать это в файл и запустить пакетное задание пружины с файлом в качестве ввода

Один из способов сделать это - задействовать Spring Integration, где у вас будет файловый опросщик, который будет запрашивать новый файл:

<file:inbound-channel-adapter id="filePoller"
                              channel="filesAreComing" 
                              directory="file:${input.directory}"
                              filename-pattern="test*" />

Адаптируйте file message (java.io.File) к file name (String), так как это то, что нужно Spring Batch. Это можно сделать с помощью адаптера JobLauncher, который уже доступен в Spring Batch Admin здесь :

@ServiceActivator
public JobLaunchRequest adapt(File file) throws NoSuchJobException {

    JobParameters jobParameters = new JobParametersBuilder().addString(
            "input.file", file.getAbsolutePath()).toJobParameters();

    return new JobLaunchRequest(job, jobParameters);
}

оберните его в JobLaunchRequest (который является просто держателем для Job и JobParameters) и отправьте этот запрос [в виде сообщения] на JobLaunchingMessageHandler:

<service-activator input-channel="jobLauncher">
    <beans:bean class="org.springframework.batch.integration.launch.JobLaunchingMessageHandler">
        <beans:constructor-arg ref="jobLauncher" />
    </beans:bean>
</service-activator>

, который запустит задание.

«input.file» - это параметр, связанный во время выполнения (следовательно, # {...}):

<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
    <property name="resource" value="#{jobParameters[input.file]}" />
    ... line mapper and other props
</bean>
0 голосов
/ 18 августа 2011

Я не уверен, что понимаю, почему у вас есть очередь сообщений, управляемый сообщениями POJO / EJB и пакетное задание.

Один из способов сделать это - заставить работать POJO / EJB, управляемый сообщениями. Это уже асинхронный процесс. Вы можете объединить bean-объекты, управляемые сообщениями, чтобы было достаточно рабочих для обработки нагрузки. Зачем добавлять сложность?

Если вы не хотите этого делать, забудьте о очереди и используйте Spring Batch самостоятельно. Я бы не стал делать то и другое.

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