Помещение вывода из средства записи элементов 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
и отправьте его в шлюз СИ.