{"id":60919,"date":"2016-10-18T07:00:40","date_gmt":"2016-10-18T04:00:40","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=60919"},"modified":"2016-10-17T15:30:07","modified_gmt":"2016-10-17T12:30:07","slug":"complex-event-processing-cep-apache-storm-apache-ignite","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html","title":{"rendered":"Complex event processing (CEP) with Apache Storm and Apache Ignite"},"content":{"rendered":"<p>In this article, author of the book\u00a0<a href=\"http:\/\/leanpub.com\/ignite\">&#8220;High Performance in-memory computing with Apache Ignite&#8221;<\/a>, will discuss the complex event processing with Apache Strom and the Apache Ignite. Part of this article taken from the complex event processing chapter of the<br \/>\n<a href=\"http:\/\/leanpub.com\/ignite\">book<\/a>.<\/p>\n<p>There is no broadly or highly accepted definition of the term Complex Event Processing or CEP. What Complex Event Processing is may be briefly described as the following quote from the Wikipedia:<\/p>\n<p>&#8220;Complex Event Processing, or CEP, is primarily an event processing concept that deals with the task of processing multiple events with the goal of identifying the meaningful events within the event cloud. CEP employs techniques such as detection of complex patterns of many events, event correlation and abstraction, event hierarchies, and relationships between events such as causality, membership, and timing, and event-driven processes.&#8221;<\/p>\n<p>For simplicity, Complex Event Processing (CEP) is a technology for low-latency filtering, aggregating and computing on real-world never ending or streaming event data. The quantity and speed of both raw infrastructure and business events are exponentially growing in IT environments. In addition, the explosion of mobile devices and the ubiquity of high-speed connectivity add to the explosion of mobile data. At the same time, demand for business process agility and execution has only grown. These two trends have put pressure on organizations to increase their capability to support event-driven architecture patterns of implementation. Real-time event processing requires both the infrastructure and the application development environment to execute on event processing requirements. These requirements often include the need to scale from everyday use cases to extremely high velocities or varieties of data and event throughput, potentially with latencies measured in microseconds rather than seconds of response time.<\/p>\n<p>Apache Ignite allows processing continuous never-ending streams of data in scalable and fault-tolerant fashion in in-memory, rather than analyzing data after it&#8217;s reached the database. Not only does this enable you to correlate relationships and detect meaningful patterns from significantly more data, you can do it faster and much more efficiently. Event history can live in memory for any length of time (critical for long-running event sequences) or be recorded as transactions in a stored database.<\/p>\n<p>Apache Ignite CEP can be used in a wealth of industries area, the following are some first class use cases:<\/p>\n<ol>\n<li>Financial services: the ability to perform real-time risk analysis, monitoring and reporting of financial trading and fraud detection.<\/li>\n<li>Telecommunication: ability to perform real time call detail record and SMS monitoring and DDoS attack.<\/li>\n<li>IT systems and infrastructure: the ability to detect failed or unavailable application or servers in real time.<\/li>\n<li>Logistics: ability to track shipments and order processing in real-time and reports on potential delays on arrival.<\/li>\n<\/ol>\n<p>There are a few more industrials or functional areas, where you can use Apache Ignite to process streams event data such as Insurance, transportation and Public sector. Complex event processing or CEP contains three main parts of its process:<\/p>\n<ol>\n<li>Event Capture or data ingesting.<\/li>\n<li>Compute or calculation of these data.<\/li>\n<li>Response or action.<\/li>\n<\/ol>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-1.png\"><img decoding=\"async\" class=\"aligncenter wp-image-60943\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-1.png\" alt=\"chap6-1\" width=\"620\" height=\"283\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-1.png 842w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-1-300x137.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-1-768x351.png 768w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>As shown in the above figure, data are ingesting from difference sources. Sources can be any sensors (IoT), web application or industry applications. Stream data can be concurrently processed directly on the Ignite cluster in collecting fashion. In addition, data can be enriched from other sources or filter out. After computing the data, computed or aggregated data can be exported to other systems for visualizing or taking an action.<\/p>\n<p>Apache Ignite Storm Streamer module provides streaming via Storm to Ignite cache. Before start using the Ignite streamer lets take a look at the Apache Storm to get a few basics about apache Storm.<\/p>\n<p>Apache storm is a distributed fault-tolerant real-time computing system. In a short time, Apache Storm became a standard for distributed real-time processing system that allows you to process a large amount of data. Apache Storm project is open source and written in Java and Clojure. It became a first choose for real-time analytics. Apache Ignite Storm streamer module provides a convenience way to streaming data via Storm to Ignite cache.<\/p>\n<p><b>Key concepts:<\/b><\/p>\n<p>Apache Storm reads raw stream of data from the one end and passes it through a sequence of small processing units and output the processed information at the other end. Let\u2019s have a detailed look at the main components of Apache Storm \u2013<\/p>\n<p><i>Tuples<\/i> \u2013 It is the main data structure of the Storm. It\u2019s an ordered list of elements. Generally, tuple supports all primitives data types.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-19.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60944\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-19.png\" alt=\"chap6-19\" width=\"543\" height=\"168\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-19.png 543w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-19-300x93.png 300w\" sizes=\"(max-width: 543px) 100vw, 543px\" \/><\/a><\/p>\n<p><i>Streams<\/i> \u2013 It\u2019s an unbound and un-ordered sequence of tuples.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-20.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60945\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-20.png\" alt=\"chap6-20\" width=\"556\" height=\"164\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-20.png 556w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-20-300x88.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/a><\/p>\n<p><i>Spouts<\/i> &#8211; Source of streams, in simple terms, a spout reads the data from a source for use in topology. A spout can reliable or unreliable. A spout can talk with Queues, Web logs, event data etc.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-21.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60946\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-21.png\" alt=\"chap6-21\" width=\"574\" height=\"169\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-21.png 574w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-21-300x88.png 300w\" sizes=\"(max-width: 574px) 100vw, 574px\" \/><\/a><\/p>\n<p><i>Bolts<\/i> &#8211; Bolts are logical processing units, it is responsible for processing data and creating new streams. Bolts can perform the operations of filtering, aggregation, joining, interacting with files\/database and so on. Bolts receive data from the spout and emit to one or more bolts.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-22.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60947\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-22.png\" alt=\"chap6-22\" width=\"586\" height=\"173\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-22.png 586w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-22-300x89.png 300w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/><\/a><\/p>\n<p><i>Topology<\/i> \u2013 A topology is a directed graph of Spouts and Bolts, each node of this graph contains the data processing logic (bolts) while connecting edges define the flow of the data (streams).<\/p>\n<p>Unlike Hadoop, Storm keeps the topology running forever until you kill it. A simple topology starts with spouts, emit stream from the sources to bolt for processing data. Apache Storm main job is to run the topology and will run any number of topology at given time.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-23.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60948\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-23.png\" alt=\"chap6-23\" width=\"595\" height=\"317\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-23.png 595w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-23-300x160.png 300w\" sizes=\"(max-width: 595px) 100vw, 595px\" \/><\/a><div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Ignite out of the box provides an implementation of Storm Bolt (StormStreamer) to streaming the computed data into Ignite cache. On the other hand, you can write down your custom Strom Bolt to ingest stream data into Ignite. To develop a custom Storm Bolt, you just have to implement *BaseBasicBolt* or *IRichBolt* Storm interface. However, if you decide to use StormStreamer, you have to configure a few properties to work the Ignite Bolt correctly. All mandatory properties are shown below:<\/p>\n<table border=\"1\">\n<tbody>\n<tr>\n<th>No<\/th>\n<th>Property Name<\/th>\n<th>Description<\/th>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>CacheName<\/td>\n<td>Cache name of the Ignite cache, in which the data will,be store.<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>IgniteTupleField<\/td>\n<td>Names the Ignite Tuple field, by which tuple data is,obtained in topology. By default the value is ignite.<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>IgniteConfigFile<\/td>\n<td>This property will set the Ignite spring configuration<br \/>\nfile. Allows you to send and consume message to and<br \/>\nfrom Ignite topics.<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>AllowOverwrite<\/td>\n<td>It will enabling overwriting existing values in the,cache, default value is false.<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>AutoFlushFrequency<\/td>\n<td>Automatic flush frequency in milliseconds. Essentially,,this is the time after which the streamer will make an<br \/>\nattempt to submit all data added so far to remote<br \/>\nnodes. Default is 10 sec.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Now that we have got the basics, let\u2019s build something useful to check how the Ignite\u00a0<i>StormStreamer<\/i> works. The basic idea behind the application is to design one topology of spout and bolt that can process a huge amount of data from a traffic log files and trigger an alert when a specific value crosses a predefined threshold. Using a topology, the log file is read line by line and the topology is designed to monitor the incoming data. In our case, the log file will contain data, such as vehicle registration number, speed and the highway name from highway traffic camera. If the vehicle crosses the speed limit (for example 120km\/h), Storm topology will send the data to Ignite cache.<\/p>\n<p>Next listing will show a CSV file of the type we are going to use in our example, which contain vehicle data information such as vehicle registration number, the speed at which the vehicle is traveling and the location of the highway.<\/p>\n<pre class=\"brush:java\">AB 123, 160, North city\r\nBC 123, 170, South city\r\nCD 234, 40, South city\r\nDE 123, 40, East city\r\nEF 123, 190, South city\r\nGH 123, 150, West city\r\nXY 123, 110, North city\r\nGF 123, 100, South city\r\nPO 234, 140, South city\r\nXX 123, 110, East city\r\nYY 123, 120, South city\r\nZQ 123, 100, West city<\/pre>\n<p>The idea of the above example is taken from the Dr. Dobbs journal. Since this book is not for studying Apache Storm, I am going to keep the example simple as possible. Also, I have added the famous word count example of Storm, which ingests the word count value into Ignite cache through StormStreamer module. If you are curious about the code, it&#8217;s available at<br \/>\n<a href=\"https:\/\/github.com\/srecon\/ignite-book-code-samples\/tree\/master\/chapters\/chapter-cep\/storm\">chapter-cep\/storm<\/a>. The above CSV file will be the source for the Storm topology.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-24.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60949\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-24.png\" alt=\"chap6-24\" width=\"686\" height=\"222\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-24.png 686w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-24-300x97.png 300w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/><\/a><\/p>\n<p>As shown in above figure, the\u00a0<i>FileSourceSpout<\/i> accepts the input CSV log file, reads the data line by line and emits the data to the SpeedLimitBolt for further threshold processing. Once the processing is done and found any car with exceeding the speed limit, the data is emitted to the Ignite StormStreamer bolt, where it is ingested into the cache. Let&#8217;s dive into the detailed explanation of our Storm topology.<\/p>\n<p><b>Step 1:<\/b><\/p>\n<p>Because this is a Storm topology, you must add the Storm and the Ignite StormStreamer dependency in the maven project.<\/p>\n<pre class=\"brush:xml\">&lt;dependency&gt;\r\n  &lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;ignite-storm&lt;\/artifactId&gt;\r\n  &lt;version&gt;1.6.0&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n&lt;dependency&gt;\r\n  &lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;ignite-core&lt;\/artifactId&gt;\r\n  &lt;version&gt;1.6.0&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n&lt;dependency&gt;\r\n  &lt;groupId&gt;org.apache.ignite&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;ignite-spring&lt;\/artifactId&gt;\r\n  &lt;version&gt;1.6.0&lt;\/version&gt;\r\n&lt;\/dependency&gt;\r\n&lt;dependency&gt;\r\n  &lt;groupId&gt;org.apache.storm&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;storm-core&lt;\/artifactId&gt;\r\n  &lt;version&gt;0.10.0&lt;\/version&gt;\r\n  &lt;exclusions&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;log4j&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;log4j&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;slf4j-log4j12&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;commons-logging&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;commons-logging&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;slf4j-simple&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;log4j-over-slf4j&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;exclusion&gt;\r\n  &lt;groupId&gt;org.apache.zookeeper&lt;\/groupId&gt;\r\n  &lt;artifactId&gt;zookeeper&lt;\/artifactId&gt;\r\n  &lt;\/exclusion&gt;\r\n  &lt;\/exclusions&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>At the time of writing this book, Apache Storm version 0.10.0 is only supported. Note that, You do not need any\u00a0<b>Kafka module<\/b> to run or execute this example as describe in the Ignite documentation.<\/p>\n<p><b>Step 2:<\/b><\/p>\n<p>Create an Ignite configuration file (see example-ignite.xml file in\u00a0<a href=\"https:\/\/github.com\/srecon\/ignite-book-code-samples\/tree\/master\/chapters\/chapter-cep\/storm\/src\/main\/resources\">\/chapter-cep\/storm\/src\/resources\/example-ignite.xml<\/a>) and make sure that it is available from the classpath. The content of the Ignite configuration is identical from the previous section of this chapter.<\/p>\n<pre class=\"brush:xml\">&lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"\r\n  xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n  xmlns:util=\"http:\/\/www.springframework.org\/schema\/util\"\r\n  xsi:schemaLocation=\"\r\n  http:\/\/www.springframework.org\/schema\/beans\r\n  http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\r\n  http:\/\/www.springframework.org\/schema\/util\r\n  http:\/\/www.springframework.org\/schema\/util\/spring-util.xsd\"&gt;\r\n  &lt;bean id=\"ignite.cfg\" class=\"org.apache.ignite.configuration.IgniteConfiguration\"&gt;\r\n  &lt;!-- Enable client mode. --&gt;\r\n  &lt;property name=\"clientMode\" value=\"true\"\/&gt;\r\n  &lt;!-- Cache accessed from IgniteSink. --&gt;\r\n  &lt;property name=\"cacheConfiguration\"&gt;\r\n  &lt;list&gt;\r\n  &lt;!-- Partitioned cache example configuration with configurations adjusted to server nodes'. --&gt;\r\n  &lt;bean class=\"org.apache.ignite.configuration.CacheConfiguration\"&gt;\r\n  &lt;property name=\"atomicityMode\" value=\"ATOMIC\"\/&gt;\r\n\r\n  &lt;property name=\"name\" value=\"testCache\"\/&gt;\r\n  &lt;\/bean&gt;\r\n  &lt;\/list&gt;\r\n  &lt;\/property&gt;\r\n  &lt;!-- Enable cache events. --&gt;\r\n  &lt;property name=\"includeEventTypes\"&gt;\r\n  &lt;list&gt;\r\n  &lt;!-- Cache events (only EVT_CACHE_OBJECT_PUT for tests). --&gt;\r\n  &lt;util:constant static-field=\"org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT\"\/&gt;\r\n  &lt;\/list&gt;\r\n  &lt;\/property&gt;\r\n  &lt;!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. --&gt;\r\n  &lt;property name=\"discoverySpi\"&gt;\r\n  &lt;bean class=\"org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi\"&gt;\r\n  &lt;property name=\"ipFinder\"&gt;\r\n  &lt;bean class=\"org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder\"&gt;\r\n  &lt;property name=\"addresses\"&gt;\r\n  &lt;list&gt;\r\n  &lt;value&gt;127.0.0.1:47500&lt;\/value&gt;\r\n  &lt;\/list&gt;\r\n  &lt;\/property&gt;\r\n  &lt;\/bean&gt;\r\n  &lt;\/property&gt;\r\n  &lt;\/bean&gt;\r\n  &lt;\/property&gt;\r\n  &lt;\/bean&gt;\r\n&lt;\/beans&gt;<\/pre>\n<p><b>Step 3:<\/b><\/p>\n<p>Create an\u00a0<i>ignite-storm.properties<\/i> file to add the cache name, tuple name and the name of the Ignite configuration as shown below.<\/p>\n<pre class=\"brush:java\">cache.name=testCache\r\ntuple.name=ignite\r\nignite.spring.xml=example-ignite.xml<\/pre>\n<p><b>Step 4:<\/b><\/p>\n<p>Next, create FileSourceSpout Java class as shown below,<\/p>\n<pre class=\"brush:java\">public class FileSourceSpout extends BaseRichSpout {\r\n  private static final Logger LOGGER = LogManager.getLogger(FileSourceSpout.class);\r\n  private SpoutOutputCollector outputCollector;\r\n  @Override\r\n  public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {\r\n  this.outputCollector = spoutOutputCollector;\r\n  }\r\n@Override\r\n  public void nextTuple() {\r\n  try {\r\n  Path filePath = Paths.get(this.getClass().getClassLoader().getResource(\"source.csv\").toURI());\r\n  try(Stream&lt;String&gt; lines = Files.lines(filePath)){\r\n  lines.forEach(line -&gt;{\r\n  outputCollector.emit(new Values(line));\r\n  });\r\n  } catch(IOException e){\r\n  LOGGER.error(e.getMessage());\r\n  }\r\n  } catch (URISyntaxException e) {\r\n  LOGGER.error(e.getMessage());\r\n  }\r\n  }\r\n  @Override\r\n  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {\r\n  outputFieldsDeclarer.declare(new Fields(\"trafficLog\"));\r\n  }\r\n}<\/pre>\n<p>The\u00a0<i>FileSourceSpout<\/i> code has three important methods<\/p>\n<ul>\n<li>open(): This method would get called at the start of the spout and will give you context information.<\/li>\n<li>nextTuple(): This method would allow you to pass one tuple to Storm topology for processing at a time, in this method, I am reading the CSV file line by line and emitting the line as a tuple to the bolt.<\/li>\n<li>declareOutputFields(): This method declares the name of the output tuple, in our case, the name should be trafficLog.<\/li>\n<\/ul>\n<p><b>Step 5:<\/b><\/p>\n<p>Now create\u00a0<i>SpeedLimitBolt.java<\/i> class which implements\u00a0<i>BaseBasicBolt<\/i> interface.<\/p>\n<pre class=\"brush:java\">public class SpeedLimitBolt extends BaseBasicBolt {\r\n  private static final String IGNITE_FIELD = \"ignite\";\r\n  private static final int SPEED_THRESHOLD = 120;\r\n  private static final Logger LOGGER = LogManager.getLogger(SpeedLimitBolt.class);\r\n  @Override\r\n  public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {\r\n  String line = (String)tuple.getValue(0);\r\n  if(!line.isEmpty()){\r\n  String[] elements = line.split(\",\");\r\n  \/\/ we are interested in speed and the car registration number\r\n  int speed = Integer.valueOf((elements[1]).trim());\r\n  String car = elements[0];\r\n  if(speed &gt; SPEED_THRESHOLD){\r\n  TreeMap&lt;String, Integer&gt; carValue = new TreeMap&lt;String, Integer&gt;();\r\n  carValue.put(car, speed);\r\n  basicOutputCollector.emit(new Values(carValue));\r\n  LOGGER.info(\"Speed violation found:\"+ car + \" speed:\" + speed);\r\n  }\r\n  }\r\n  }\r\n  @Override\r\n  public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {\r\n  outputFieldsDeclarer.declare(new Fields(IGNITE_FIELD));\r\n  }\r\n}<\/pre>\n<p>Let&#8217;s go through line by line again.<\/p>\n<ul>\n<li>execute(): This is the method where you implement the\u00a0business logic of your bolt, in this case, I am splitting the line by the\u00a0comma and check the speed limit of the car. If the speed limit of the given car is higher than the\u00a0threshold, we are creating a new treemap data type from this tuple and emit the tuple to the next bolt, in our case the next bolt will be the StormStreamer.<\/li>\n<li>declareOutputFields(): This method is similar to declareOutputFields() method in FileSourceSpout, it declares that it is going to return Ignite tuple for further processing.<\/li>\n<\/ul>\n<p>Note that, The tuple name\u00a0<b>IGNITE<\/b> is important here, the\u00a0<i>StormStreamer<\/i> will only process the tuple with name Ignite.<\/p>\n<p><b>Step 6:<\/b><\/p>\n<p>It&#8217;s the time to create our topology to run our example. Topology ties the spouts and bolts together in a graph, which defines how the data flows between the components. It also provides parallelism hints that Storm uses when creating instances of the components within the cluster. To implement the topology, create a new file named SpeedViolationTopology.java in the src\\main\\java\\com\\blu\\imdg\\storm\\topology directory. Use the following as the contents of the file:<\/p>\n<pre class=\"brush:java\">public class SpeedViolationTopology {\r\n  private static final int STORM_EXECUTORS = 2;\r\n\r\n  public static void main(String[] args) throws Exception {\r\n  if (getProperties() == null || getProperties().isEmpty()) {\r\n  System.out.println(\"Property file &lt;ignite-storm.property&gt; is not found or empty\");\r\n  return;\r\n  }\r\n  \/\/ Ignite Stream Ibolt\r\n  final StormStreamer&lt;String, String&gt; stormStreamer = new StormStreamer&lt;&gt;();\r\n\r\n  stormStreamer.setAutoFlushFrequency(10L);\r\n  stormStreamer.setAllowOverwrite(true);\r\n  stormStreamer.setCacheName(getProperties().getProperty(\"cache.name\"));\r\n\r\n  stormStreamer.setIgniteTupleField(getProperties().getProperty(\"tuple.name\"));\r\n  stormStreamer.setIgniteConfigFile(getProperties().getProperty(\"ignite.spring.xml\"));\r\n\r\n\r\n  TopologyBuilder builder = new TopologyBuilder();\r\n\r\n  builder.setSpout(\"spout\", new FileSourceSpout(), 1);\r\n  builder.setBolt(\"limit\", new SpeedLimitBolt(), 1).fieldsGrouping(\"spout\", new Fields(\"trafficLog\"));\r\n  \/\/ set ignite bolt\r\n  builder.setBolt(\"ignite-bolt\", stormStreamer, STORM_EXECUTORS).shuffleGrouping(\"limit\");\r\n  Config conf = new Config();\r\n  conf.setDebug(false);\r\n  conf.setMaxTaskParallelism(1);\r\n  LocalCluster cluster = new LocalCluster();\r\n  cluster.submitTopology(\"speed-violation\", conf, builder.createTopology());\r\n  Thread.sleep(10000);\r\n  cluster.shutdown();\r\n  }\r\n  private static Properties getProperties() {\r\n  Properties properties = new Properties();\r\n  InputStream ins = SpeedViolationTopology.class.getClassLoader().getResourceAsStream(\"ignite-storm.properties\");\r\n  try {\r\n  properties.load(ins);\r\n  } catch (IOException e) {\r\n  e.printStackTrace();\r\n  properties = null;\r\n  }\r\n  return properties;\r\n  }\r\n}<\/pre>\n<p>Let&#8217;s go through line by line again. First, we read the\u00a0<i>ignite-strom.properties<\/i> file to get all the necessary parameters to configure the StormStreamer bolt next. The storm topology is basically a Thrift structure. The\u00a0<i>TopologyBuilder<\/i> class provides the simple and elegant way to build complex Storm topology. The TopologyBuilder class has methods to setSpout and setBolt. Next, we used the Topology builder to build the Storm topology and added the spout with name\u00a0<i>spout<\/i> and parallelism hint of 1 executor.<\/p>\n<p>We also define the\u00a0<i>SpeedLimitBolt<\/i> to the topology with parallelism hint of 1 executor. Next we set the StormStreamer bolt with\u00a0<i>shufflegrouping<\/i>, which subscribes to the bolt, and equally, distributes tuples (limit) across the instances of the StormStreamer bolt.<\/p>\n<p>For development purpose, we create a local cluster using\u00a0<i>LocalCluster<\/i> instance and submit the topology using the\u00a0<i>submitTopology<\/i> method. Once the topology is submitted to the cluster, we will wait 10 seconds for the cluster to compute the submitted topology and then shutdown the cluster using\u00a0<i>shutdown<\/i> method of\u00a0<i>LocalCluster<\/i>.<\/p>\n<p><b>Step 7:<\/b><\/p>\n<p>Next, run a local node of Apache Ignite or cluster first. After building the maven project, use the following command to run the topology locally.<\/p>\n<pre class=\"brush:java\">mvn compile exec:java -Dstorm.topology=com.blu.imdg.storm.topology.SpeedViolationTopology<\/pre>\n<p>The application will produce a lot of system logs as follows.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-25.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60950\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-25.png\" alt=\"chap6-25\" width=\"718\" height=\"176\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-25.png 718w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-25-300x74.png 300w\" sizes=\"(max-width: 718px) 100vw, 718px\" \/><\/a><\/p>\n<p>Now, if we verify the Ignite cache through\u00a0<i>ignitevisior<\/i>, we should get the following output into the console.<\/p>\n<p><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-26.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-60951\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-26.png\" alt=\"chap6-26\" width=\"563\" height=\"229\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-26.png 563w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/chap6-26-300x122.png 300w\" sizes=\"(max-width: 563px) 100vw, 563px\" \/><\/a><\/p>\n<p>The output shows the result, what we expected. From our\u00a0<b>source.csv <\/b>log file, only five vehicles exceed the speed limit of 120 km\/h.<\/p>\n<p>This is pretty much sums up the practical overview of the Ignite Storm Streamer. If you are curious about Ignite Camel or Ignite Flume streamer please refer to the\u00a0<a href=\"http:\/\/leanpub.com\/ignite\">book &#8220;High performance in-memory computing with Apache Ignite&#8221;<\/a>. You can also contact the author for the free copy of the book, the book is freely distributed for Students and the teachers.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/frommyworkshop.blogspot.com\/2016\/10\/complex-event-processing-cep-with.html\">Complex event processing (CEP) with Apache Storm and Apache Ignite<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/join-us\/jcg\/\">JCG partner<\/a> Shamim Bhuiyan at the <a href=\"http:\/\/frommyworkshop.blogspot.com\">My workspace<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this article, author of the book\u00a0&#8220;High Performance in-memory computing with Apache Ignite&#8221;, will discuss the complex event processing with Apache Strom and the Apache Ignite. Part of this article taken from the complex event processing chapter of the book. There is no broadly or highly accepted definition of the term Complex Event Processing or &hellip;<\/p>\n","protected":false},"author":957,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[1307,944,381],"class_list":["post-60919","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-apache-ignite","tag-apache-storm","tag-cep"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"In this article, author of the book\u00a0&quot;High Performance in-memory computing with Apache Ignite&quot;, will discuss the complex event processing with Apache Strom\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"In this article, author of the book\u00a0&quot;High Performance in-memory computing with Apache Ignite&quot;, will discuss the complex event processing with Apache Strom\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-10-18T04:00:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Shamim Bhuiyan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shamim Bhuiyan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html\"},\"author\":{\"name\":\"Shamim Bhuiyan\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1685ad0945e2c2c7780a265a4174924f\"},\"headline\":\"Complex event processing (CEP) with Apache Storm and Apache Ignite\",\"datePublished\":\"2016-10-18T04:00:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html\"},\"wordCount\":2181,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Apache Ignite\",\"Apache Storm\",\"CEP\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html\",\"name\":\"Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2016-10-18T04:00:40+00:00\",\"description\":\"In this article, author of the book\u00a0\\\"High Performance in-memory computing with Apache Ignite\\\", will discuss the complex event processing with Apache Strom\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/10\\\/complex-event-processing-cep-apache-storm-apache-ignite.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Complex event processing (CEP) with Apache Storm and Apache Ignite\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1685ad0945e2c2c7780a265a4174924f\",\"name\":\"Shamim Bhuiyan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g\",\"caption\":\"Shamim Bhuiyan\"},\"description\":\"Dr. Shamim Ahmed Bhuiyan is an IT Architect, SOA solution designer, speaker and Big data evangelist. Independent consultant on BigData and HighLoad systems. Actively participates in development and designing high performance software for IT, telecommunication and banking industry.\",\"sameAs\":[\"http:\\\/\\\/frommyworkshop.blogspot.ru\",\"https:\\\/\\\/ru.linkedin.com\\\/in\\\/shamimbhuiyan\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/shamim-bhuiyan\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks","description":"In this article, author of the book\u00a0\"High Performance in-memory computing with Apache Ignite\", will discuss the complex event processing with Apache Strom","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html","og_locale":"en_US","og_type":"article","og_title":"Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks","og_description":"In this article, author of the book\u00a0\"High Performance in-memory computing with Apache Ignite\", will discuss the complex event processing with Apache Strom","og_url":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-10-18T04:00:40+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Shamim Bhuiyan","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Shamim Bhuiyan","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html"},"author":{"name":"Shamim Bhuiyan","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1685ad0945e2c2c7780a265a4174924f"},"headline":"Complex event processing (CEP) with Apache Storm and Apache Ignite","datePublished":"2016-10-18T04:00:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html"},"wordCount":2181,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Apache Ignite","Apache Storm","CEP"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html","url":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html","name":"Complex event processing (CEP) with Apache Storm and Apache Ignite - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2016-10-18T04:00:40+00:00","description":"In this article, author of the book\u00a0\"High Performance in-memory computing with Apache Ignite\", will discuss the complex event processing with Apache Strom","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/10\/complex-event-processing-cep-apache-storm-apache-ignite.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Complex event processing (CEP) with Apache Storm and Apache Ignite"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1685ad0945e2c2c7780a265a4174924f","name":"Shamim Bhuiyan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e704523cfc3333531913a51d8f2709a5e158d3c03dc0e26fe3f5747970a87895?s=96&d=mm&r=g","caption":"Shamim Bhuiyan"},"description":"Dr. Shamim Ahmed Bhuiyan is an IT Architect, SOA solution designer, speaker and Big data evangelist. Independent consultant on BigData and HighLoad systems. Actively participates in development and designing high performance software for IT, telecommunication and banking industry.","sameAs":["http:\/\/frommyworkshop.blogspot.ru","https:\/\/ru.linkedin.com\/in\/shamimbhuiyan"],"url":"https:\/\/www.javacodegeeks.com\/author\/shamim-bhuiyan"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/60919","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/957"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=60919"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/60919\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=60919"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=60919"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=60919"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}