Pregunta

Tengo una Play framework 2 aplicación que utiliza también Akka.Tengo una Actor que recibe los mensajes desde un sistema remoto, el importe de dichos mensajes pueden ser muy grandes.Después de que un mensaje es recibido, me registro en la base de datos (utilizando el incorporado en Ebean ORM) y, a continuación, proseguir el trámite.No me importa lo rápido que esta base de datos de registro de obras, pero sin duda no deben bloquear el proceso.Aquí está una simplificado código de ejemplo:

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);
        }
    }
}

Como yo lo entiendo, la base de datos de inserción es el bloqueo en esta realización, por lo que no cumple con mis necesidades.Pero no puedo averiguar cómo hacer el desbloqueo.He leído acerca de las Future de la clase, pero no puedo conseguir que funcione, ya que se debe devolver algún valor, y serverMessageModel.save(); devuelve void.Entiendo que escribir un montón de mensajes uno por uno en la base de datos es unefficient, pero ese no es el problema en el momento.

Estoy en lo cierto de que esta aplicación está bloqueando?Si es así, ¿cómo puedo hacer que se ejecute de forma asincrónica?

¿Fue útil?

Solución

Si desea utilizar el Futuro la construcción de un Akka Futuro con Invocable (clase anónima), cuya aplicar() realmente aplicar el db guardar el código.En realidad se puede poner todo esto (el futuro de la creación y de aplicar()) en su ServerMessageModel de la clase, tal vez de llamar asynchSave().Su Futuro tal vez Futuro donde el estado es el resultado de asynchSave...

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

En su onReceive usted puede seguir adelante con decirle a otro actor.NOTA:si desea asegurarse de que usted está disparando el dígale a otro actor después de esto beneficios en el futuro, entonces usted podría utilizar en el Futuro del onSuccess.

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

También se puede hacer un control de errores...ver http://doc.akka.io/docs/akka/2.3.4/java/futures.html para obtener más detalles.

Espero que ayude.

Otros consejos

El futuro de la solución me parece bien.No he utilizado Futuros de Java, pero puede volver Entero arbitrario o Cadena si usted definitivamente necesidad de algunos de valor de retorno.

Otra opción es enviar ese mensaje a algún otro actor que iba a hacer la de guardar en la DB.Entonces usted debe asegurarse de que el buzón de que el actor no sobrellene.

Han considerado que la akka-persistencia para este?Tal vez que se adapte a su caso de uso.

Persisten actor estado con Martin Krassers akka-la persistencia de la extensión y de mi jdbc proveedor de persistencia akka persistencia de jdbc https://github.com/dnvriend/akka-persistence-jdbc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top