Я пытаюсь, чтобы несколько 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 в качестве теста, и это работает отлично. Слушатель называется так, как ожидалось. Вышеприведенный код - это всего лишь выдержка.
Вам необходимо настроить промежуточное программное обеспечение (очередь сообщений, распределенный кэш, сетевую файловую систему, соединение с разъемами и т.д.), Чтобы получить события от JVM производителя до потребительской JVM. Если вы можете развернуть производителя и потребителя в контейнере, поддерживающем Apache Camel (например, ServiceMix), тогда должно быть тривиально стоять прототип, который использует ActiveMQ для транспортировки ваших объектов в Esper, поскольку Camel поддерживает оба продукта.
JVM 1
JVM 2 (также может принимать MQ Broker)
Обновить:
Если производитель и потребитель могут быть потоками в одной 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!");
}