2017-02-08 1 views
-1

Comment accéder aux fichiers dans un répertoire par un boulon de la topologie de tempête apacheComment accéder aux fichiers d'un répertoire dans la tempête apache

dans la classe de topologie im objet passant de classe AnnotationTest

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

En une classe de boulon accédant im que cet objet

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

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

Mais le sort de la classe accédant AnnotationTest des ressources à partir du répertoire sable le répertoire de sable également inclus dans la racine du fichier jar (tempête-démarreur-0.9.5-pot avec-dependencies.jar)

le script build Maven ci-dessous

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

mais lors de l'accès le fichier de ce répertoire de sable dans AnnotationTest classe comme ci-dessous

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

Tous les codes sources, les dépendances, les répertoires de ressources inclus dans ce seul fichier jar Im soumettre la topologie en exécutant la classe de topologie wh ich également dans le même fichier jar par la commande suivante

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

l'exception suivante soulevant

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) 

Alors s'il vous plaît me montrer un moyen d'accéder aux fichiers à partir d'un répertoire (qui est disponible dans le fichier jar) dans la classe de boulon de la topologie de la tempête.

Répondre

0

Vous obtenez une exception java.io.FileNotFoundException. Cela indique que le chemin du fichier 'application.xgapp' que vous transmettez au constructeur java.net.URL ne contient pas le fichier. De la description de votre question, il semble que vous ayez conservé le fichier à la racine du pot. Si cela est vrai, vous ne pouvez pas former un URI dans un fichier dans le fichier de cette façon - "file: ///sand/application.xgapp".

changement

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

à

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

Alternativement, vous pouvez déplacer le sable/application.xgapp en dehors du pot et utilisez votre forme actuelle d'URI.