1

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 +
                '}';
    }
}
impossible
  • 2,380
  • 8
  • 36
  • 60
  • Works fine for me. To get this to run I defined an empty TradeEvent since the code you posted is incomplete. – user3613754 Jul 01 '17 at 16:49
  • @user3613754 I tried again, but I don't see any of the statement's callback getting hit. I have added the remaining code and shorten it. Any help? – impossible Jul 03 '17 at 04:03
  • Maybe you are not running it in a plain Java application and therefore don't see console output? – user650839 Jul 03 '17 at 12:16
  • I would recommend to use a simple event class and please post the complete code and not leave out classes that are needed. – user650839 Jul 03 '17 at 12:18

2 Answers2

0

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);
impossible
  • 2,380
  • 8
  • 36
  • 60
0

Try running this code, this should work.

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);
    }
}

Basically, there is a reported issue on Esper's internal timer. Another similar issue.

More on config settings.