Я пытаюсь прикрепить подписчика к событию в Esper, но я хотел бы использовать для этого файл .epl. Я просматривал репозитории и видел примеры того, как это делается с помощью интерфейсов аннотаций. Я пытался сделать это так же, как в CoinTrader, но у меня не получается. Тем не менее, если я устанавливаю подписчика на Java, он работает.
Это структура моего проекта для справки
Это мой файл .epl:
module queries;
import events.*;
import configDemo.*;
import annotations.*;
create schema MyTickEvent as TickEvent;
@Name('allEvents')
@Description('test')
@Subscriber(className='configDemo.TickSubscriber')
select * from TickEvent;
@Name('tickEvent')
@Description('Get a tick event every 3 seconds')
select currentPrice from TickEvent;
Это мой файл конфигурации:
<?xml version="1.0" encoding="UTF-8"?>
<esper-configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.espertech.com/schema/esper"
xsi:noNamespaceSchemaLocation="esper-configuration-6-0.xsd">
<event-type-auto-name package-name="events"/>
<auto-import import-name="annotations.*"/>
<auto-import import-name="events.*"/>
<auto-import import-name="configDemo.*"/>
This is my Subscriber interface:
package annotations;
public @interface Subscriber {
String className();
}
Это мой класс событий:
package configDemo;
import events.TickEvent;
public class TickSubscriber {
public void update(TickEvent tick) {
System.out.println("Event registered by subscriber - Tick is: " +
tick.getCurrentPrice());
}
}
И мой основной файл таков:
package configDemo;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.deploy.DeploymentException;
import com.espertech.esper.client.deploy.DeploymentOptions;
import com.espertech.esper.client.deploy.Module;
import com.espertech.esper.client.deploy.ParseException;
public class Main {
public static EngineHelper engineHelper;
public static Thread engineThread;
public static boolean continuousSimulation = true;
public static void main(String[] args) throws DeploymentException, InterruptedException, IOException, ParseException {
engineHelper = new EngineHelper();
DeploymentOptions options = new DeploymentOptions();
options.setIsolatedServiceProvider("validation"); // we isolate any statements
options.setValidateOnly(true); // validate leaving no started statements
options.setFailFast(false); // do not fail on first error
Module queries = engineHelper.getDeployAdmin().read("queries.epl");
engineHelper.getDeployAdmin().deploy(queries, null);
CountDownLatch latch = new CountDownLatch(1);
EPStatement epl = engineHelper.getAdmin().getStatement("allEvents");
//epl.setSubscriber(new TickSubscriber());
engineThread = new Thread(new EngineThread(latch, continuousSimulation, engineHelper.getRuntime()));
engineThread.start();
}
}
Как видите, строка setSubscriber закомментирована. Когда я запускаю его как есть, я ожидал, что подписчик будет распознан и зарегистрирован, но это не так. Я получаю только события тиков, протекающие в консоли. Если я раскомментирую строку и запущу ее, мне после каждого тика приходит уведомление о том, что подписчик получил событие и все работает нормально.
Что я делаю не так? Как установить подписчика в файле .epl?