源码下载:
https://download.youkuaiyun.com/download/adam_zs/10338151
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.wangzs.springjms;
import javax.jms.Session;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.jms.JmsProvider;
import org.apache.storm.jms.JmsTupleProducer;
import org.apache.storm.jms.spout.JmsSpout;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.utils.Utils;
public class ExampleJmsTopology {
public static void main(String[] args) throws Exception {
// JMS Queue Provider
JmsProvider jmsQueueProvider = new SpringJmsProvider("spring/applicationContext-activemq.xml", "jmsConnectionFactory",
"notificationQueue");
// JMS Producer
JmsTupleProducer producer = new JsonTupleProducer();
// JMS Queue Spout
JmsSpout queueSpout = new JmsSpout();
queueSpout.setJmsProvider(jmsQueueProvider);
queueSpout.setJmsTupleProducer(producer);
queueSpout.setJmsAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
queueSpout.setDistributed(true); // allow multiple instances
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("jms-spout", queueSpout, 5);
builder.setBolt("split-bolt", new SplitBolt(), 10).shuffleGrouping("jms-spout");
builder.setBolt("count-bolt", new CountBolt(), 1).globalGrouping("split-bolt");
Config conf = new Config();
if (args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} else {
conf.setDebug(true);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("storm-jms-example", conf, builder.createTopology());
Utils.sleep(100000);
cluster.killTopology("storm-jms-example");
cluster.shutdown();
}
}
}
package com.wangzs.springjms;
import java.util.List;
import java.util.Map;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
/**
* 对数据进行分割
*/
public class SplitBolt extends BaseRichBolt {
private OutputCollector collector;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
}
@Override
public void execute(Tuple input) {
List values = input.getValues();
String line = (String) values.get(0);
String[] words = line.split(" ");
for (String word : words) {
this.collector.emit(new Values(word));
}
this.collector.ack(input);
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
}
}
package com.wangzs.springjms;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Tuple;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import net.sf.json.JSONObject;
/**
* 词频汇总Bolt
*/
public class CountBolt extends BaseRichBolt {
private HashMap<String, Integer> map = new HashMap<String, Integer>();
private JmsTemplate jmsTemplate;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
new String[] { "classpath*:spring/applicationContext-*.xml" });
this.jmsTemplate = (JmsTemplate) applicationContext.getBean("jmsTemplate");
}
@Override
public void execute(Tuple input) {
String word = input.getStringByField("word");
Integer count = map.get(word);
if (count == null) {
count = 0;
}
count++;
map.put(word, count);
System.out.println("~~~~~~~~~~~~execute~~~~~~~~~~");
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry);
}
jmsTemplate.send("QUEUE_ItShow", new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(JSONObject.fromObject(map).toString());
}
});
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
@Override
public void cleanup() {
System.out.println("~~~~~~~~~~~~cleanup~~~~~~~~~~");
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry);
}
}
}