Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Actor';什么是onReceive方法?_Java_Playframework_Akka_Ebean - Fatal编程技术网

Java 如何在Actor';什么是onReceive方法?

Java 如何在Actor';什么是onReceive方法?,java,playframework,akka,ebean,Java,Playframework,Akka,Ebean,我有一个Play framework 2应用程序,它也使用Akka。我有一个Actor从远程系统接收消息,这类消息的数量可能非常巨大。收到消息后,我将其登录到数据库(使用内置的Ebean ORM),然后继续处理它。我不在乎这个数据库日志的工作速度有多快,但它绝对不应该阻止进一步的处理。下面是一个简化的代码示例: public class MessageReceiver extends UntypedActor { @Override public void onReceive(

我有一个Play framework 2应用程序,它也使用Akka。我有一个
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
。我知道将大量消息逐个写入数据库是没有效率的,但这不是目前的问题


这个实现被阻塞了,我说得对吗?如果是,如何使其异步运行?

未来的解决方案对我来说似乎不错。我没有使用Java中的Futures,但是如果您确实需要一些返回值,您可以返回任意整数或字符串

另一个选项是将该消息发送给另一个参与者,该参与者将保存到数据库中。然后你应该确保那个演员的邮箱不会塞满


你考虑过这个吗?也许这会适合您的用例。

我认为未来的解决方案很好。我没有使用Java中的Futures,但是如果您确实需要一些返回值,您可以返回任意整数或字符串

另一个选项是将该消息发送给另一个参与者,该参与者将保存到数据库中。然后你应该确保那个演员的邮箱不会塞满


你考虑过这个吗?也许这会适合您的用例。

我认为未来的解决方案很好。我没有使用Java中的Futures,但是如果您确实需要一些返回值,您可以返回任意整数或字符串

另一个选项是将该消息发送给另一个参与者,该参与者将保存到数据库中。然后你应该确保那个演员的邮箱不会塞满


你考虑过这个吗?也许这会适合您的用例。

我认为未来的解决方案很好。我没有使用Java中的Futures,但是如果您确实需要一些返回值,您可以返回任意整数或字符串

另一个选项是将该消息发送给另一个参与者,该参与者将保存到数据库中。然后你应该确保那个演员的邮箱不会塞满


你考虑过这个吗?也许这会适合您的用例。

使用Martin Krassers akka持久性扩展持久化参与者状态和我的jdbc持久性提供程序akka持久化jdbc

使用Martin Krassers akka持久性扩展持久化参与者状态和使用Martin Krassers持久化jdbc持久化参与者状态akka持久性扩展和我的jdbc持久性提供程序akka持久性jdbc

如果您希望使用Future,请使用Martin Krassers akka持久性扩展和我的jdbc持久性提供程序akka持久性jdbc构建一个具有可调用(匿名类)的akka Future,其apply()将实际实现db save代码。实际上,您可以将所有这些(将来的创建和应用())放在ServerMessageModel类中——可以称之为asynchSave()。您的未来可能是asynchSave的结果状态的未来

public Future<Status> asyncSave(...) { /* should the params be ServerMessageModel? */
  return future(new Callable<Status>() {
     public Status call() {
        /* do db work here */
     }
 }
public Future asyncSave(…){/*参数应该是ServerMessageModel吗*/
返回未来(新的可调用(){
公共状态呼叫(){
/*db在这里工作吗*/
}
}
在onReceive中,您可以继续向其他参与者讲述。注意:如果您想确保在该future返回后向其他参与者发出讲述,则可以使用future的onSuccess

Future<Status> f = serverMessageModel.asyncSave();
f.onSuccess(otherActor.tell(serverMessage, self());
Future f=serverMessageModel.asyncSave();
f、 onSuccess(otherActor.tell(serverMessage,self());
您还可以执行故障处理…有关更多详细信息,请参阅


希望这会有所帮助。

如果您希望使用Future,请使用可调用(匿名类)构造一个Akka Future,其apply()将实际实现db save代码。您可以将所有这些(Future creation and apply())放在您的ServerMessageModel类中——可能称之为asynchSave().您的未来可能是状态为asynchSave结果的未来

public Future<Status> asyncSave(...) { /* should the params be ServerMessageModel? */
  return future(new Callable<Status>() {
     public Status call() {
        /* do db work here */
     }
 }
public Future asyncSave(…){/*参数应该是ServerMessageModel吗*/
返回未来(新的可调用(){
公共状态呼叫(){
/*db在这里工作吗*/
}
}
在onReceive中,您可以继续向其他参与者讲述。注意:如果您想确保在该future返回后向其他参与者发出讲述,则可以使用future的onSuccess

Future<Status> f = serverMessageModel.asyncSave();
f.onSuccess(otherActor.tell(serverMessage, self());
Future f=serverMessageModel.asyncSave();
f、 onSuccess(otherActor.tell(serverMessage,self());
您还可以执行故障处理…有关更多详细信息,请参阅


希望这会有所帮助。

如果您希望使用Future,请使用可调用(匿名类)构造一个Akka Future,其apply()将实际实现db save代码。您可以将所有这些(Future creation and apply())放在您的ServerMessageModel类中——可能称之为asynchSave().您的未来可能是状态为asynchSave结果的未来

public Future<Status> asyncSave(...) { /* should the params be ServerMessageModel? */
  return future(new Callable<Status>() {
     public Status call() {
        /* do db work here */
     }
 }
public Future asyncSave(…){/*参数应该是ServerMessageModel吗*/
返回未来(新的可调用(){
公共状态呼叫(){
/*db在这里工作吗*/
}
}
在onReceive中,您可以继续向其他参与者讲述。注意:如果您想确保在该future返回后向其他参与者发出讲述,则可以使用future的onSuccess

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