Я настроил StaxEventItemWriter следующим образом:
@Bean
public StaxEventItemWriter fooWriter() {
return new StaxEventItemWriterBuilder()
.name("fooWriter")
.marshaller(marshaller())
.rootTagName("foos")
.build();
}
И MultiResourceItemWriter вот так:
@Bean
public MultiResourceItemWriter multiFooWriter() {
return new MultiResourceItemWriterBuilder()
.name("multiFooWriter")
.delegate(fooWriter())
.itemCountLimitPerResource(100)
.resourceSuffixCreator(index -> "-" + index + ".xml")
.resource(new FileSystemResource("foo"))
.build();
}
Однако, когда я запускаю пакет с использованием этих средств записи, я получаю следующее исключение:
Caused by: java.nio.channels.ClosedChannelException: null
at java.base/sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:160) ~[na:na]
at java.base/sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:284) ~[na:na]
at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.complete(TransactionAwareBufferedWriter.java:121) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4]
at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.beforeCommit(TransactionAwareBufferedWriter.java:106) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4]
... 44 common frames omitted
Я заметил, что это как-то связано с очисткой транзакций, поэтому я попробовал отключить транзакции в StaxEventItemWriter, и тогда это действительно сработало:
@Bean
public StaxEventItemWriter fooWriter() {
return new StaxEventItemWriterBuilder()
.name("fooWriter")
.marshaller(marshaller())
.rootTagName("foos")
.transactional(false) // Adding this works
.build();
}
Кроме того, если я записываю в один большой XML-файл (например, используя fooWriter() непосредственно в моей конфигурации Step вместо multiFooWriter()), то задание также завершается успешно.
Есть ли причина, по которой StaxEventItemWriter в сочетании с MultiResourceItemWriter не работает с транзакциями?
/>Для полноты примера, это класс Foo, который я использовал, и ItemReader (но это не имеет отношения к вопросу, поскольку проблема возникает с любым классом чтения/JAXB):
@Getter
@XmlRootElement(name = "foo")
@XmlType(propOrder = { "itemCount" })
@NoArgsConstructor
public class Foo implements ItemCountAware {
private int itemCount;
@Override
@XmlElement(name = "count")
public void setItemCount(int count) {
this.itemCount = count;
}
}
Для читателя я использую AbstractItemCountingItemStreamItemReader в сочетании с ItemCountAware для создания уникальных POJO Foo (но это не имеет отношения к проблеме):
@Component
public class FooReader extends AbstractItemCountingItemStreamItemReader {
public FooReader() {
setName("fooReader");
setMaxItemCount(10000);
}
@Override
protected Foo doRead() {
return new Foo();
}
@Override
protected void doOpen() {
}
@Override
protected void doClose() {
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... itemwriter
MultiResourceItemWriter не работает с транзакционным StaxEventItemWriter ⇐ JAVA
Программисты JAVA общаются здесь
1769204795
Anonymous
Я настроил StaxEventItemWriter следующим образом:
@Bean
public StaxEventItemWriter fooWriter() {
return new StaxEventItemWriterBuilder()
.name("fooWriter")
.marshaller(marshaller())
.rootTagName("foos")
.build();
}
И MultiResourceItemWriter вот так:
@Bean
public MultiResourceItemWriter multiFooWriter() {
return new MultiResourceItemWriterBuilder()
.name("multiFooWriter")
.delegate(fooWriter())
.itemCountLimitPerResource(100)
.resourceSuffixCreator(index -> "-" + index + ".xml")
.resource(new FileSystemResource("foo"))
.build();
}
Однако, когда я запускаю пакет с использованием этих средств записи, я получаю следующее исключение:
Caused by: java.nio.channels.ClosedChannelException: null
at java.base/sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:160) ~[na:na]
at java.base/sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:284) ~[na:na]
at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.complete(TransactionAwareBufferedWriter.java:121) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4]
at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.beforeCommit(TransactionAwareBufferedWriter.java:106) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4]
... 44 common frames omitted
Я заметил, что это как-то связано с очисткой транзакций, поэтому я попробовал отключить транзакции в StaxEventItemWriter, и тогда это действительно сработало:
@Bean
public StaxEventItemWriter fooWriter() {
return new StaxEventItemWriterBuilder()
.name("fooWriter")
.marshaller(marshaller())
.rootTagName("foos")
.transactional(false) // Adding this works
.build();
}
Кроме того, если я записываю в один большой XML-файл (например, используя fooWriter() непосредственно в моей конфигурации Step вместо multiFooWriter()), то задание также завершается успешно.
Есть ли причина, по которой StaxEventItemWriter в сочетании с MultiResourceItemWriter не работает с транзакциями?
/>Для полноты примера, это класс Foo, который я использовал, и ItemReader (но это не имеет отношения к вопросу, поскольку проблема возникает с любым классом чтения/JAXB):
@Getter
@XmlRootElement(name = "foo")
@XmlType(propOrder = { "itemCount" })
@NoArgsConstructor
public class Foo implements ItemCountAware {
private int itemCount;
@Override
@XmlElement(name = "count")
public void setItemCount(int count) {
this.itemCount = count;
}
}
Для читателя я использую AbstractItemCountingItemStreamItemReader в сочетании с ItemCountAware для создания уникальных POJO Foo (но это не имеет отношения к проблеме):
@Component
public class FooReader extends AbstractItemCountingItemStreamItemReader {
public FooReader() {
setName("fooReader");
setMaxItemCount(10000);
}
@Override
protected Foo doRead() {
return new Foo();
}
@Override
protected void doOpen() {
}
@Override
protected void doClose() {
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79825366/multiresourceitemwriter-does-not-work-with-transactional-staxeventitemwriter[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия