2016-11-22 88 views
0

我实现似鲭水狼牙鱼服务器上的集群3个节点(A,B & C)作为独立实例。 我使用HAproxy作为负载均衡器,一切正常。聚类的WebSockets泰鲁斯爪哇

我加入的WebSockets在我的项目和从HAProxy的HTTP自动切换到隧道模式时,客户机请求一个网页套接字。

我的问题是这样的:我 需要检索的WebSocket会话,无论连接的节点。例如: “我有3个用户连接到应用程序,用户1和用户2连接到节点A.用户3连接到节点B的是 。节点C上发生的事件要求用户1和3是通知,但我没有在节点C用户1和用户2会话。“

我试图在用户连接(的OnOpen方法)使用Hazelcast分布式列表来存储会话。但是当我在列表中调用“添加”方法时,由于Tyrus会话对象不是可序列化,所以会抛出HazelcastSerializationException。

我该如何解决我的问题?

感谢

+1

你有没有试过编写自己的自定义序列化方法? http://stackoverflow.com/a/7290812/212224 – Mike

+0

是的,我试过,但它不能很好地工作。我试图使用Hazelcast Executor服务,但它会导致com.hazelcast.nio.serialization.HazelcastSerializationExcept ion:java.lang.ClassNotFoundException:com.MyTask。 –

回答

1

我怀疑转移WebSocket会话会对你有所帮助,因为你需要通知他们所连接的节点的用户。

你可能想从节点C通知节点A和B,以更新连接到它们的用户。为此,您可以使用Hazelcast Topic向群集中的所有节点发送消息,并通过具有WebSocket会话编辑)的节点检索消息。您需要从节点C获取信息到其他有会话的节点,而不是相反。将会话传递到另一个节点将毫无用处,因为会话仅适用于打开的WebSocket连接。

(编辑)之前,我建议使用 Hazelcast executor service ,而不是主题,但会导致类加载器的问题。

+0

我尝试过使用Hazelcast执行器服务。我的任务实现了Runnable&Serializable,但是当我调用executorService.executeOnAllMembers(new MyTask(input))时,这会在其他节点上抛出com.hazelcast.nio.serialization.HazelcastSerializationException:java.lang.ClassNotFoundException:com.MyTask。只是,仅供参考,我以这种方式检索Hazelcast实例:Context ctx = new InitialContext(); HazelcastInstance instance =(HazelcastInstance)ctx.lookup(“payara/Hazelcast”); –

+0

的确如此 - 我没有意识到,由于类路径隔离,嵌入式Hazelcast实例无法访问部署应用程序中声明的类。尝试使用[Hazelcast Topic](https://hazelcast.com/use-cases/imdg/imdg-messaging/)广播消息并将听众放入应用程序中(我更新了我的回复) – OndrejM

+0

我使用了Hazelcast Topic和它似乎工作正常。谢谢你的支持。 –

1

请看看在StreamSerializer,如果你不想要做/不能任意序列的逻辑添加到您的类。

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#custom-serialization

如果你可以添加序列化逻辑,请看看在IdentifiedDataSerializable:

http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#identifieddataserializable

有在参考手册充分的例子。

您需要确保该对象真的可以序列化。一些对象应该永远不会被序列化。

+0

感谢您的支持,但我更愿意使用Hazelcast Topic在节点上共享消息,而不是序列化Session Object。这很复杂。 –