الربيع الدفعة: java.io.IOException: تيار استثناء مغلقة عند الجمع بين MultiResourceItemWriter وFlatFileItemWriter

StackOverflow https://stackoverflow.com/questions/1804042

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي عملية دفعة الربيع الذي يأخذ مجموعة من الصفوف في قاعدة البيانات ويخلق عددا من الملفات مسطح من تلك الصفوف، 10 الصفوف لكل ملف. للقيام بذلك، لقد خلق عملية دفعة الربيع، مشابهة لهذه:

<batch:job id="springTest" job-repository="jobRepository" restartable="true">
    <batch:step id="test">
        <batch:tasklet>
            <batch:chunk reader="itemReader" writer="multipleItemWriter" commit-interval="2" />
        </batch:tasklet>
    </batch:step>
</batch:job>

<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="file:/temp/temp-input.txt" />
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.PassThroughLineMapper" />
    </property>
</bean>

<bean id="multipleItemWriter" class="org.springframework.batch.item.file.MultiResourceItemWriter">
    <property name="resource" value="file:/temp/temp-out" />
    <property name="itemCountLimitPerResource" value="2" />
    <property name="delegate">
        <bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
            <property name="lineAggregator">
              <bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
            </property>
            <property name="encoding" value="utf-8" />
            <property name="headerCallback" ref="headerFooter" />
            <property name="footerCallback" ref="headerFooter" />
        </bean>
   </property>
</bean>

<bean id="headerFooter" class="uk.co.farwell.spring.HeaderFooterCallback" />

والمثال أعلاه يقرأ من ملف ثابت والمخرجات إلى ملف ثابت (لإظهار المشكلة). لاحظ ارتكاب الفاصل الزمني = 2 في قطعة، وitemCountLimitPerResource = 2 في MultiResourceItemWriter.

ووHeaderFooterCallback يفعل ما يلي:

public void writeHeader(Writer writer) throws IOException {
    writer.write("file header\n");
}

public void writeFooter(Writer writer) throws IOException {
    writer.write("file footer\n");
}

وأنا بحاجة إلى أن تكون قادرة على تحديد بالضبط عدد الخطوط التي تظهر في الملف.

لملف الإدخال التالي:

foo1
foo2
foo3

وأتوقع ملفين على الإخراج،


وout.1:

file header
foo1
foo2
file footer

وout.2:

file header
foo3
file footer

عند أركض مع ارتكاب الفاصل الزمني = 2، وأحصل على استثناء:

2009-11-26 15:32:46,734 ERROR .support.TransactionSynchronizationUtils - TransactionSynchronization.afterCompletion threw exception
org.springframework.batch.support.transaction.FlushFailedException: Could not write to output buffer
    at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.afterCompletion(TransactionAwareBufferedWriter.java:71)
    at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCompletion(TransactionSynchronizationUtils.java:157)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(AbstractPlatformTransactionManager.java:974)
    .
    .
    .
Caused by: java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)
    at sun.nio.cs.StreamEncoder.write(Unknown Source)
    at sun.nio.cs.StreamEncoder.write(Unknown Source)
    at java.io.Writer.write(Unknown Source)
    at org.springframework.batch.support.transaction.TransactionAwareBufferedWriter$1.afterCompletion(TransactionAwareBufferedWriter.java:67).

وأنا أعتقد أن هذا هو علة. Wierdly، الملفات هي كما يلي:

وout.1:

file header
foo1
foo2

وout.2:

file footer

وإذا كان لدي سطرين في ملف الإدخال، كل شيء يعمل بشكل صحيح، ولكن أكثر من اثنين لا يعمل. إذا قمت بتغيير الفاصل الزمني ارتكاب إلى 200، ثم أحصل على ثلاثة خطوط في ملف واحد، وليس هذا هو السلوك أراد.

إذا شخص يمكن أن يقول لي إذا أنا أفعل شيئا خطأ، أو إذا لم كيفية الحصول على حل المشكلة، وسأكون ممتنة جدا.

هل كانت مفيدة؟

المحلول

في الواقع، وهذا هو الخطأ. انظر http://jira.springframework.org/browse/BATCH-1452 .

والحل، وفقا ل ديف Syer ، هو:

<اقتباس فقرة>   

ووIOException هو في الملعب. جزئي   الحل هو استخدام جديدة   الصفقات العقارية في   FlatFileItemWriter، ووضع ل   كاذبة (دفعة 1449). ولكن بعد ذلك تفقد   restartability (حتى اذا كان هذا ليس   المشكلة التي على ما يرام). سوف احاول   واصلاحها بشكل صحيح 2.1.

     

والحل الآخر هو الرد على عملية   الملفات في خطوة منفصلة (وليس   استخدام الاسترجاعات رأس / تذييل الصفحة).

     

والقضية العد (أكثر من 2 البنود   لكل ملف) هو مستقل حقا - ل   كان الكاتب متعدد الموارد أبدا   مصممة لضمان دقة   عدد من البنود في الملف، فقط ل   تمتد إذا تم اختراق الحد.   يمكنك فتح جيرة لتعزيز   إذا كنت تريد، A الحل هو استخدام   إلزام الفاصلة = "2" في المثال الخاص بك   (أو أكثر عموما عاملا لل   المطلوب حجم الملف).

نصائح أخرى

والنظر، التي تحاول قراءة البيانات من ديسيبل والكتابة إلى ملف. في هذا السيناريو، عند كتابة البيانات إلى ملف، تحتاج كائن لاستخدامها في ملف "HeaderFooterCallback". كيف يمكنك أن تفعل هذا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top