2015-09-24 3 views
1

У меня есть вопрос, как точно описан здесь 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(); 
    } 

Спасибо.

ответ

0

Пожалуйста, найти свой код, следуя ссылкам из этого сообщения в форуме:

public static void readAndLogFile(File lockedFile) throws Exception { 
    FileLock fileLock = FileChannelCache.tryLockFor(lockedFile); 
    FileChannel fileChannel = fileLock.channel(); 
    ByteBuffer byteBuffer = ByteBuffer.allocate((int) fileChannel.size()); 
    fileChannel.read(byteBuffer); 
    System.out.println("Read File " + lockedFile.getName() + " from process " + JVM_PROCESS_ID + " with content: " + new String(byteBuffer.array())); 
} 

Как вы видите, мы должны использовать FileChannel, который отвечает за блокировку, чтобы прочитать содержимое файла.

Unix немного прощен в случае взаимоисключающей блокировки файлов. Но с Windows мы точно там :-).

+1

Спасибо за ответ. Я вижу пример, который вы написали. Я вижу, что он делает разблокировку через FileChannelCache, но FileChannelCache не является открытым классом, поэтому я не могу получить к нему доступ. Не понял ли я что-то в этом примере? Если я прямо использую FileChannel.open (путь) в методе, я все равно получаю ошибку. Благодаря! –