2

背景

我很乐意为各种服务提供商建立一个中央预约系统。这是基于 GlassFish 3.1.1 上的 Java EE 6 构建的,利用 JSF 2、EJB 3.1 和其他 JEE6 标准。每个服务提供商都有自己的预约设备,在他们自己的连接到 Internet 的服务器上运行,但目前他们没有任何接口让他们的患者自己预约。

我的系统将通过我定义的 API 在服务提供商的系统上同步预约(响应用户请求),该 API 涉及通过 HTTP 流式传输 XML。这些预约预约请求是同步的,因为服务提供商将继续以老式方式(通过电话/柜台)直接在其系统中预约预约,并且无论出于何种原因,他们的系统保留拒绝此类请求的权利(以防止重复预约和其他原因)。因此,他们的系统保留了作为真相来源的地位。

出于显而易见的原因(主要是安全性),API 连接是由服务提供商的系统建立的。这意味着服务器(我的系统)正在发送请求,客户端(他们的系统)正在发送响应。

问题

我需要一些关于如何在 GlassFish 3.1.1 上使用 Java EE 6 通过 HTTP API 构建服务器推送 XML 的建议。我想到了一些不太理想的选择。其中一个涉及一个单例 bean,其中包含我的约会 ID 到他们的约会预订响应的映射。在这种情况下,我的系统会在有限的时间内(例如最多 10 秒)轮询地图,直到找到匹配的响应,然后返回响应,然后最终在 JSF UI 中处理该响应。同时,API servlet(或者可能是 JAX-RS Web 服务)轮询单例 bean 的请求,将它们转换为 XML 并将它们流式传输到服务提供者的输出流。

我确信必须有许多更好的方法来做到这一点,而不涉及每个连接的线程、阻塞、轮询等。

想法?

更新

我倾向于 Atmosphere/Jersey,但现在我意识到阻塞 I/O 在 NPTL 下是相当可扩展的,所以我在这方面很灵活。

4

1 回答 1

1

我是这样做的:

从包含以下内容的单例 EJB 开始:

  1. A Map<Long, BlockingDeque<OutboundApiMessage>>,其中 key 是 API 客户端 ID;
  2. A Map<Long, Exchanger<AppointmentExchange>>,其中键是 Web 端约会 ID,AppointmentExchange包含该 ID 和 API 客户端约会 ID。

我在单例 EJB 上设置了 bean 管理的并发控制,定义了一些方法来入队、出队和重新入队(后者以防服务器推送OutboundApiMessage失败并且需要添加到队列的前面,这将是下一个项目出队),将其连接到 JAX-RS Web 服务(一个用于上游,一个用于下游)。

单例 EJB 有一个同步预约的方法。它将一条消息排入队列以由客户端接收,创建一个Exchanger包含新AppointmentExchange实例的实例,然后阻塞等待交换。当入站 Web 服务返回答案时,该 Web 服务通过另一种方法通知单例 EJB,该方法通过Exchanger.

现在一切都很好。当然,还有比这更多的东西,但这就是它的要点。

于 2011-11-30T12:39:11.847 回答