ошибка с - ›не для сиддхи?

Я добавил следующий тестовый пример в AbsentWithEveryPatternTestCase.java, но тест не удался, и я думаю, что он должен быть успешным. Итак, есть ли ошибка с шаблоном "-> не для ..."?

@Test
public void testQuery7() throws InterruptedException {
    log.info("Test the query every e1 -> not e1 for 1 sec with e1 only");

    SiddhiManager siddhiManager = new SiddhiManager();

    String streams = "@app:playback(idle.time = '10 milliseconds', increment = '10 milliseconds') " +
            "define stream Stream1 (symbol string, price float, volume int); ";
    String query = "" +
            "@info(name = 'query1') " +
            "from every e1=Stream1[price>20] -> not Stream1[symbol==e1.symbol and price>e1.price] for 1sec " +
            "select e1.symbol as symbol " +
            "insert into OutputStream ;";

    SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(streams + query);

    TestUtil.TestCallback callback = TestUtil.addQueryCallback(siddhiAppRuntime, "query1", new Object[]{"GOOG"});

    InputHandler stream1 = siddhiAppRuntime.getInputHandler("Stream1");

    siddhiAppRuntime.start();

    stream1.send(1544512385000L, new Object[]{"WSO2", 55.6f, 100});
    stream1.send(1544512385100L, new Object[]{"GOOG", 55.6f, 100});
    stream1.send(1544512385800L, new Object[]{"WSO2", 55.7f, 100});
    stream1.send(1544512386200L, new Object[]{"GOOG", 55.6f, 100});

    callback.throwAssertionErrors();
    AssertJUnit.assertEquals("Number of success events", 1, callback.getInEventCount());
    AssertJUnit.assertEquals("Number of remove events", 0, callback.getRemoveEventCount());
    AssertJUnit.assertTrue("Event arrived", callback.isEventArrived());

    siddhiAppRuntime.shutdown();
}

person andrew    schedule 11.12.2018    source источник


Ответы (1)


Ваши утверждения не работают, потому что у вас нет времени на обработку событий после отправки входных данных. Как не работает запрос, заключается в том, что для каждого входящего события он будет ждать в течение времени, чтобы проверить его возникновение, а затем по прошествии времени выдать возникновение. Поэтому вам следует подождать и дать возможность обработать шаблонный запрос. Самый простой способ - добавить спящий поток после отправки.

Thread.sleep(1500);

Рекомендуемый способ - использовать служебная программа waitForEvent на Сиддхи. Вот пример.

Также следует отметить, что ваш запрос будет генерировать 3 выходных события, поскольку за последними 3 входными событиями не следует другое событие с более высокой ценой.

person Tishan    schedule 12.12.2018
comment
Привет, Тишан, я понимаю твое предложение. Но, поскольку в этом запросе использовалось «воспроизведение», я думаю, что когда было отправлено последнее событие, время сиддхи должно быть «1544512386200L», и это на 1 секунду больше, чем «1544512385100L», которое было временем второго события. Итак, я предполагаю, что сразу должно быть сгенерировано 1 выходное событие. - person andrew; 13.12.2018
comment
Даже при воспроизведении вы получите 3 выходных события, поскольку последние 3 события соответствуют вашему шаблону. А также вам нужно будет выспаться, так как для последнего события требуется еще одна секунда, чтобы соответствовать вашему состоянию. - person Tishan; 13.12.2018
comment
Более подробно изучив это, я заметил, что существует задержка между получением последнего события и выдачей соответствующих событий возникновения. Мы рассмотрим это дальше. Буду держать вас в курсе о проблеме с github, которую, я думаю, вы уже опубликовали - person Tishan; 18.12.2018
comment
Привет, Андью! Эта проблема устранена с помощью github.com/wso2/siddhi/pull/975 Пожалуйста, дайте нам знать, работает ли ваш сценарий сейчас так, как ожидалось. - person Tishan; 20.12.2018
comment
Да, пул-реквест решил эту проблему, большое спасибо за внимание! - person andrew; 24.12.2018