public void start(final String siddhiApp, String input) {
        SiddhiManager siddhiManager = new SiddhiManager();

        info("Deploying the siddhi app");
        final SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp);

        // Add callbacks for all the streams
        final Set<String> streamNames = SiddhiCompiler.parse(siddhiApp).getStreamDefinitionMap().keySet();
        for (String streamName : streamNames) {
            final String stream = streamName;
            siddhiAppRuntime.addCallback(stream, new StreamCallback() {
                @Override
                public void receive(Event[] events) {
                    info("@Receive: Stream: " + stream + ", Event: " + Arrays.deepToString(events));
                }
            });
        }

        SiddhiDebugger siddhiDebugger = siddhiAppRuntime.debug();

        final InputFeeder inputFeeder = new InputFeeder(siddhiAppRuntime, input);

        System.out.println("Configure the breakpoints.\nYou can use the following commands:\n - " +
                ADD_BREAKPOINT + "<query name>:<IN/OUT>\n - " +
                REMOVE_BREAKPOINT + "<query name>:<IN/OUT>\n - " +
                START + "\n - " +
                STOP);
        printNextLine();
        final Scanner scanner = new Scanner(System.in, "UTF-8");
        while (scanner.hasNextLine()) {
            String userInput = scanner.nextLine().trim();
            String command = userInput.toLowerCase();

            if (command.startsWith(ADD_BREAKPOINT)) {
                if (!command.contains(QUERY_DELIMITER)) {
                    error("Invalid add query. The query must be " + ADD_BREAKPOINT + "<query " +
                            "name>:<IN/OUT>. Please try again");
                    printNextLine();
                    continue;
                }
                String[] components = userInput.substring(ADD_BREAKPOINT.length(), userInput.length()).split
                        (QUERY_DELIMITER);
                String queryName = components[0];
                String terminal = components[1].toLowerCase();

                if (IN.equals(terminal)) {
                    siddhiDebugger.acquireBreakPoint(queryName, SiddhiDebugger.QueryTerminal.IN);
                    info("Added a breakpoint at the IN terminal of " + queryName);
                    printNextLine();
                } else if (OUT.equals(terminal)) {
                    siddhiDebugger.acquireBreakPoint(queryName, SiddhiDebugger.QueryTerminal.OUT);
                    info("Added a breakpoint at the OUT terminal of " + queryName);
                    printNextLine();
                } else {
                    error("The terminal must be either IN or OUT but found: " + terminal.toUpperCase() +
                            ". Please try again");
                    printNextLine();
                }
            } else if (command.startsWith(REMOVE_BREAKPOINT)) {
                if (!command.contains(QUERY_DELIMITER)) {
                    error("Invalid add query. The query must be " + REMOVE_BREAKPOINT + "<query " +
                            "name>:<IN/OUT>. Please try again");
                    printNextLine();
                    continue;
                }
                String[] components = command.substring(ADD_BREAKPOINT.length(), command.length()).split
                        (QUERY_DELIMITER);
                String queryName = components[0];
                String terminal = components[1];

                if (IN.equals(terminal)) {
                    siddhiDebugger.releaseBreakPoint(queryName, SiddhiDebugger.QueryTerminal.IN);
                    info("Removed the breakpoint at the IN terminal of " + queryName);
                    printNextLine();
                } else if (OUT.equals(terminal)) {
                    siddhiDebugger.releaseBreakPoint(queryName, SiddhiDebugger.QueryTerminal.OUT);
                    info("Removed the breakpoint at the OUT terminal of " + queryName);
                    printNextLine();
                } else {
                    error("The terminal must be either IN or OUT but found: " + terminal.toUpperCase());
                    printNextLine();
                }

            } else if (STOP.equals(command)) {
                inputFeeder.stop();
                siddhiAppRuntime.shutdown();
                break;
            } else if (START.equals(command)) {
                inputFeeder.start();
                info("Siddhi Debugger starts sending input to Siddhi");
                System.out.println("You can use the following commands:\n - " +
                        NEXT + "\n - " +
                        PLAY + "\n - " +
                        STATE + ":<query name>\n - " +
                        STOP);
                break;
            } else {
                error("Invalid command: " + command);
                printNextLine();
            }
        }

        siddhiDebugger.setDebuggerCallback(new SiddhiDebuggerCallback() {
            @Override
            public void debugEvent(ComplexEvent event, String queryName, SiddhiDebugger.QueryTerminal queryTerminal,
                                   SiddhiDebugger debugger) {
                info("@Debug: Query: " + queryName + ", Terminal: " + queryTerminal + ", Event: " + event);
                printNextLine();
                while (scanner.hasNextLine()) {
                    String command = scanner.nextLine().trim().toLowerCase();
                    if (STOP.equals(command)) {
                        debugger.releaseAllBreakPoints();
                        debugger.play();
                        inputFeeder.stop();
                        siddhiAppRuntime.shutdown();
                        break;
                    } else if (NEXT.equals(command)) {
                        debugger.next();
                        break;
                    } else if (PLAY.equals(command)) {
                        debugger.play();
                        break;
                    } else if (command.startsWith(STATE)) {
                        if (!command.contains(QUERY_DELIMITER)) {
                            error("Invalid get state request. The query must be " + STATE + ":<query " +
                                    "name>. Please try again");
                            printNextLine();
                            continue;
                        }
                        String[] components = command.split(QUERY_DELIMITER);
                        String requestQueryName = components[1];

                        Map<String, Object> state = debugger.getQueryState(requestQueryName.trim());
                        System.out.println("Query '" + requestQueryName + "' state : ");
                        for (Map.Entry<String, Object> entry : state.entrySet()) {
                            System.out.println("    '" + entry.getKey() + "' : " + entry.getValue());
                        }
                        printNextLine();
                        continue;
                    } else {
                        error("Invalid command: " + command);
                        printNextLine();
                    }
                }
            }
        });

        inputFeeder.join();

        if (inputFeeder.isRunning()) {
            info("Input feeder has sopped sending all inputs. If you want to stop the execution, use " +
                    "the STOP command");
            printNextLine();
            while (scanner.hasNextLine()) {
                String command = scanner.nextLine().trim().toLowerCase();
                if (STOP.equals(command)) {
                    inputFeeder.stop();
                    siddhiAppRuntime.shutdown();
                    break;
                } else {
                    error("Invalid command: " + command);
                    printNextLine();
                }
            }
        }

        scanner.close();

        info("Siddhi Debugger is stopped successfully");
    }
Start the {@link SiddhiDebuggerClient} and configure the breakpoints.

@param siddhiApp the Siddhi query
@param input     the user input as a whole text
modules/siddhi-core/src/main/java/io/siddhi/core/debugger/SiddhiDebuggerClient.java