2017-12-26 24 views
0

저는 Esper의 이벤트에 가입자를 연결하려고하지만 그 대신 .epl 파일을 사용하고 싶습니다. 필자는 저장소를 탐색했으며 주석 인터페이스를 사용하여 이러한 작업을 수행하는 예를 보았습니다. 나는 그것을 CoinTrader에서하는 것과 같은 방식으로하려고했으나 작동시키지 못했습니다. 그러나 Java에서 구독자를 설정하면 작동합니다.Esper의 SetSubscriber에 대한 대안

:

<?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.*"/> 

이 내 가입자 인터페이스입니다 : 이것은 내 설정 파일입니다

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; 

:

This is my project structure for reference

내 .epl 파일입니다

이 내 이벤트 클래스입니다 :

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 파일 내에서 구독자를 어떻게 설정할 수 있습니까?

답변

0

구독자 지정은 응용 프로그램에서 수행하며 엔진이 수행하는 작업이 아닙니다. 응용 프로그램 코드는 명령문을 반복하여 "stmt.getAnnotations"주석을 가져 와서 검사하고 구독자를 지정해야합니다.

+0

그래, 그건 의미가 있지만 여전히 혼란 스럽다. 지금까지 애플리케이션 당 하나의 구독자 주석을 보았지만 아직 여러 개의 다양한 구독자 클래스를 보았습니다. 그것은 어떤 진술을 루핑하는 동안 어느 가입자가 어떤 논리를 쓰게되는지 논리를 작성해야한다는 것을 의미합니까? 또는 각 구독자 클래스에 대한 주석을 가져야합니까 (지금까지 탐색 한 코드베이스에서는 본 적이없는)? 기본적으로 EPL을 파일에 포함시키려는 나의 생각은 구독자/청취자 할당뿐만 아니라 배포를 자동화하는 것입니다. – jocund

+0

당신은 올바른 방향으로 나를 지적했다. 나는이 예제를 사용하여 작동시키고있다 : https://www.javatips.net/api/cointrader-master/src/main/java/org/cryptocoinpartners/module/Context.java 제발, 다른 의견이 있으면 알려주세요. – jocund