package com.packtpub.storm.topology; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.generated.StormTopology; import backtype.storm.tuple.Fields; import com.packtpub.storm.model.Board; import com.packtpub.storm.model.GameState; import com.packtpub.storm.operators.GenerateBoards; import com.packtpub.storm.operators.isEndGame; import com.packtpub.storm.trident.spout.LocalQueueEmitter; import com.packtpub.storm.trident.spout.LocalQueueSpout; import com.packtpub.storm.trident.spout.LocalQueuerFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import storm.trident.Stream; import storm.trident.TridentTopology; import java.util.ArrayList; public class RecursiveTopology { private static final Logger LOG = LoggerFactory.getLogger(RecursiveTopology.class); public static StormTopology buildTopology() { LOG.info("Building topology."); TridentTopology topology = new TridentTopology(); // Work Queue / Spout LocalQueueEmitter<GameState> workSpoutEmitter = new LocalQueueEmitter<GameState>("WorkQueue"); LocalQueueSpout<GameState> workSpout = new LocalQueueSpout<GameState>(workSpoutEmitter); GameState initialState = new GameState(new Board(), new ArrayList<Board>(), "X"); workSpoutEmitter.enqueue(initialState); // Scoring Queue / Spout LocalQueueEmitter<GameState> scoringSpoutEmitter = new LocalQueueEmitter<GameState>("ScoringQueue"); Stream inputStream = topology.newStream("gamestate", workSpout); inputStream.each(new Fields("gamestate"), new isEndGame()) .each(new Fields("gamestate"), new LocalQueuerFunction<GameState>(scoringSpoutEmitter), new Fields("")); inputStream.each(new Fields("gamestate"), new GenerateBoards(), new Fields("children")) .each(new Fields("children"), new LocalQueuerFunction<GameState>(workSpoutEmitter), new Fields()); return topology.build(); } public static void main(String[] args) throws Exception { final Config conf = new Config(); final LocalCluster cluster = new LocalCluster(); LOG.info("Submitting topology."); cluster.submitTopology("recursiveTopology", conf, RecursiveTopology.buildTopology()); LOG.info("Topology submitted."); Thread.sleep(600000); } }