2015-01-07 4 views
0

Приложение My Mule имеет дело с несколькими разными каталогами и перемещает файлы вокруг. У меня есть несколько входных конечных точек и соединителей файлов. У меня есть ситуации, в которых я должен опрашивать различные папки, обрабатывать файлы, перемещать их, опрос снова и т.д.Mule ESB - ConcurrentModificationException в FileMessageReceiver

Я вижу это исключение в журнале:

java.util.ConcurrentModificationException 
    at java.util.ArrayList.sort(ArrayList.java:1456) 
    at java.util.Collections.sort(Collections.java:175) 
    at org.mule.transport.file.FileMessageReceiver.poll(FileMessageReceiver.java:199) 
    at org.mule.transport.AbstractPollingMessageReceiver.performPoll(AbstractPollingMessageReceiver.java:216) 
    at org.mule.transport.PollingReceiverWorker.poll(PollingReceiverWorker.java:80) 
    at org.mule.transport.PollingReceiverWorker.run(PollingReceiverWorker.java:49) 
    at org.mule.transport.TrackingWorkManager$TrackeableWork.run(TrackingWorkManager.java:267) 
    at org.mule.work.WorkerContext.run(WorkerContext.java:286) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Исключение брошено здесь: http://grepcode.com/file/repo1.maven.org/maven2/org.mule.transports/mule-transport-file/3.5.0/org/mule/transport/file/FileMessageReceiver.java#199

Я заметил, что в этом случае http://grepcode.com/file/repo1.maven.org/maven2/org.mule.transports/mule-transport-file/3.5.0/org/mule/transport/file/FileMessageReceiver.java#675 тот же объект коллекции возвращается каждый раз, когда files.isEmpty() - это не идеальный и вполне может быть причиной проблемы.

Теперь, к счастью, это исключение не является разрушительным в целом, за исключением того, что оно, вероятно, заставляет пропустить цикл опроса и загрязняет журнал.

Кто-нибудь видел это раньше/идеи?

ответ

1

Похоже, что исключение исчезает, если я изменяю реализацию listFiles(), когда список файлов пуст.

package org.mule.transport.file; 

import org.mule.api.MuleException; 
import org.mule.api.construct.FlowConstruct; 
import org.mule.api.endpoint.InboundEndpoint; 
import org.mule.api.lifecycle.CreateException; 
import org.mule.api.transport.Connector; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

public class PatchedFileMessageReceiver extends FileMessageReceiver 
{ 
    private static final Logger log = LoggerFactory.getLogger(PatchedFileMessageReceiver.class); 

    /** 
    * 
    * @param connector 
    * @param flowConstruct 
    * @param endpoint 
    * @param readDir 
    * @param moveDir 
    * @param moveToPattern 
    * @param frequency 
    * @throws CreateException 
    */ 
    public PatchedFileMessageReceiver(Connector connector, FlowConstruct flowConstruct, InboundEndpoint endpoint, String readDir, String moveDir, String moveToPattern, long frequency) throws CreateException 
    { 
     super(connector, flowConstruct, endpoint, readDir, moveDir, moveToPattern, frequency); 
    } 

    /** 
    * 
    * @return 
    * @throws MuleException 
    */ 
    @Override 
    List<File> listFiles() throws MuleException 
    { 
     List<File> list = super.listFiles(); 

     if(list.isEmpty()) { 
      log.trace("List of files is empty, I'm gonna return a new empty ArrayList"); 
     } 

     return (list.isEmpty() ? new ArrayList<File>() : list); 
    } 
} 

А затем установить пользовательские FileMessageReceiver на разъеме файла как этот

<file:connector name="source-file-connector" autoDelete="false" fileAge="1000" pollingFrequency="1000" > 
    <service-overrides messageReceiver="org.mule.transport.file.PatchedFileMessageReceiver" /> 
</file:connector> 

Этот материал должен быть действительно фиксированной вверх по течению. В качестве пользователя можно было бы ожидать, что вам не придется справляться с такими проблемами.

1

Похож на проблему и должен быть исправлен. Я создал для вас issue. Следите за ним, чтобы быть в курсе прогресса исправления.

+0

Спасибо. Как только исправление будет выпущено, я приму свой ответ. – Guido

1

Лучшее решение, чем вернуть новый список каждый раз listFiles() вызывается (и нет никаких файлов) заключается в использовании CopyOnWriteArrayList для NO_FILES на http://grepcode.com/file/repo1.maven.org/maven2/org.mule.transports/mule-transport-file/3.5.0/org/mule/transport/file/FileMessageReceiver.java#64

private static final List<File> NO_FILES = new CopyOnWriteArrayList<File>(); 

Таким образом, вы будете избегать создания экземпляра ,

+0

напишите здесь ответ, а не ссылку. –

+0

Ответ предоставлен в виде строки, ссылка предназначена только для указания места размещения кода. – MarcosNC