package cn.itweet.kafka_storm.topology;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.spout.SchemeAsMultiScheme;
import backtype.storm.topology.TopologyBuilder;
import cn.itweet.kafka_storm.bolt.CheckOrderBolt;
import cn.itweet.kafka_storm.bolt.CounterBolt;
import storm.kafka.KafkaSpout;
import storm.kafka.SpoutConfig;
import storm.kafka.StringScheme;
import storm.kafka.ZkHosts;

public class CounterTopology {

	/**
	 * @param args
	 * http://www.programcreek.com/java-api-examples/index.php?api=storm.kafka.KafkaSpout
	 */
	public static void main(String[] args) {
		try{
			//设置喷发节点并分配并发数,该并发数将会控制该对象在集群中的线程数(6个)
			String zkhost = "wxb-1:2181,wxb-2:2181,wxb-3:2181";
			String topic = "order";
			String groupId = "id";
			int spoutNum = 3;
			int boltNum = 1;
			ZkHosts zkHosts = new ZkHosts(zkhost);//kafaka所在的zookeeper
			SpoutConfig spoutConfig = new SpoutConfig(zkHosts, topic, "/order", groupId);  // create /order /id
			spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
			KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);

	        TopologyBuilder builder = new TopologyBuilder();
	        builder.setSpout("spout", kafkaSpout, spoutNum);
			builder.setBolt("check", new CheckOrderBolt(), boltNum).shuffleGrouping("spout");
	        builder.setBolt("counter", new CounterBolt(),boltNum).shuffleGrouping("check");

	        Config config = new Config();
	        config.setDebug(true);
	        
	        if(args!=null && args.length > 0) {
	            config.setNumWorkers(2);
	            StormSubmitter.submitTopology(args[0], config, builder.createTopology());
	        } else {        
	            config.setMaxTaskParallelism(2);
	
	            LocalCluster cluster = new LocalCluster();
	            cluster.submitTopology("Wordcount-Topology", config, builder.createTopology());

	            Thread.sleep(500000);

	            cluster.shutdown();
	        }
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

}