简短回答:使用消息选择器。
详细答案:这个问题没有提到对话是如何发起的。所以这是我对这两种情况的回答。
a)如果客户端发起对话(即客户端向服务器发送消息并等待回复)。
这是一个请求/回复场景。Messaging/JMS 是一个解耦的通信系统。但是请求/回复是 JMS 中的一种常见模式。它可以使用相关模式来实现。
- 唯一标识符(相关 ID)作为请求消息的一部分发送。
- 服务器接收到消息并在回复消息中设置关联 ID。
- 客户端使用消息选择器接收具有正确关联 ID 的消息。
b)如果服务器发起会话(即服务器在没有客户端请求的情况下向客户端发送消息)。
在这种情况下,可以使用类似的方法。
- 为每个客户端分配一个固定的客户端 ID。
- 服务器维护所有客户端ID,并将接收者的客户端ID设置为消息的关联ID。
- 客户端使用消息选择器接收相关 id 等于其客户端 id 的消息。
关于保密的更新。
从此链接中提取的以下信息有助于您了解JMS 安全性。
JMS 没有指定用于控制消息机密性和完整性的安全契约或 API。安全性被认为是特定于 JMS 提供程序的特性。它由系统管理员控制,而不是以编程方式或由 J2EE 服务器运行时实现。
JMS 安全性的两个主要特性是身份验证和授权。据我所知,客户端访问的 JMS 安全性侧重于保护 JMS 目标(而不是单个消息)。只要客户端可以访问目的地,分配给客户端的安全角色就适用于属于该目的地的所有消息。
基于此,
解决方案1:如果客户端代码由受信任方控制。
在我的原始答案中遵循我的解决方案。这将确保将消息传递给正确的人。但如果客户端代码被故意修改以接收所有消息,则不会保护任何内容。
解决方案 2:为每个客户端分配私有目标和用户帐户,并配置安全性,使客户端的用户帐户只能访问其目标。
注意:找到有关“消息选择器提供消息级别授权的限制”的链接。但我认为这是供应商特定的自定义功能。
希望这会有所帮助。