siddhi icon indicating copy to clipboard operation
siddhi copied to clipboard

Cannot shutdown and start a same Siddhi app runtime

Open niveathika opened this issue 5 years ago • 1 comments

Description: $subject, due to clearing of all input handlers during the shutdown, https://github.com/siddhi-io/siddhi/blob/master/modules/siddhi-core/src/main/java/io/siddhi/core/stream/input/InputManager.java#L84

Here, the input handlers between source mappers and stream junction are cleared leading to log being printed as siddhi app runtime is not running,

[pool-4-thread-1] ERROR io.siddhi.extension.map.xml.sourcemapper.XmlSourceMapper  - Exception occurred when converting XML message to Siddhi Event
java.lang.InterruptedException: Siddhi app 'TestSiddhiApp' is not running, cannot send events
	at io.siddhi.core.stream.input.InputHandler.send(InputHandler.java:93)
	at io.siddhi.core.stream.input.source.PassThroughSourceHandler.sendEvents(PassThroughSourceHandler.java:40)
	at io.siddhi.core.stream.input.source.InputEventHandler.sendEvents(InputEventHandler.java:111)
	at io.siddhi.extension.map.xml.sourcemapper.XmlSourceMapper.mapAndProcess(XmlSourceMapper.java:254)
	at io.siddhi.core.stream.input.source.SourceMapper.onEvent(SourceMapper.java:152)
	at io.siddhi.core.stream.input.source.SourceMapper.onEvent(SourceMapper.java:118)
	at io.siddhi.extension.io.http.source.HttpWorkerThread.run(HttpWorkerThread.java:62)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Affected Siddhi Version: 5.1.12

Steps to reproduce: Modified Siddhi-io-http testcase

 @Test
    public void testHTTPStopAndStart() throws Exception {
        logger.info(" Creating test for publishing events without URL.");
        URI baseURI = URI.create(String.format("http://%s:%d", "0.0.0.0", 8280));
        List<String> receivedEventNameList = new ArrayList<>(2);
        PersistenceStore persistenceStore = new InMemoryPersistenceStore();
        SiddhiManager siddhiManager = new SiddhiManager();
        siddhiManager.setPersistenceStore(persistenceStore);
        siddhiManager.setExtension("xml-input-mapper", XmlSourceMapper.class);
        String inStreamDefinition = "@App:name('TestSiddhiApp')" +
                "@source(type='http', @map(type='xml') )" +
                "define stream inputStream (name string, age int, country string);";
        String query = ("@info(name = 'query') "
                + "from inputStream "
                + "select *  "
                + "insert into outputStream;"
        );
        SiddhiAppRuntime siddhiAppRuntime = siddhiManager
                .createSiddhiAppRuntime(inStreamDefinition + query);

        siddhiAppRuntime.addCallback("query", new QueryCallback() {
            @Override
            public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) {
                EventPrinter.print(timeStamp, inEvents, removeEvents);
                for (Event event : inEvents) {
                    eventCount.incrementAndGet();
                    receivedEventNameList.add(event.getData(0).toString());
                }
            }
        });
        siddhiAppRuntime.start();
        // publishing events
        List<String> expected = new ArrayList<>(2);
        expected.add("John");
        expected.add("Mike");
        String event1 = "<events>"
                + "<event>"
                + "<name>John</name>"
                + "<age>100</age>"
                + "<country>AUS</country>"
                + "</event>"
                + "</events>";
        String event2 = "<events>"
                + "<event>"
                + "<name>Mike</name>"
                + "<age>20</age>"
                + "<country>USA</country>"
                + "</event>"
                + "</events>";
        HttpTestUtil.httpPublishEventDefault(event1, baseURI);
        HttpTestUtil.httpPublishEventDefault(event2, baseURI);
        SiddhiTestHelper.waitForEvents(waitTime, 2, eventCount, timeout);
        Assert.assertEquals(receivedEventNameList.toString(), expected.toString());
        siddhiAppRuntime.shutdown();

        eventCount.set(0);
        receivedEventNameList.clear();

        siddhiAppRuntime.start();
        HttpTestUtil.httpPublishEventDefault(event1, baseURI);
        SiddhiTestHelper.waitForEvents(waitTime, 1, eventCount, timeout);
        Assert.assertEquals(receivedEventNameList.toString(), expected.toString());
        siddhiAppRuntime.shutdown();

    }

Related Issues: https://github.com/siddhi-io/distribution/issues/826 https://github.com/siddhi-io/siddhi-io-http/issues/161

niveathika avatar Jan 17 '20 09:01 niveathika

@niveathika Is this something affecting only Siddhi-io-http or would be the same in general for any siddhi application runtime? Also, on a related note, what would be the recommended way to restart an application runtime when using Siddhi as a java library? For my use case, I have a runtime that detects multiple patterns. On the first detection of any of them I want to restart the whole runtime to start again from scratch. Seems from the replies in #1614 that it is not possible to do that from the siddhi application itself so I am planning to "reset" the runtime from the "outside". I guess that it would be a matter of calling shutdown followed by start on the runtime object, since it seems there is no such thing as a restart method. Maybe @mohanvive can help on this. Ideally, it should be possible to clear the associated state for a runtime without having to recreate it.

salvalcantara avatar Jan 22 '20 05:01 salvalcantara