Skip to content

Siddhi 4.x as a Java library

Siddhi can be used as a library in any Java program (including in OSGi runtimes) just by adding Siddhi and its extension jars as dependencies.

Step 1: Creating a Java Project

  • Following are the mandatory dependencies that need to be added to the Maven pom.xml file (or to the program classpath).
   <dependency>
     <groupId>org.wso2.siddhi</groupId>
     <artifactId>siddhi-core</artifactId>
     <version>4.x.x</version>
   </dependency>
   <dependency>
     <groupId>org.wso2.siddhi</groupId>
     <artifactId>siddhi-query-api</artifactId>
     <version>4.x.x</version>
   </dependency>
   <dependency>
     <groupId>org.wso2.siddhi</groupId>
     <artifactId>siddhi-query-compiler</artifactId>
     <version>4.x.x</version>
   </dependency>
   <dependency>
     <groupId>org.wso2.siddhi</groupId>
     <artifactId>siddhi-annotations</artifactId>
     <version>4.x.x</version>
   </dependency>   

Note: You can create the Java project using any method you prefer. The required dependencies can be downloaded from here.

  • Create a new Java class in the Maven project.

Step 2: Creating Siddhi Application

A Siddhi application is a self contained execution entity that defines how data is captured, processed and sent out.

  • Create a Siddhi Application by defining a stream definition E.g.StockEventStream defining the format of the incoming events, and by defining a Siddhi query as follows.
      String siddhiApp = "define stream StockEventStream (symbol string, price float, volume long); " + 
                         " " +
                         "@info(name = 'query1') " +
                         "from StockEventStream#window.time(5 sec)  " +
                         "select symbol, sum(price) as price, sum(volume) as volume " +
                         "group by symbol " +
                         "insert into AggregateStockStream ;";

This Siddhi query groups the events by symbol and calculates aggregates such as the sum for price and sum of volume for the last 5 seconds time window. Then it inserts the results into a stream named AggregateStockStream.

Step 3: Creating Siddhi Application Runtime

This step involves creating a runtime representation of a Siddhi application.

SiddhiManager siddhiManager = new SiddhiManager();
SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp);
The Siddhi Manager parses the Siddhi application and provides you with an Siddhi application runtime. This Siddhi application runtime can be used to add callbacks and input handlers such that you can programmatically invoke the Siddhi application.

Step 4: Registering a Callback

You can register a callback to the Siddhi application runtime in order to receive the results once the events are processed. There are two types of callbacks:

  • Query callback: This subscribes to a query.
  • Stream callback: This subscribes to an event stream. In this example, a Stream callback is added to the AggregateStockStream to capture the processed events.

siddhiAppRuntime.addCallback("AggregateStockStream", new StreamCallback() {
           @Override
           public void receive(Event[] events) {
               EventPrinter.print(events);
           }
       });
Here, once the results are generated they are sent to the receive method of this callback. An event printer is added inside this callback to print the incoming events for demonstration purposes.

Step 5: Sending Events

In order to programmatically send events from the stream you need to obtain it's an input handler as follows:

InputHandler inputHandler = siddhiAppRuntime.getInputHandler("StockEventStream");
Use the following code to start the Siddhi application runtime, send events and to shutdown Siddhi:
//Start SiddhiApp runtime
siddhiAppRuntime.start();

//Sending events to Siddhi
inputHandler.send(new Object[]{"IBM", 100f, 100L});
Thread.sleep(1000);
inputHandler.send(new Object[]{"IBM", 200f, 300L});
inputHandler.send(new Object[]{"WSO2", 60f, 200L});
Thread.sleep(1000);
inputHandler.send(new Object[]{"WSO2", 70f, 400L});
inputHandler.send(new Object[]{"GOOG", 50f, 30L});
Thread.sleep(1000);
inputHandler.send(new Object[]{"IBM", 200f, 400L});
Thread.sleep(2000);
inputHandler.send(new Object[]{"WSO2", 70f, 50L});
Thread.sleep(2000);
inputHandler.send(new Object[]{"WSO2", 80f, 400L});
inputHandler.send(new Object[]{"GOOG", 60f, 30L});
Thread.sleep(1000);

//Shutdown SiddhiApp runtime
siddhiAppRuntime.shutdown();

//Shutdown Siddhi
siddhiManager.shutdown();
When the events are sent, you can see the output logged by the event printer.

Find the executable Java code of this example here

For more code examples, see quick start samples for Siddhi.

Top