java的本地类加载_java – 在非默认类加载器下运行本地集群

来自Web类加载器的本地群集

我正在尝试从Web容器运行本地群集(是的,它仅用于开发和测试目的)并且在使用类加载器时遇到困难.

直接的方法

当我这样做简单和recommended方式,

ILocalCluster localCluster = new LocalCluster();

localCluster.submitTopology(topologyName, stormConf, topology);

我得到了回报

Async loop died!: java.lang.ClassCastException: my.company.storm.bolt.SomeFilteringBolt cannot be cast to org.apache.storm.task.IBolt

at org.apache.storm.daemon.executor$fn__7953$fn__7966.invoke(executor.clj:787)

at org.apache.storm.util$async_loop$fn__625.invoke(util.clj:482)

at clojure.lang.AFn.run(AFn.java:22)

at java.lang.Thread.run(Thread.java:745)

这是因为用于加载和实例化StormTopology的类加载器是Jetty WebAppClassLoader的实例,但LocalCluster.submitTopology()生成的(子)进程显然使用了系统类加载器.我通过在SomeFilteringBolt的静态块中记录类加载器来确认这一点 – 该类确实被加载了两次,并且WebAppCL中的螺栓显然无法在以后的系统类加载器上强制转换为螺栓.

预期的行为

现在,这让我感到惊讶,因为我认为Storm将序列化StormTopology实例,在本地“发送”它,反序列化并运行它.如果它这样做,它肯定会起作用.相反,似乎它直接使用提供的StormTopology实例,这在不同的类加载器下是有问题的.

从那以后我尝试了什么

我尝试将这些设置为true以强制Storm在本地序列化我的拓扑.没变.

我尝试在系统类加载器下运行LocalCluster:

ClassLoader originalClassloader = Thread.currentThread().getContextClassLoader();

try {

Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());

Config topologyConf = createTopologyConfig();

Map stormConf = createStormConfig(topologyConf);

StormTopology topology = createTopology(topologyConf);

ILocalCluster localCluster = new LocalCluster();

localCluster.submitTopology(topologyName, stormConf, topology);

} finally {

Thread.currentThread().setContextClassLoader(originalClassloader);

}

这实际上让我更进一步:

Thread died: java.lang.ExceptionInInitializerError

at clojure.core__init.__init0(Unknown Source)

at clojure.core__init.(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:348)

at clojure.lang.RT.classForName(RT.java:2154)

at clojure.lang.RT.classForName(RT.java:2163)

at clojure.lang.RT.loadClassForName(RT.java:2182)

at clojure.lang.RT.load(RT.java:436)

at clojure.lang.RT.load(RT.java:412)

at clojure.lang.RT.doInit(RT.java:454)

at clojure.lang.RT.(RT.java:330)

at clojure.lang.Namespace.(Namespace.java:34)

at clojure.lang.Namespace.findOrCreate(Namespace.java:176)

at clojure.lang.Var.internPrivate(Var.java:151)

at org.apache.storm.LocalCluster.(Unknown Source)

at my.company.storm.LocalTopologyRunner.startTopology(LocalTopologyRunner.java:146)

... 10 more

Caused by: java.lang.IllegalStateException: Attempting to call unbound fn: #'clojure.core/refer

at clojure.lang.Var$Unbound.throwArity(Var.java:43)

at clojure.lang.AFn.invoke(AFn.java:32)

at clojure.lang.Var.invoke(Var.java:379)

at clojure.lang.RT.doInit(RT.java:467)

at clojure.lang.RT.(RT.java:330)

... 18 more

笏?

这个问题

如何从系统类加载器以外的类加载器安全地在本地模式下运行Storm拓扑?

我正在运行Apache Storm 1.0.1,Jetty 8.1,Java 8u112 x64,Windows 7 x64.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值