2017-03-18 25 views
-1

Akka에 익숙하지 않습니다. Akka Actor에 이벤트 메시지를 보내거나 보내려고하는데 트리거하는 3 개의 이벤트 메시지가 있습니다. 트리거되고 있습니다.Akka 이벤트 메시지가 디스패치되지 않거나 다른 이벤트를 트리거합니다. 항상 다른 이벤트가 전달되지 않는 첫 번째 이벤트가 발생 함

원인 : receive(receiveEvent);이 메서드는 내 EventProcessActor 생성자를 호출합니다.

하지만 그 후에도 우리는 다른 이벤트를 호출하고 있지만 다른 이벤트를 전달하지 않는 이유를 여기에서 놓치고 있습니다.

난 항상 콘솔에 출력 아래에 무엇입니까 :

[INFO] [03/18/2017 13:35:53.446]... We received the Events need to process it 

내 예상 출력은 다음과 같습니다

[INFO] [03/18/2017 13:35:53.446] ... We received the Events need to process it 

[INFO] [03/18/2017 13:35:53.447]... We are processing Events 

[INFO] [03/18/2017 13:35:53.446]... Completed Events processing 

는 콘솔 출력보다도 내가 ...

으로 [default-akka.actor.default-dispatcher-4] [akka://default/user/EventProcessing]을 제거한 I 트리거링 이벤트 나처럼 아래처럼 :

procsssEvents.tell(new EventProcessActor.EventActivity(Events.STSRT, Paths.get("/")), procsssEvents); 
procsssEvents.tell(new EventProcessActor.EventActivity(Events.READING_LINE, Paths.get("/")), procsssEvents); 
procsssEvents.tell(new ventProcessActor.EventActivity(Events.END_OR,Paths.get("/")), procsssEvents); 

다음은 내 Acotr 클래스와 Message 클래스 및 pom.xml 파일입니다.

AkkaActor :

package com.ebc.biz.akka.event.trigger; 

import java.io.IOException; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

import scala.PartialFunction; 
import scala.runtime.BoxedUnit; 

import akka.actor.AbstractLoggingActor; 
import akka.actor.ActorRef; 
import akka.actor.ActorSystem; 
import akka.actor.ActorSystemImpl; 
import akka.actor.Props; 
import akka.japi.pf.ReceiveBuilder; 

import static com.ebc.biz.akka.event.trigger.EventMessage.Events; 

public class EventProcessActor extends AbstractLoggingActor { 

    public static class EventActivity { 
     final EventMessage startOfEventMessage; 

     public EventMessage getStartOfEventMessage() { 
      return startOfEventMessage; 
     } 

     public EventActivity(Events events, Path eventPath) { 
      startOfEventMessage = new EventMessage(events, eventPath); 
     } 

    } 

    public static class EventReadingActivity { 

     final EventMessage startOfReadingMessage; 

     public EventMessage getStartOfReadingMessage() { 
      return startOfReadingMessage; 
     } 

     public EventReadingActivity(Events events, Path eventPath) { 
      startOfReadingMessage = new EventMessage(events, eventPath); 

     } 

    } 

    public static class EndOfEventActivity { 

     final EventMessage endOfEventMessage; 

     public EventMessage getEndOfEventMessage() { 
      return endOfEventMessage; 
     } 

     public EndOfEventActivity(Events events, Path eventPath) { 
      endOfEventMessage = new EventMessage(Events.END_OR, eventPath); 

     } 
    } 

    private final PartialFunction<Object, BoxedUnit> receiveEvent; 

    private final PartialFunction<Object, BoxedUnit> startEventsProcessing; 

    private final PartialFunction<Object, BoxedUnit> completeEventProcessing; 

    public EventProcessActor() { 

     receiveEvent = ReceiveBuilder 
       .match(EventActivity.class, this::onStartEventReceive) 
       .match(EventReadingActivity.class, this::readEventLine).build(); 

     startEventsProcessing = ReceiveBuilder 
       .match(EventReadingActivity.class, this::readEventLine) 
       .match(EndOfEventActivity.class, this::onEndOfEventProcessing) 
       .build(); 

     completeEventProcessing = ReceiveBuilder.match(
       EndOfEventActivity.class, this::onEndOfEventProcessing).build(); 

     receive(receiveEvent); 
    } 

    public static Props props() { 

     return Props.create(EventProcessActor.class); 
    } 

    public void onStartEventReceive(EventActivity fileActivity) { 
     log().info("We received the Events need to process it"); 
     getContext().become(startEventsProcessing); 
    } 

    public void readEventLine(EventReadingActivity fileActivity) { 
     log().info("We are processing Events"); 
     getContext().become(completeEventProcessing); 

    } 

    public void onEndOfEventProcessing(EndOfEventActivity fileActivity) { 
     log().info("Completed Events processing"); 

    } 

    public static void main(String args[]) throws IOException { 

     ActorSystem syste = ActorSystemImpl.create(); 
     final ActorRef procsssEvents = syste.actorOf(EventProcessActor.props(), 
       "Event" + "Processing"); 

     procsssEvents.tell(new EventProcessActor.EventActivity(Events.STSRT, 
       Paths.get("/")), procsssEvents); 
     procsssEvents.tell(new EventProcessActor.EventActivity(
       Events.READING_LINE, Paths.get("/")), procsssEvents); 
     procsssEvents.tell(new EventProcessActor.EventActivity(Events.END_OR, 
       Paths.get("/")), procsssEvents); 

     System.out.println("Enter to terminate"); 
     System.in.read(); 

    } 

} 

EventMessage

package com.ebc.biz.akka.event.trigger; 

import java.nio.file.Path; 

public class EventMessage { 

    public static enum Events { 

     STSRT, READING_LINE, END_OR; 

    } 

    private final Events readEvents; 
    private final Path pathOfEvents; 

    public Path getPathOfEvents() { 
     return pathOfEvents; 
    } 

    public Events getReadEvents() { 
     return readEvents; 
    } 

    public EventMessage(Events readEvents, Path pathOfFile) { 
     this.readEvents = readEvents; 
     this.pathOfEvents = pathOfFile; 
    } 

} 

의 pom.xml

<groupId>com.ebc.biz</groupId> 
    <artifactId>akka.event.trigger</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <properties> 
     <akka.version>2.4.9</akka.version> 
     <maven-dependency-plugin.version>3.0.0</maven-dependency-plugin.version> 
     <maven.compiler.plugin>3.6.1</maven.compiler.plugin> 
     <java.compiler.target>1.8</java.compiler.target> 
     <java.compiler.source>1.8</java.compiler.source> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-actor_2.11</artifactId> 
      <version>${akka.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-http-core_2.11</artifactId> 
      <version>${akka.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-http-experimental_2.11</artifactId> 
      <version>${akka.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-http-jackson-experimental_2.11</artifactId> 
      <version>${akka.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>${maven-dependency-plugin.version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <!-- This will download source so easy to see API and java doc. --> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>attach-sources</id> 
         <phase>verify</phase> 
         <goals> 
          <goal>jar</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <!-- Java 8 compiler plugin --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>${maven.compiler.plugin}</version> 
       <configuration> 
        <source>${java.compiler.source}</source> 
        <target>${java.compiler.target}</target> 
       </configuration> 
      </plugin> 

     </plugins> 
    </build> 
</project> 

내 메시지가없는 이유 g 하나씩 다른 사람을 파견한다. 나는 뭔가를 놓친 것 같아.

모든 종류의 정보와 도움을 미리 감사드립니다.

답변

1

편집 : 문제는 - 배우가 디자인에 따라 다른 유형을 기대하면서 EventActivity을 보내는, 그래서 당신은 업데이트해야합니다 귀하의 main :

procsssEvents.tell(new EventProcessActor.EventActivity(Events.STSRT, Paths.get("/")), procsssEvents); 
    procsssEvents.tell(new EventProcessActor.EventReadingActivity(Events.READING_LINE, Paths.get("/")), procsssEvents); 
    procsssEvents.tell(new EventProcessActor.EndOfEventActivity(Events.END_OR, Paths.get("/")), procsssEvents); 
+0

내가 (receiveEvent)를 수신 호출하고 있지 않다 경우; EventProcessActor 생성자에서 예외가 발생하고 main 메서드에서 보내는 것보다 모든 메시지가 "죽은 문자가 발생했습니다"라는 오류가 발생합니다. "receive (receiveEvent);"라고하기 때문에 첫 번째 메시지 만 해고됩니다. 그것은 첫 번째 사건이다. 첫 번째 이벤트 만 기록 또는 시작되는 것과 동일한 문제가 발생하여 "호출 호출"의 각 행을 호출하기 전에 스레드 잠자기를 시도했습니다. 각 호출 전에 Thread.sleep (2000)을 넣으려고했다. –

+1

맞습니다. 문제는 다른 곳에서 발생했습니다. 답변을 업데이트했습니다. – MirMasej