Таймер шаблона эспера: интервал () не работает

У меня есть этот основной код POC. Я вижу, что события публикуются, но не получают никаких предупреждений в слушателях. В приведенном ниже коде ни один из операторов pattern1 или pattern2 не получает предупреждения. SetInternalTimerEnabled в конфигурации по умолчанию имеет значение True, но я попытался установить его в коде, но проблема остается той же. Я что-то упускаю? Любая подсказка будет действительно полезной.

public class PatternSimpleQue {

    public static void main(String args[]) throws InterruptedException {
        Configuration configuration = new Configuration();
        configuration.addEventType("TestEvent", TestEvent.class);
        configuration.getEngineDefaults().getThreading().setInternalTimerEnabled(true);
        configuration.getEngineDefaults().getLogging().setEnableTimerDebug(true);

        EPServiceProvider engine = EPServiceProviderManager.getDefaultProvider(configuration);
        EPRuntime runtime = engine.getEPRuntime();
        EPAdministrator admin = engine.getEPAdministrator();
        engine.initialize();

        String pattern1 = "select * from pattern [every timer:interval(1 sec) -> every TestEvent]";
        String pattern2 = "select (select qty from TestEvent.std:lastevent()) as qty from pattern [every timer:interval(1 sec)]";

        admin.createEPL(pattern1).addListener((eventBeans, eventBeen1) -> {
            System.out.println("In event S3");
            try {
                for (EventBean anEventBean : eventBeans) {
                    System.out.println("****S3**** Pattern bean -> " + anEventBean.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        admin.createEPL(pattern2).addListener((eventBeans, eventBeen1) -> {
            System.out.println("In event S4");
            try {
                for (EventBean anEventBean : eventBeans) {
                    System.out.println("--S4--Pattern bean -> " + " :: " + anEventBean.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        while (true) {
            sendEvent(runtime, new TestEvent(String.valueOf(new Random().nextInt(100)), 10, 1));
            sendEvent(runtime, new TestEvent(String.valueOf(new Random().nextInt(100)), 20, -1));
            Thread.sleep(5000);
        }
    }

    private static void sendEvent(EPRuntime runtime, TestEvent testEvent) {
        System.out.println("\n-- New event: " + testEvent);
        runtime.sendEvent(testEvent);
    }
}


public class TestEvent {

    private String instanceId;
    private int qty;
    private int side;

    public String getInstanceId() {
        return instanceId;
    }

    public int getQty() {
        return qty;
    }

    public int getSide() {
        return side;
    }


    public TestEvent(String instanceId, int qty, int side) {
        this.instanceId = instanceId;
        this.qty = qty;
        this.side = side;
    }

    @Override
    public String toString() {
        return "TestEvent{" +
                "instanceId='" + instanceId + '\'' +
                ", qty=" + qty +
                ", side=" + side +
                '}';
    }
}

person impossible    schedule 30.06.2017    source источник
comment
У меня работает нормально. Чтобы запустить это, я определил пустой TradeEvent, так как код, который вы разместили, неполный.   -  person user3613754    schedule 01.07.2017
comment
@user3613754 user3613754 Я попробовал еще раз, но не вижу ни одного из обратных вызовов оператора. Я добавил оставшийся код и сократил его. Любая помощь?   -  person impossible    schedule 03.07.2017
comment
Может быть, вы не запускаете его в обычном Java-приложении и поэтому не видите вывод консоли?   -  person user650839    schedule 03.07.2017
comment
Я бы порекомендовал использовать простой класс событий и, пожалуйста, опубликуйте полный код и не пропускайте необходимые классы.   -  person user650839    schedule 03.07.2017


Ответы (2)


Я заработал, добавив дополнительное событие текущего времени.

runtime.sendEvent(new CurrentTimeEvent(currentTimeMillis()));

Я до сих пор не знаю, почему внутренний таймер Эспера не работает. Даже когда я включил его вручную.

configuration.getEngineDefaults().getThreading().setInternalTimerEnabled(true);
person impossible    schedule 03.07.2017

Попробуйте запустить этот код, он должен работать.

public class PatternSimpleQue {

    public static void main(String args[]) throws InterruptedException {
        Configuration configuration = new Configuration();
        configuration.addEventType("TestEvent", TestEvent.class);
        configuration.getEngineDefaults().getThreading().setInternalTimerEnabled(true);
        configuration.getEngineDefaults().getLogging().setEnableTimerDebug(true);

        EPServiceProvider engine = EPServiceProviderManager.getDefaultProvider(configuration);
        EPRuntime runtime = engine.getEPRuntime();
        EPAdministrator admin = engine.getEPAdministrator();
        engine.initialize();

        String pattern1 = "select * from pattern [every timer:interval(1 sec) -> every TestEvent]";
        String pattern2 = "select (select qty from TestEvent.std:lastevent()) as qty from pattern [every timer:interval(1 sec)]";

        admin.createEPL(pattern1).addListener((eventBeans, eventBeen1) -> {
            System.out.println("In event S3");
            try {
                for (EventBean anEventBean : eventBeans) {
                    System.out.println("****S3**** Pattern bean -> " + anEventBean.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        admin.createEPL(pattern2).addListener((eventBeans, eventBeen1) -> {
            System.out.println("In event S4");
            try {
                for (EventBean anEventBean : eventBeans) {
                    System.out.println("--S4--Pattern bean -> " + " :: " + anEventBean.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        while (true) {
            sendEvent(runtime, new TestEvent(String.valueOf(new Random().nextInt(100)), 10, 1));
            sendEvent(runtime, new TestEvent(String.valueOf(new Random().nextInt(100)), 20, -1));
            Thread.sleep(5000);
        }
    }

    private static void sendEvent(EPRuntime runtime, TestEvent testEvent) {
        System.out.println("\n-- New event: " + testEvent);
        runtime.sendEvent(new CurrentTimeEvent(currentTimeMillis()));
        runtime.sendEvent(testEvent);
    }
}

По сути, есть сообщение о проблеме с внутренним таймером Эспера. Еще одна похожая проблема.

Подробнее о настройки конфигурации.

person Community    schedule 08.07.2017