如何使用RESTful Web服务创建异步通知系统?

18
我有一个Java应用程序,通过RESTful Web服务提供。我想创建一种机制,使客户端可以注册获得事件通知。但问题是不能保证客户端程序都是Java程序,因此无法使用JMS(如果每个客户端都是Java应用程序,则可以允许客户端订阅JMS主题并在那里侦听通知消息)。
使用情况大致如下:
1. 客户端通过RESTful Web服务调用向服务器应用程序注册自己,表示有兴趣在特定对象更新时获取通知消息。 2. 当感兴趣的对象更新时,我的服务器应用程序需要向所有有兴趣被通知此事件的客户端发送通知消息。
如上所述,如果所有客户端都是Java应用程序,我知道如何做--设置客户端可以侦听通知消息的主题。但由于许多客户端可能无法侦听JMS主题以获取通知消息,因此无法使用此方法。
这个问题通常如何解决?我能否提供一种使用RESTful API的机制?

我实际上已经为我的公司构建了这样一个系统,并且考虑将其作为开源项目发布。它用Groovy编写,但不依赖于在服务器上安装Groovy - 它作为Java应用程序使用Restlet和Java服务包装器运行。它可以相当容易地修改为在Java应用程序服务器中运行。它使用数据访问对象作为对数据库的抽象层。它附带了适配器以支持CouchDB,但很容易实现与其他数据库兼容的适配器。如果我将其作为开源发布,你会有兴趣吗? - Avi Flax
4个回答

9
我可以想到以下四种方法:
  1. Twitter方法:您注册客户端,然后它会定期回调GET以检索任何通知。

  2. 客户端在进行注册请求时描述了它希望如何接收通知的方式。这样,您可以允许那些能够处理JMS的客户端,并对那些不能处理JMS的客户端进行电子邮件或类似的回退。

  3. 在注册请求期间获取URL,并在每个客户端上单独POST通知。虽然不是发布/订阅,但效果类似。当然,您将假定客户端正在监听这些通知,并根据您的规格实现了其客户端。

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


4
我们遇到了这个问题,需要向相对较少的监听器提供低延迟的异步更新。我们有两种备选方案:
  1. 轮询:使用GET请求频繁查询所需资源列表。
  2. 流式事件更新:提供一个监视器资源。服务器保持连接打开。当发生事件时,服务器使用多部分内容类型或分块传输编码传输一系列事件描述。

3
在RESTful请求的响应中,您可以提供一个个性化的RESTful URL,客户端可以监视更新。也就是说,您有一个URL(例如/ Signup.htm),接受客户端的信息(如果适用,则为ID,要监视的对象的ID),并返回一个定制的URL(/ Monitor / XYZPDQ),其中XYZPDQ是为该特定客户端创建的UUID。客户端可以在某个间隔内轮询该定制的URL,如果更新发生,它将收到通知。如果您不关心客户端是谁(并且不想创建那么多UUID),则可以为可能需要被监视的每个对象都有单独的RESTful URL,并且“注册”URL只会返回正确的URL。正如John Saunders所说,您不能通过HTTP进行更直接的发布/订阅。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接