Search code examples
complex-event-processingesper

Esper pattern timer:interval() is not working


I have this basic POC code. I can see the events getting published but not getting any alert in listeners. In the code below, none of the the statements pattern1 or pattern2 is getting alerted. Config's setInternalTimerEnabled is by default is True but I tried setting it True in code but still the same issue. Am I missing something? Any clue would be really helpful.

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 +
                '}';
    }
}

Solution

  • I got it working by adding extra Current Time Event.

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

    I still don't know why Esper's internal timer does not work. Even when I have enabled it manually.

    configuration.getEngineDefaults().getThreading().setInternalTimerEnabled(true);