热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java该实例的AkkaActor路径

我正在使用JavaPlayFramework.我正在使用Web套接字进行客户端服务器交互.在服务器端,我们又有参与者来响应客户的请求.我面临的问题:我想要,当客户端打开与服务器上的

我正在使用Java Play Framework.
我正在使用Web套接字进行客户端服务器交互.
在服务器端,我们又有参与者来响应客户的请求.
我面临的问题:
我想要,当客户端打开与服务器上的客家演员的Web套接字连接时,实际上为该演员打开了一个池,然后我需要跟踪该实例的演员客户端路径,以便每当采取其他措施时如果放置在其他某个类中,则该类(使用跟踪的实例路径)通知此参与者已发生该操作,然后该参与者通知用户(客户端)该操作已发生.
我实际上正在使用

String ClientPushActorPath = akka.serialization.Serialization.serializedActorPath(self());

以上保留获取该客户端用户实例的路径.
但是下一次当我尝试使用此路径击中该演员时,我找不到该演员.
我试图从另一个演员中打那个演员的方式是:

PushCacheManager cache = PushCacheManager.getInstance();
cache.load(qiid);
String ActorPath = cache.get("ClientPushActorPath");
ActorSelection ClientPushActor = system.actorSelection(ActorPath);
ClientPushActor.tell(m4, getSelf());

所以上面的代码简单地说,首先我从缓存中获取苏格兰路径(它已缓存在内存中以备将来使用),然后我尝试将该路径传递给演员选择.一旦我获得了对象用于演员选择,我就使用告诉其他演员我需要传递的消息是m4.
请纠正我我要去哪里.
我看不到演员使用此路径.
我觉得,我追踪路径的方式是错误的.
请纠正我.

解决方法:

请耐心等待,这将需要一些时间,但是应该可以使您对如何做有一个很好的了解.注意:我假设您仍在使用Play 2.4.x并且尚未更新为Play2.5.x.另外,您也使用Java(尽管如果可以切换,我建议使用Akka Scala API).

步骤1:定义正在处理WebSocket连接的actor

在您的控制器中,您可以这样编写:

public static WebSocket 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生成).您无需对此做任何事情,只需记住,一旦您向该演员发送了一些东西,他便会处理给客户.

您还必须在路由文件中定义适当的路由:

GET / ws controllers.Application.socket()

步骤2:定义如何管理所有WebSocket参与者

通常,您有两个选择-您可以“查找”上面创建的参与者,也可以提供某种机制来管理它们(类注册表)

>步骤2.1:查找WebSocket参与者

这样做的好处是您不需要额外的注册表/管理器或类似内容.缺点是,实际上很难知道哪个角色为哪个WebSocket连接服务.

您将为此使用actorSelection:

system.actorSelection(“ system / websockets / * / handler”);

之所以起作用,是因为正如我之前提到的,Play生成了连接处理程序参与者,因此它们的地址如下:akka:// application / system / websockets / 42 / handler.同样,通过这种方式,您可以获取所有演员,但不能获得单个演员(因为您不知道其处理者编号).
>步骤2b:管理WebSocket参与者
这样做的好处是,您可以完全管理参与者,并为他们分配各种信息.缺点是您还要多一位演员来照顾(尽管这并不是真正的问题,但Akka在这方面做得很好)

您将创建一个新的演员,例如:

public class ManagerActor extends UntypedActor {
List 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
...
}
}
}

步骤3:放在一起

现在,还记得上面的WebSocket actor吗?他应该以某种方式向经理注册.同样,您可以通过两种方式执行此操作:您可以使用context.system.actorSelection(“ user / manager”)“查找” Manager,或者如果已经具有对Manager的引用(ActorRef),则可以提供它创建WebSocket actor时作为构造函数参数

您可以使用每个演员都可以使用的preStart方法并进行注册:

public class MyWebSocketActor extends UntypedActor {
....
@Override
public void preStart() throws Exception {
context().system().actorSelection("user/manager").tell(RegisterMe, self());
super.preStart();
}
}

现在,您已经由…管理器管理了所有WebSocket角色,您可以定义新消息,他可以处理该消息,并告诉他必须将m4转发给客户端.请注意,您可以在Manager中使用诸如Map之类的东西-其中ActorRef是键,而值是某些用户特定的属性或您想要的任何属性.


推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
咖喱2502894907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有