18

我有一个通过 RESTful Web 服务提供的 Java 应用程序。我想创建一种机制,以便客户端可以注册事件通知。问题是无法保证客户端程序是 Java 程序,因此我将无法为此使用 JMS(即,如果每个客户端都是 Java 应用程序,那么我们可以允许客户端订阅 JMS 主题并在那里收听通知消息)。

用例大致如下:

  1. 客户端通过 RESTful Web 服务调用向我的服务器应用程序注册自己,表明它有兴趣在任何时候更新特定对象时获取通知消息。
  2. 当感兴趣的对象更新时,我的服务器应用程序需要向所有有兴趣收到此事件通知的客户端发出通知。

正如我上面提到的,我知道如果所有客户端都是 Java 应用程序,我将如何做到这一点——设置一个客户端可以收听通知消息的主题。但是我不能使用这种方法,因为很可能许多客户端将无法收听 JMS 主题以获取通知消息。

这里的任何人都可以告诉我这个问题通常是如何解决的吗?我可以使用 RESTful API 提供什么机制?

4

4 回答 4

9

我可以想到四种方法:

  1. 一种 Twitter 方法:您注册客户端,然后它使用 GET 定期回调以检索任何通知。

  2. 客户端描述了它在发出注册请求时希望如何接收通知。这样,您可以为那些可以处理它的人允许 JMS,而对于那些不能处理它的人,则可以使用电子邮件或类似的方式。

  3. 在注册请求期间获取一个 URL,并在收到通知时分别回传给每个客户端。几乎没有发布/订阅,但效果会相似。当然,您会假设客户端正在侦听这些通知并已根据您的规范实施了客户端。

  4. 购买 IBM WebSphere MQ (MQSeries)。有史以来最好的 IBM 产品。不是 REST,但它非常适合像这样的多平台集成。

于 2009-07-07T18:28:47.940 回答
4

我们遇到了这个问题,需要对相对较少的侦听器进行低延迟异步更新。我们的两个替代解决方案是:

  1. 轮询:用 GET 请求锤击你需要的资源列表
  2. 流式事件更新:提供监视器资源。服务器保持连接打开。当事件发生时,服务器使用多部分内容类型或分块传输编码传输事件描述流。
于 2009-10-13T21:20:58.520 回答
3

在对 RESTful 请求的响应中,您可以提供客户端可以监控更新的个性化 RESTful URL。

也就是说,您有一个 URL(例如 /Signup.htm),它接受客户端的信息(如果合适,则为要监视的对象的 id)并返回自定义的 url (/Monitor/XYZPDQ),其中 XYZPDQ 是创建的 UUID对于那个特定的客户。客户端可以在某个时间间隔轮询该自定义 URL,如果发生更新,它将收到通知。

如果您不关心客户端是谁(并且不想创建这么多 UUID),您可以为每个可能想要监控的对象设置单独的 RESTful URL,并且“注册”URL 只会返回正确的一个。

正如 John Saunders 所说,您无法通过 HTTP 进行更直接的发布/订阅。

于 2009-07-07T18:29:25.927 回答
1

If polling is not acceptable I would consider using web-sockets (e.g. see here). Though to be honest I like the idea suggested by user189423 of multipart content-type or chunked transfer-encoding as well.

于 2012-09-15T21:52:32.740 回答