2017-02-08 13 views
-1

Как получить доступ к файлам в директории с помощью болта апача штормовой топологииКак получить доступ к файлам из каталога в апаче шторма

в классе топологии им проходящего объект класса AnnotationTest

Config conf = new Config(); 
conf.put("gateObject", new AnnotationTest()); 

В класс болта им доступ к этому объекту

AnnotationTest at; 
    @Override 
    public void prepare(Map stormConf, TopologyContext context) { 

     at=(AnnotationTest)stormConf.get("gateObject"); 
    } 

Но AnnotationTest класс получающего доступ много ресурсов из каталога песка каталог песка также включен в корне файл JAR (ливневый стартер-0.9.5-банка-с-dependencies.jar)

сценарий Maven сборки ниже

<resource> 
    <directory>.</directory> 
    <includes> 
    <include>sand/**/*.*</include> 
    </includes> 
</resource> 

, но при доступе а-файл из этого каталога песка в AnnotationTest класса, как показано ниже

application = (ConditionalSerialAnalyserController) PersistenceManager 
        .loadObjectFromUrl(new URL("file:///sand/application.xgapp")); 

Все исходные коды, зависимостей, каталоги ресурсов, включенных в этот единый файл JAR Im представление топологии, запустив КН класса топологии ич также внутри одного файла банки со следующей командой

storm jar storm-starter-0.9.5-jar-with-dependencies.jar backtype.storm.testing.CopyTopology 

следующее исключением воспитывающей

6892 [main-EventThread] INFO org.apache.storm.curator.framework.state.ConnectionStateManager - State change: CONNECTED 
6930 [main] INFO backtype.storm.daemon.supervisor - Starting supervisor with id 60c35cb1-f020-4f6f-bc79-fcafe3fff844 at host ubuntu 
java.io.FileNotFoundException: /sand/application.xgapp (No such file or directory) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(FileInputStream.java:195) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:93) 
    at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90) 
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188) 
    at java.net.URL.openStream(URL.java:1045) 
    at gate.util.persistence.PersistenceManager.isXmlApplicationFile(PersistenceManager.java:1013) 
    at gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:857) 
    at backtype.storm.testing.AnnotationTest.<init>(AnnotationTest.java:38) 
    at backtype.storm.testing.CopyTopology.submitTopology(CopyTopology.java:30) 
    at backtype.storm.testing.CopyTopology.main(CopyTopology.java:54) 

Так, пожалуйста, покажите мне способ получить доступ к файлам из каталога (который доступен в файл JAR) в классе болтов штормовой топологии.

ответ

0

Вы получаете исключение java.io.FileNotFoundException. Это указывает на то, что путь файла 'application.xgapp', который вы передаете в конструктор java.net.URL, не содержит файла. Из вашего описания вопроса кажется, что вы сохранили файл в корневом банке. Если это так, вы не можете сформировать URI для файла в банке таким образом - «file: ///sand/application.xgapp».

Изменить

application = (ConditionalSerialAnalyserController) PersistenceManager 
        .loadObjectFromUrl(new URL("file:///sand/application.xgapp")); 

в

application = (ConditionalSerialAnalyserController) PersistenceManager 
        .loadObjectFromUrl(new URL("file:/<jar-path>/<yourjar.jar>!/sand/application.xgapp")); 

Альтернативно, вы можете перемещать песок/application.xgapp вне баночку и использовать текущую форму URI.