Java 如何在Actor';什么是onReceive方法?
我有一个Play framework 2应用程序,它也使用Akka。我有一个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(
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());
未来