1

我正在设计一个系统,其中一台服务器必须向许多独立客户端发送消息。客户端不了解彼此,也不应该能够消费、窥视或以任何其他方式获取有关彼此消息的知识。

因此,我想知道 JMS / ActiveMq 是否有能力控制哪些客户端获取哪些消息?

我希望所有客户端都连接到同一个 JSM 提供程序(“目标”)并只使用为他们准备的消息。从服务器的角度来看,这将是一个简单的设置。

另一种方法是从所有客户端获取 Web 服务端点,并在服务器每次收到客户端消息时执行 ws 调用。我认为这种替代方法听起来“错误”,因为我认为 ws 调用很臃肿。每个 ws 调用都有很大的开销,并且该服务器每天必须进行 1000 次调用。在我看来,这对于服务器来说不是最理想的......

4

1 回答 1

1

简短回答:使用消息选择器

详细答案:这个问题没有提到对话是如何发起的。所以这是我对这两种情况的回答。

a)如果客户端发起对话(即客户端向服务器发送消息并等待回复)。

这是一个请求/回复场景。Messaging/JMS 是一个解耦的通信系统。但是请求/回复是 JMS 中的一种常见模式。它可以使用相关模式来实现。

  • 唯一标识符(相关 ID)作为请求消息的一部分发送。
  • 服务器接收到消息并在回复消息中设置关联 ID。
  • 客户端使用消息选择器接收具有正确关联 ID 的消息。

b)如果服务器发起会话(即服务器在没有客户端请求的情况下向客户端发送消息)。

在这种情况下,可以使用类似的方法。

  • 为每个客户端分配一个固定的客户端 ID。
  • 服务器维护所有客户端ID,并将接收者的客户端ID设置为消息的关联ID。
  • 客户端使用消息选择器接收相关 id 等于其客户端 id 的消息。

关于保密的更新。

从此链接中提取的以下信息有助于您了解JMS 安全性

JMS 没有指定用于控制消息机密性和完整性的安全契约或 API。安全性被认为是特定于 JMS 提供程序的特性。它由系统管理员控制,而不是以编程方式或由 J2EE 服务器运行时实现。

JMS 安全性的两个主要特性是身份验证和授权。据我所知,客户端访问的 JMS 安全性侧重于保护 JMS 目标(而不是单个消息)。只要客户端可以访问目的地,分配给客户端的安全角色就适用于属于该目的地的所有消息。

基于此,

解决方案1:如果客户端代码由受信任方控制。

在我的原始答案中遵循我的解决方案。这将确保将消息传递给正确的人。但如果客户端代码被故意修改以接收所有消息,则不会保护任何内容。

解决方案 2:为每个客户端分配私有目标和用户帐户,并配置安全性,使客户端的用户帐户只能访问其目标。

注意:找到有关“消息选择器提供消息级别授权的限制”的链接。但我认为这是供应商特定的自定义功能。

希望这会有所帮助。

于 2010-08-13T16:45:37.233 回答