Альтернатива setSubscriber в Эспере

Я пытаюсь прикрепить подписчика к событию в 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?


person jocund    schedule 26.12.2017    source источник


Ответы (1)


Назначение подписчика выполняется приложением, а не движком. Код приложения должен будет пройти через операторы, получить аннотации «stmt.getAnnotations», проверить их и назначить подписчика.

person user650839    schedule 26.12.2017
comment
Хорошо, это имеет смысл, но я все еще в замешательстве. До сих пор я видел только одну аннотацию подписчика для каждого приложения, но несколько разных классов подписчика. Означает ли это, что я должен написать логику того, какой оператор получает какой подписчик, зацикливая их? Или я должен иметь аннотацию для каждого класса Subscriber (которую я никогда не видел ни в одной кодовой базе, которую я просматривал до сих пор)? По сути, моя идея иметь EPL в файле состоит в том, чтобы автоматизировать их развертывание, а также назначение подписчиков/слушателей. - person jocund; 28.12.2017
comment
Вы указали мне правильное направление, и я заработал, используя этот пример: javatips.net/api/cointrader-master/src/main/java/org/ Пожалуйста, если у вас есть какие-либо другие предложения, дайте мне знать - person jocund; 28.12.2017