【发布时间】:2014-09-28 06:08:58
【问题描述】:
我正在尝试设置 Akka 演员来处理网络套接字。
我已经定义了一个简单的actor来通过网络套接字发送消息:
package actors;
import akka.actor.*;
public class MyWebSocketActor extends UntypedActor {
public static Props props(ActorRef out) {
return Props.create(MyWebSocketActor.class, out);
}
private final ActorRef out;
public MyWebSocketActor(ActorRef out ) {
this.out = out;
}
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
out.tell(message, self());
}
}
}
在应用程序控制器中,我有网络套接字:
package controllers;
import play.*;
import play.mvc.*;
import akka.util.*;
import views.html.*;
import actors.MyWebSocketActor;
import play.libs.F.*;
public class Application extends Controller {
public static Result index() {
return ok(index.render("Your new application is ready."));
}
public static WebSocket<String> socket() {
return WebSocket.withActor(MyWebSocketActor::props);
}
}
到目前为止,一切都按我的预期进行。现在,在控制器中,我试图将消息传递给那个演员。我试过了:
public class Messages extends Controller {
private static final Form<Message> messageForm = Form.form(Message.class);
@BodyParser.Of(BodyParser.Json.class)
public static Result list(Integer page) {
// --- Render
ActorRef myActor = Akka.system().actorOf(Props.create(MyWebSocketActor.class));
String message = "test";
myActor.tell(message, ActorRef.noSender());
//
}
但是出现了错误:“无法调用操作,最终出现错误:java.lang.IllegalArgumentException: no matching constructor found on class actor.MyWebSocketActor for arguments[]。
2014-08-05 05:50:23,503 - [INFO] - from play in pool-4-thread-4
Listening for HTTP on /0:0:0:0:0:0:0:0:9000
2014-08-05 05:51:02,887 - [ERROR] - from application in New I/O worker #1
! @6j5b25956 - Internal server error, for (GET) [/] ->
play.PlayExceptions$CompilationException: Compilation error[error: method tell in class ActorRef cannot be applied to given types;]
at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.1.jar:na]
at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:297) ~[na:na]
at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:292) ~[na:na]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.1.jar:na]
at play.PlayReloader$$anon$1.play$PlayReloader$$anon$$taskFailureHandler(PlayReloader.scala:292) ~[na:na]
at play.PlayReloader$$anon$1$$anonfun$reload$2.apply(PlayReloader.scala:325) ~[na:na]
at play.PlayReloader$$anon$1$$anonfun$reload$2.apply(PlayReloader.scala:325) ~[na:na]
at scala.util.Either$LeftProjection.map(Either.scala:377) ~[scala-library-2.11.1.jar:na]
at play.PlayReloader$$anon$1.reload(PlayReloader.scala:325) ~[na:na]
at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:107) ~[play_2.11-2.3.1.jar:2.3.1]
at play.core.ReloadableApplication$$anonfun$get$1.apply(ApplicationProvider.scala:105) ~[play_2.11-2.3.1.jar:2.3.1]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1361) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library-2.11.1.jar:na]
2014-08-05 05:51:03,084 - [WARN] - from play in New I/O worker #1
No application found at invoker init
2014-08-05 06:08:03,586 - [ERROR] - from application in New I/O worker #2
【问题讨论】:
标签: java sockets akka playframework-2.3