[英]Using Apache Camel ProducerTemplate in Apache Storm bolt
我正在尝试编写简单的Storm + Camel项目。 我的Storm拓扑分析推文和一个bolt应该发送推文文本到apache camel路由,而后者又使用websocket通知一些webapp。
由于在尝试使用CamelContext构建时从螺栓接收的NotSerializableExceptions,我无法使其工作。
我已经尝试过的:
在storm conf中传递CamelContext,并在bolt的prepare(...)方法中使用它来gian访问它。 结果是 :
14484 [main]错误org.apache.storm.zookeeper.server.NIOServerCnxnFactory - Thread Thread [main,5,main] death java.lang.IllegalArgumentException:拓扑conf在backtype.storm.testing上不是json-serializable $ submit_local_topology.invoke (testing.clj:262)〜[storm-core-0.9.4.jar:0.9.4] at backtype.storm.LocalCluster $ _submitTopology.invoke(LocalCluster.clj:43)〜[storm-core-0.9.4。 jar:0.9.4] at backtype.storm.LocalCluster.submitTopology(Unknown Source)〜[storm-core-0.9.4.jar:0.9.4]
骆驼路线:
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:main")
.to("websocket:localhost:8085/main?sendToAll=true");
}
}
Storm Topology:Tweet Spout正在使用twitter4j stremaing API传播推文。
public class TwitterStreamTopology {
public static void main(String[] args) {
CamelContext producerTemplate = new RouteStarter().buildRoute();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("tweetSpout", new TweetSpout(keywords), 1);
builder.setBolt("websocket", new WebSocketBolt()).shuffleGrouping("tweetSpout");
Config conf = new Config();
conf.put("producerTemplate", producerTemplate.createProducerTemplate());
conf.setDebug(true);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("mytopology", conf, builder.createTopology());
Utils.sleep(20000);
cluster.shutdown();
}
}
WebsocketBolt:
public class WebSocketBolt extends BaseBasicBolt {
private ProducerTemplate producerTemplate;
@Override
public void execute(Tuple input, BasicOutputCollector basicOutputCollector) {
Status s = (Status) input.getValueByField("tweet");
producerTemplate.sendBody("direct:main", s.getText());
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
@Override
public void prepare(Map stormConf, TopologyContext context) {
super.prepare(stormConf, context);
this.producerTemplate = (ProducerTemplate) stormConf.get("producerTemplate");
}
}
有没有办法很好地做到这一点?
或者我应该通过http访问骆驼路由,并在bolt prepare(...)方法中创建一些HttpClient? 这仍然看起来有点矫枉过正,必须有一种方法让它变得更容易。
谢谢大家的帮助!
您的问题的根本原因是您正在向您的风暴配置添加ProducerTemplate,并且它正在抛出异常,因为它不可序列化。 如果那是你自己的类,你可以改变代码使其工作,但由于这是一个Camel类,我会推荐一种不同的方法。
private transient ProducerTemplate producerTemplate;
这样就不会尝试序列化了(将它置于conf中也有同样的问题)。 像这样的东西:
public class WebSocketBolt extends BaseBasicBolt {
private transient ProducerTemplate producerTemplate;
@Override
public void execute(Tuple input, BasicOutputCollector basicOutputCollector) {
Status s = (Status) input.getValueByField("tweet");
producerTemplate.sendBody("direct:main", s.getText());
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
@Override
public void prepare(Map stormConf, TopologyContext context) {
super.prepare(stormConf, context);
CamelContext producerTemplate = new RouteStarter().buildRoute();
this.producerTemplate = producerTemplate.createProducerTemplate();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.