Home Contact

Event Series Intelligence

Getting Help

How to get support

  • Please contact EsperTech for support, training and services for Esper.
  • Consider the solution patterns page on this site.
  • Consider checking the regression test suite for specific questions, see Source Repository, under folder "src/test/java/com/espertech/esper/regression"
  • File an issue using Github.
  • Use the Esper Usage forum for usage-related questions Esper Usage.
  • File a feature request, also through Github.
  • Look through the forum and mailing list archives.
  • Consider searching the existing Github issues (JIRA is no longer used as of March 5, 2015). The full content of JIRA is at JIRA content dump as of March 5, 2015.

When contacting us, please provide

  • The version used.
  • The complete stack trace of any exception, if an exception is reported.
  • A snippet of Java code or a unit test to reproduce the issue or question.
    • Keep this code very simple and minimal without any additional classes.
    • The test code should not require additional jar files other than those required by Esper itself.
    • The test code should not use random data. Please take the time to produce the minimal number of non-random test events.
    • The test code should only use threading when it demonstrates a threading problem. Use just the main thread for all testing otherwise.
    • For example test classes, please see the regression test suite at source code for Esper regression tests.
    • A sample test class is provided below.

Please consider obtaining support from EsperTech.

When we get questions on the forums that ask for a complete solution, we can often only provide short summarized answers as we don't usually have the time to look into each inquiry in the detail required. EsperTech support will spend the time needed to get you to a desired solution.

Sample format for "How do I" questions

When asking design questions on the forum please consider this outline.

Please first summarize the general use case briefly in 1 sentence.

In order for us to try and understand what you want to accomplish, please report input events, time passing and desired output following below format. This helps us understand the requirements you have. We would prefer not to look at an existing EPL design since we can usually help you better by understanding the requirements.

Please provide 3 minimal sample events and the desired output event(s) and timing relationship of input and output. Optimally this takes only 10 lines of text and concentrates only on relevant event properties, leaving unnecessary details off.

Please consider following this format for describing input and output events:

at time t0, an event arrives:
  event E1{id='001', value='...', ....}  (E1 being the event type and {} contains event property name value pairs)

at time t1, an event arrives:
  event E2{id='002', value='...', ....}

at time t2, which is 15 minutes after t0:
  output event {id='002', value='...', ....}

Sample code snippet for providing a test

  • Simple event class "Event" with a single field is part of the test class.
  • Time controlled via external timer events and not Thread.sleep
  • Exception handling not cluttering the test code
    public class TestExample extends TestCase {
    
        private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS";
    
        public void testExample() throws Exception {
            Configuration config = new Configuration();
            config.getEngineDefaults().getThreading().setInternalTimerEnabled(false);
            config.addEventType(Event.class);
            EPServiceProvider engine = EPServiceProviderManager.getDefaultProvider(config);
    
            // set the current time
            engine.getEPRuntime().sendEvent(new CurrentTimeEvent(parse("2001-05-1T08:20:00.000")));
    
            // put your EPL statements here
            String epl = "create variable boolean IsOutputTriggered_1 = false;" +
                    "\n" +
                    "select * from EventsWindow output snapshot when count_insert > 1;";
            engine.getEPAdministrator().getDeploymentAdmin().parseDeploy(epl);
    
            engine.getEPAdministrator().getStatement("out").addListener(new PrintUpdateListener());
    
            // send sample events
            System.out.println("Sending P1");
            engine.getEPRuntime().sendEvent(new Event("P1"));
    
            // advance time
            engine.getEPRuntime().sendEvent(new CurrentTimeEvent(parse("2001-05-1T08:20:01.000")));
    
            // send sample events
            System.out.println("Sending P2");
            engine.getEPRuntime().sendEvent(new Event("P2"));
        }
    
        public static long parse(String datestr) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
                return sdf.parse(datestr).getTime();
    
            }
            catch (Exception ex) {
                throw new RuntimeException("Error parsing date '" + datestr + "' as format '" + DATE_FORMAT + "' : " + ex.getMessage(), ex);
            }
        }
    
        public static class Event {
            private String productId;
    
            public Event(String productId) {
                this.productId = productId;
            }
    
            public String getProductId() {
                return productId;
            }
        }