Apache storm 如何在apache storm中从目录访问文件

Apache storm 如何在apache storm中从目录访问文件,apache-storm,Apache Storm,如何通过ApacheStorm拓扑访问目录中的文件 在拓扑类中,im传递AnnotationTest类的对象 Config conf = new Config(); conf.put("gateObject", new AnnotationTest()); 在螺栓类中,我正在访问该对象 AnnotationTest at; @Override public void prepare(Map stormConf, TopologyContext context) { a

如何通过ApacheStorm拓扑访问目录中的文件

在拓扑类中,im传递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类从目录sand sand目录也包含在jar文件(storm-starter-0.9.5-jar-with-dependencies.jar)的根目录中

下面是maven构建脚本

<resource>
     <directory>.</directory>
     <includes>
     <include>sand/**/*.*</include>
     </includes>
</resource>
这个jar文件中包含的所有源代码、依赖项和资源目录 我通过以下命令运行同样位于同一jar文件中的topology类来提交拓扑

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)
6892[main EventThread]INFO org.apache.storm.curator.framework.state.ConnectionStateManager-状态更改:已连接
6930[main]INFO backtype.storm.daemon.supervisor-在主机ubuntu上启动id为60c35cb1-f020-4f6f-bc79-fcafe3fff844的监控程序
java.io.FileNotFoundException:/sand/application.xgapp(没有这样的文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.io.FileInputStream。(FileInputStream.java:93)
位于sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
位于sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
在java.net.URL.openStream(URL.java:1045)
在gate.util.persistence.PersistenceManager.isXmlApplicationFile(PersistenceManager.java:1013)
位于gate.util.persistence.PersistenceManager.loadObjectFromUrl(PersistenceManager.java:857)
在backtype.storm.testing.AnnotationTest.(AnnotationTest.java:38)
在backtype.storm.testing.CopyTopology.submitTopology(CopyTopology.java:30)中
位于backtype.storm.testing.CopyTopology.main(CopyTopology.java:54)

所以,请告诉我一种从storm拓扑的bolt类中的目录(jar文件中提供)访问文件的方法

您将获得一个
java.io.FileNotFoundException
异常。这表示要传递给
java.net.URL
构造函数的文件“application.xgapp”的路径不包含该文件。从您的问题描述来看,似乎您已将文件保存在jar的根目录下。如果这是真的,那么就不能通过这种方式在jar中为文件形成URI——”file:///sand/application.xgapp".

改变

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

application=(ConditionalSerialAnalyserController)PersistenceManager
.loadObjectFromUrl(新URL(“文件://!/sand/application.xgapp”);
或者,您可以将sand/application.xgapp移到jar之外,并使用当前形式的URI

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