- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Java Play 框架。我正在使用网络套接字进行客户端服务器交互。在服务器端,我们有响应客户端请求的又名参与者。我面临的问题:我想,当客户端打开与服务器上的 Hakka actor 的 web 套接字连接时,它实际上为该 actor 打开一个池,然后我需要跟踪该实例的 actor 客户端路径,以便每当其他操作发生时放置在其他某个类中,该类通知此参与者(使用被跟踪的实例路径)操作已发生,然后此参与者通知用户(客户端)此操作已发生。我实际上正在使用
String ClientPushActorPath = akka.serialization.Serialization.serializedActorPath(self());
以上是为了获取客户端用户实例的路径。但是下次当我尝试使用这条路径攻击这个 Actor 时,我找不到这个 Actor 。我试图从另一个 Actor 那里攻击 Actor 的方式是:
PushCacheManager cache = PushCacheManager.getInstance();
cache.load(qiid);
String ActorPath = cache.get("ClientPushActorPath");
ActorSelection ClientPushActor = system.actorSelection(ActorPath);
ClientPushActor.tell(m4, getSelf());
所以上面的代码简单地说,首先我去从缓存中获取 scots 路径(它被缓存在内存中以备将来使用)然后我尝试将该路径传递给 Actor 选择。一旦我获得了 Actor 的对象选择我用它来告诉其他 Actor 我需要传递的消息是 m4。请纠正我哪里出错了。我无法看到使用此路径的 Actor 。我觉得,我跟踪路径的方式是错误的。请纠正我。比
最佳答案
请耐心等待,这需要一些时间来完成,但它应该让您知道该怎么做。注意:我假设您仍在使用 Play 2.4.x 并且尚未更新到 Play 2.5.x。并且您使用 Java(尽管如果您能够切换,我会推荐 Akka Scala API)。
在你的 Controller 中你会这样写:
public static WebSocket<String> socket() {
return WebSocket.withActor(MyWebSocketActor::props);
}
这意味着每个 WebSocket 连接都将由 MyWebSocketActor
类型的 actor 实例处理。然后,您将必须像这样实现 Actor :
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("I received your message: " + message, self());
}
}
}
您看到的 ActorRef out
参数实际上是底层 actor(从 Play 生成)。你不需要对它做任何事情,只要记住一旦你向这个 out
actor 发送了一些东西,他就会将它处理给客户端。
您还必须在 routes
文件中定义正确的路由:
GET/ws controllers.Application.socket()
一般来说,您有两种选择——要么“查找”上面创建的参与者,要么提供某种机制来管理它们(某种注册表)
第 2.1 步:查找 WebSocket 参与者
这里的优点是您不需要额外的注册表/管理器或类似的东西。缺点是很难知道哪个 actor 服务于哪个 WebSocket 连接。
为此您可以使用 actorSelection
:
system.actorSelection("system/websockets/*/handler");
这是可行的,因为正如我之前提到的,Play 生成了连接处理程序 actors - 所以它们的地址是这样的:akka://application/system/websockets/42/handler
。同样,通过这种方式您可以获得所有 Actor ,但无法获得单个 Actor (因为您不知道他们的处理程序编号)。
第 2b 步:管理 WebSocket 参与者这里的优点是您可以完全管理 Actor 并为他们分配各种信息。缺点是你多了一个 Actor 要照顾(虽然不是什么大问题,Akka 很擅长这个)
你会像这样创建一个新的 Actor :
public class ManagerActor extends UntypedActor {
List<ActorRef> slaves;
public MyWebSocketActor() {
this.slaves = new ArrayList<>();
}
public void onReceive(Object message) throws Exception {
if (message instanceof RegisterMe) {
// a new WebSocket was created so we can register him
slaves.add(sender());
// also register a DeathWatch so that we know when the WebSocket actor dies
context.watch(sender());
} else if (message instanceof Terminated) {
// remove from the list
...
}
}
}
现在,还记得上面的 WebSocket actor 吗?他应该以某种方式向经理注册。同样,您可以通过两种方式执行此操作:您可以使用 context.system.actorSelection("user/manager")
“查找”Manager,或者如果您已经有引用( ActorRef
) 到管理器,您可以在创建 WebSocket actor 时将其作为构造函数参数提供
您可以使用每个 Actor 都可以使用的 preStart
方法进行注册:
public class MyWebSocketActor extends UntypedActor {
....
@Override
public void preStart() throws Exception {
context().system().actorSelection("user/manager").tell(RegisterMe, self());
super.preStart();
}
}
现在您已经拥有由 ... 管理器管理的所有 WebSocket actor,您可以定义他可以处理的新消息并告诉他必须将 m4
转发给客户端。请注意,您可以在管理器中使用类似 Map
的东西 - 其中 ActorRef
是键,值是一些用户特定的属性或您想要的任何内容。
关于java - 该实例的 Akka Actor 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36312970/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!