我想使用Atmosphere(1.0.12)创建prototpe,但我目前的实施例不适用于后备传输。
简单案例场景:
1.客户端连接到服务器 - 服务器将当前(完整)状态推送到该客户端
2.服务器将当前状态的更改推送到所有连接的客户端
我认为这是一种非常常见的情况。
我是如何为websockets做的:
当客户端连接(GET)时,我将资源添加到默认广播器。此广播器用于向所有客户端发送数据(更改)。在同一方法中,我为此资源创建了另一个广播公司:
Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class,resource.uuid(),true);
客户端将数据推送到服务器。调用POST方法。这意味着:我是一个客户,我想要当前的完整状态。因此服务器获取原始资源UUID,查找privateBroadcaster,privateBroadcaster用于将完整状态推送到该客户端。
问题:
如果浏览器不支持websockets(即IE9,IE 8),则此解决方案不适用于后备传输。
此解决方案不起作用,因为POST方法中的原始资源与当前资源相同。因此,无法获得私人广播公司并将完整状态发送给客户。
问题:
我承认我现在迷路了,需要一些帮助。如果您需要更多细节,请询问。 提前谢谢。
- 更新
我决定将部分代码负责创建私有广播公司的POST方法。该方法如下所示。负责创建响应的部分是无关紧要的,因此是隐藏的。这仍适用于webscokets,不适用于后备(长轮询)协议。客户端未收到初始状态,收到更改,但无需更新。
@Context AtmosphereResource resource;
@Context BroadcasterFactory broadcasterFactory;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public void sendCurrentState(Request request){
logger.info("creating private broadcaster for uuid: " + resource.uuid());
Broadcaster privateBroadcaster = broadcasterFactory.lookup(DefaultBroadcaster.class, resource.uuid(), true);
privateBroadcaster.addAtmosphereResource(resource);
//Prepare response (hidden)
privateBroadcaster.broadcast(encodedJSON);
}
休伯特
答案 0 :(得分:0)
萨吕,
POST中的AtmosphereResource不一样。对于长轮询和流式传输,uuid是相同的,但是您需要使用AtmosphereResourceFactory.find(...)来检索暂停的AtmosphereResource。
如果它不起作用,让我们继续讨论邮件列表。
A +