Actor의 Onreceive 메소드에서 비동기 데이터베이스 삽입을 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/25014416

문제

AKKA를 사용하는 Play 프레임 워크 2 응용 프로그램이 있습니다. 원격 시스템에서 메시지를 수신하는 Actor가 있으며, 이러한 메시지의 양은 매우 거대 할 수 있습니다. 메시지가 수신 된 후에는 데이터베이스에 (기본 제공 EBEAN ORM 사용)을 기록한 다음 계속 처리합니다. 나는이 데이터베이스 로깅이 얼마나 빠르지 않아도 상관하지 않지만 더 많은 처리를 차단해서는 안됩니다. 여기에 단순화 된 코드 샘플이 있습니다.

public class MessageReceiver extends UntypedActor {

    @Override
    public void onReceive(Object message) throws Exception {
        if (message instanceof ServerMessage) {
            ServerMessage serverMessage = (ServerMessage) message;
            ServerMessageModel serverMessageModel = new ServerMessageModel(serverMessage);
            serverMessageModel.save();
            //now send the message to another actor for further processing
        } else {
            unhandled(message);
        }
    }
}
.

이해할 때, 데이터베이스 삽입 이이 실현에서 차단되고 있으므로 내 필요를 충족시키지 못합니다. 그러나 나는 그것을 차단 해제하는 방법을 알아낼 수 없다. Future 클래스에 대해 읽었지만 일부 값을 반환해야하므로 serverMessageModel.save();void를 반환하므로 데이터베이스에 많은 메시지를 작성하는 것이 효율적이지 않는다는 것을 이해합니다. 그러나 그것은 그 순간 문제가 아닙니다.

이 구현이 차단되고 있음이 맞습니까? 그렇다면 어떻게 비동기 적으로 실행할 수 있습니까?

도움이 되었습니까?

해결책

미래를 사용하고자하는 경우 - Apply ()가 실제로 DB 저장 코드를 구현할 호출 가능한 (익명 클래스)로 AKKA 미래를 구성합니다.ServerMessageModel 클래스에 실제로이 모든 (미래의 작성 및 적용 ())을 넣을 수 있습니다. - AsynchSave ()를 호출 할 수도 있습니다.미래가 아마도 현재 상태가 비동기의 결과입니다 ...

public Future<Status> asyncSave(...) { /* should the params be ServerMessageModel? */
  return future(new Callable<Status>() {
     public Status call() {
        /* do db work here */
     }
 }
.

귀하의 상상부에서 귀하는 다른 배우에게 말할 수 있습니다.참고 :이 미래의 반환 후 다른 액터에게 알리고 있는지 확인하려면 미래의 Onsuccess를 사용할 수 있습니다.

Future<Status> f = serverMessageModel.asyncSave();
f.onSuccess(otherActor.tell(serverMessage, self());
.

실패 처리 할 수도 있습니다 ... http ://doc.akka.io/docs/akka/2.3.4/java/futures.html 자세한 내용을 보려면.

도움이되기를 바랍니다.

다른 팁

미래의 해결책은 나에게 좋게 보입니다.Java에서 선물을 사용하지 않았지만 반환 값이 필요하면 임의의 정수 또는 문자열을 반환 할 수 있습니다.

기타 옵션은 DB에 저장을 수행하는 다른 액터 에게이 메시지를 보내는 것입니다.그런 다음 해당 액터의 사서함이 과도하게 보관하지 않도록해야합니다.

Akka-persistence ~을 빼앗아가는 것어쩌면 당신의 유스 케이스에 맞는 것입니다.

Martin Krassers Akka-Persistence 확장 및 My JDBC 지속성 제공 업체 Akka 지속성 JDBC https ://github.com/dnvriend/akka-persistence-jdbc

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top