У меня есть вопрос, как точно описан здесь http://forum.spring.io/forum/spring-projects/integration/116827-file-inbound-channel-adapter-with-nio-locker-and-file-to-string-transformer/page2НИО-Locker и Windows,
В моем случае, входящий адаптер канала с установкой НИО-шкафчиком каналов в активатор службы через канал. Активатор службы получает исключение, говоря, что в файле есть блокировка.
Из приведенной выше ссылки не было прикрепленного билета Jira, поэтому я не знаю, было ли это разрешено или нет. Я вижу в документации, что он говорит, НИО-шкафчик, разделяемым, но не уверен, что включает в себя крепление «функции» окна
Запуска Windows 8, Java 1.8.0_60, Spring Integration 4.1.5
Исключение:
Caused by: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
XML Config распространяется по двум файлам контекста.
Первый контекст файла:
<file:inbound-channel-adapter id="filesIn" prevent-duplicates="true" auto-startup="false" auto-create-directory="false" channel="fileInChannel" filter="headerFilter" directory="${input.directory}">
<int:poller id="poller" fixed-delay="5000" />
<file:nio-locker/>
</file:inbound-channel-adapter>
Второй файл контекста
<int:channel id="fileInChannel">
</int:channel>
<int:service-activator input-channel="fileInChannel"
output-channel="headerEnricherInput" ref="fileHandler" />
Отрывок активатора службы
public Message<File> handleFile(Message<File> inputMessage) {
File input = inputMessage.getPayload();
String baseName = FilenameUtils.getBaseName(input.getName());
String headerFileName = baseName + ".xml";
File headerFile = new File(FilenameUtils.getFullPath(input
.getAbsolutePath()), headerFileName);
String transaction = new String();
try {
JAXBContext jc = JAXBContext.newInstance(HeaderFile.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
HeaderFile header = (HeaderFile) unmarshaller.unmarshal(headerFile);
System.out.println("Transaction " + header.getTransaction());
transaction = header.getTransaction();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Спасибо.
Спасибо за ответ. Я вижу пример, который вы написали. Я вижу, что он делает разблокировку через FileChannelCache, но FileChannelCache не является открытым классом, поэтому я не могу получить к нему доступ. Не понял ли я что-то в этом примере? Если я прямо использую FileChannel.open (путь) в методе, я все равно получаю ошибку. Благодаря! –