Помещение вывода из средства записи элементов Spring Batch в канал сообщений Spring Integration

Каков наилучший способ получения выходных данных от средства записи элементов Spring Batch - очевидно, запускаемого как часть задания - и помещения его в канал сообщений Spring Integration? Я понимаю, что одним из вариантов является кодирование слушателя Spring Batch (расширяющего ItemWriteListener), который будет добавлен в канал сообщения, а затем присоединить слушателя к пакетному заданию. Есть ли другой вариант?

1 ответ

Один из вариантов, чтобы ввести ItemWriter весенняя интеграция <gateway>:

<int:gateway id="itemWriterGateway" service-interface="com.my.proj.MyGateway"/>


class MyItemWriter implements ItemWriter<Foo> {

   @Autowired
   private MyGateway gateway;

   public void write(List<Foo> items) {
       for(Foo foo : items) {
           this.gateway.send(foo); 
       }
   }
}

Еще один вариант использования ItemWriterAdapter:

<bean id="myItemWriter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
    <property name="targetObject" ref="itemWriterGateway"/>
    <property name="targetMethod" value="send"/>
</bean>

Я не буду спорить, что StepListener может иметь значение для вас тоже. Но здесь необходимо понять, чего вы хотите достичь, используя Spring Integration из Batch Job...

ОБНОВИТЬ

На самом деле, Listener не поможет, потому что ItemWriter ничего не возвращает и заключает в себе свою логику вокруг базового ресурса.

Как вы говорите, что вы используете StaxEventItemWriter И его Resource какой-то выходной файл, возможно, есть причина отделить вашу логику и прочитать этот результат File с помощью <int-file:inbound-channel-adapter>...

ОБНОВЛЕНИЕ 2

) почему слушатель не поможет

Потому что вам нужен результат ItemReaderв противном случае вы должны построить свой XML еще раз в потоке SI из items (ItemWriteListener#afterWrite).

Как может выход StaxEventItemWriter и входящий адаптер подключиться к ресурсу, который хранится в памяти?

Как твоя resource в памяти, если StaxEventItemWriter требует, чтобы это exists?

С другой стороны, вы можете поделиться этим ресурсом с ItemWriter и некоторая конечная точка СИ. И правильно: вы можете сделать это из ChunkListener#afterChunk и получить свой resource от, например jobParameters и отправьте его в шлюз СИ.

Другие вопросы по тегам