我编写了一个使用Google地球插件的网络应用,可将数十个(如果不是数百个)地理标记数据源可视化为网络链接。此时,在显示器上获取更新的唯一方法是在每个网络链接上设置自动刷新。但是,由于许多链接和短刷新间隔(1-2s),托管链接的服务器很容易被淹没(CPU使用率上升到接近100%)。很多这些更新都没有返回任何数据,因此我希望我可以使用推送机制,并能够在新数据上将KML更新推送回客户端 - 这将为我节省大量的处理时间。有没有办法异步推送KML到GE插件(最好用Java)?
答案 0 :(得分:2)
理论上可以通过长轮询来实现。
您只需将服务器设置为保持连接处于打开状态,并且一旦检查新内容是否可用,就会立即将其返回给客户端。
GE只会打开一个连接perk网络链接,所以当连接保持打开状态时,没有任何反应,旧内容可见。数据刷新后,X秒后将打开一个新连接。重复这个过程。
服务器需要能够保持大量连接打开,但它们大部分都是休眠,所以不应该导致任何负载。 (你只需要一个能够做到这一点的网络服务器应用程序)
但在实践中,它却陷入了陷阱。主要是如果在GE和服务器之间有任何代理,它们通常会在发生任何事情之前超时,并切断连接。不幸的是,一旦网络链接失败一次,GE通常会停止尝试更新该链接。
Alternativly可以使用KML中内置的Update机制。通过这种方式,您只有一个刷新的网络链接。但要可靠地工作可能会很棘手。
最后,可能是最推荐的 - 是在Javascript中实现插件之外的刷新机制。因此,更新的链接被推送到Javascript容器,然后在需要时专门刷新某些内容。
可以在JS中使用类似的长轮询,也可以使用像websockets这样的推送通知。您可以重复使用强大的实现。