Связь отдельных процессов через события Esper

1

Я пытаюсь, чтобы несколько java-процессов обменивались событиями с помощью Esper. Один процесс должен отправлять события, другой - подготавливает запрос и реагирует в соответствии с сообщенными событиями.

Когда обе операции выполняются в рамках одного и того же Java-процесса, все работает нормально. Но когда я использую два разных процесса, они просто не видят друг друга. Мне интересно, что является ключом к этому сообщению. Я использовал одно и то же имя для провайдера. Это все, что я мог сделать до сих пор.

Продюсер:

String aType = espertest.dummy.A.class.getName();
Configuration cepConfig = new Configuration();
cepConfig.addEventType("A",aType);
EPServiceProvider epService = EPServiceProviderManager.getProvider("DummyProvider", cepConfig);
Object o = new A();
epService.getEPRuntime().sendEvent(o);

Потребитель:

String aType = A.class.getName();
String expression = "select count(*) from "+aType + "";
System.out.println("Our Query: " + expression);

Configuration cepConfig = new Configuration();
cepConfig.addEventType("A",aType);

EPServiceProvider epService = EPServiceProviderManager.getProvider("DummyProvider", cepConfig);

EPStatement statement = epService.getEPAdministrator().createEPL(expression);

DummyListener listener = new DummyListener();
statement.addListener(listener);
System.out.println("Anything");


try{
    A a = new A();
    epService.getEPRuntime().sendEvent(a);
    Thread.sleep(60000);
}catch(Exception E)
{
    System.out.println("Exception ");
}

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

Теги:
esper

1 ответ

1
Лучший ответ

Вам необходимо настроить промежуточное программное обеспечение (очередь сообщений, распределенный кэш, сетевую файловую систему, соединение с разъемами и т.д.), Чтобы получить события от JVM производителя до потребительской JVM. Если вы можете развернуть производителя и потребителя в контейнере, поддерживающем Apache Camel (например, ServiceMix), тогда должно быть тривиально стоять прототип, который использует ActiveMQ для транспортировки ваших объектов в Esper, поскольку Camel поддерживает оба продукта.

JVM 1

  • От источника данных
  • К CEP Engine 1
  • В очередь сообщений

JVM 2 (также может принимать MQ Broker)

  • Из очереди сообщений
  • К CEP Engine 2
  • Направление

Обновить:

Если производитель и потребитель могут быть потоками в одной JVM, то проблема может быть у потребителя. Я не вижу, где потребитель делает что-либо с событием от производителя. Попробуйте что-то вроде этого (ссылка esper предоставляется производителю/потребителю, а потребитель перерабатывается с помощью метода обновления для обработки результатов оператора select).

Тест-драйв:

public Driver() {
    String aType = espertest.dummy.A.class.getName();
    Configuration cepConfig = new Configuration();
    cepConfig.addEventType("A",aType);
    EPServiceProvider epService = EPServiceProviderManager.getProvider("DummyProvider", cepConfig);
    Consumer c = new Consumer(epService);
    Producer p = new Producer(epService);
}

Режиссер:

public Producer(EPServiceProvider epsp) {
    Object o = new A();
    epsp.getEPRuntime().sendEvent(o);
}

Потребитель:

public Consumer(EPServiceProvider epsp) {
    EPStatement statement = epsp.getEPAdministrator().createEPL(input);
    statement.setSubscriber(this);
}
public void update(A event) {
    System.out.println("Consumer received event!");    
}
  • 0
    Вы имеете в виду, что я не могу позволить двум процессам общаться с одним и тем же экземпляром Esper?
  • 0
    Два потока в одной JVM будут иметь доступ к экземпляру esper в этой JVM. В своем вопросе вы указываете процессы, которые для меня подразумевают наличие двух процессов jvm (которые могут быть или не быть на одном хосте). Я не думаю, что бесплатная версия esper имеет встроенную поддержку для передачи данных между jvms, но есть и другие способы сделать это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню