Java EE 6服务器推送
背景
我很好地为各种服务提供商建立中央预约系统。 这是基于GlassFish 3.1.1上的Java EE 6构建的,利用了JSF 2,EJB 3.1和其他JEE6标准。 每家服务提供商都有自己的预约设施,它们可以通过自己的服务器连接到互联网,但目前他们没有任何接口可以让患者自己预约。
我的系统将通过我已经定义的涉及通过HTTP流式传输XML的API同步预订服务提供商系统上的约会(以响应用户请求)。 这些预约预约请求是同步的,因为服务提供商将继续以旧式方式(通过电话/柜台)直接预约预约,并且无论出于何种原因,其系统保留拒绝此类请求的权利(以防止重复预订和由于其他原因)。 因此,他们的系统保留了成为真相源泉的地位。
出于显而易见的原因(主要是安全性),API连接由服务提供商的系统建立。 这意味着请求由服务器(我的系统)发送,并由客户端(他们的系统)发送响应。
问题
我需要一些关于如何使用GlassFish 3.1.1上的Java EE 6构建服务器推送XML over HTTP API的建议。 想到一些不太理想的选择。 其中之一涉及一个单身bean,其中包含我的预约ID到他们的预约回复的地图。 在这种情况下,我的系统轮询地图一段有限的时间(例如最多10秒),直到找到匹配的响应,然后返回最终在JSF UI中处理的响应。 同时,API servlet(或者JAX-RS web服务)轮询singleton bean的请求,将它们转换为XML并将它们流到服务提供者的输出流。
我确信必须有一些更好的方法来做到这一点,而不涉及每个连接的线程,阻塞,轮询等。
想法?
更新
我倾向于Atmosphere / Jersey,但现在我意识到在NPTL下阻塞I / O是可扩展的,所以我在这方面很灵活。
以下是我的做法:
从包含以下内容的单例EJB开始:
Map<Long, BlockingDeque<OutboundApiMessage>>
,其中键是API客户端ID; Map<Long, Exchanger<AppointmentExchange>>
,其中键是网络端约会ID, AppointmentExchange
包含该ID和API客户端约会ID。 我在单例EJB上设置了bean管理的并发控制,定义了一些排队,出队和重新排队的方法(后者用于OutboundApiMessage
服务器推送失败并需要添加到队列前面的地方,将其连接到JAX-RS Web服务(一个用于上游,一个用于下游)。
单例EJB有一种同步预约约会的方法。 它排入到由客户端被拾起的消息,创建一个Exchanger
包含新AppointmentExchange
实例然后等待交换块。 当入站Web服务返回回应时,该Web服务将通过另一种通过Exchanger
执行交换的方法来通知单例EJB。
现在一切运作良好。 当然,除此之外还有更多,但这是它的要点。
链接地址: http://www.djcxy.com/p/76471.html