2012-03-05 64 views
0

我有一个Flex/BlazeDS webapp(伪内容管理系统),在2个Weblogic 10.3服务器上运行Java后端以实现负载平衡和HA目的。跨两个Web服务器同步BlazeDS消息

基本上,我使用AMF轮询来更新我的应用程序,以便当用户从搜索结果中打开文档时,相应的行将在当前屏幕上显示该文档的所有用户显示屏上显示锁定图标。

我遇到的问题是,如果连接到服务器A的用户打开文档X,锁定的图标只会出现在连接到服务器A的其他用户的屏幕上。连接到服务器B的用户的显示将不会更新。是否有确定的范例或最佳实践来确保锁定的更新将在所有服务器上传播?

回答

1

最简单的方法是使用数据库实现的锁(如果您已经在应用程序中使用数据库)。

另一种解决方案是实现一个发布/订阅情景和使用BlazeDS的聚类功能,描述here。使用JGroups,BlazeDS可以配置为在群集中工作,并且由发布者创建的消息(锁定文档)将传播到所有发布者。

BlazeDS消息功能描述为here。我仍然推荐第一个版本(数据库)。

对于您可以与动物园管理员,Hazelcast等尝试,我不会在你的情况下,但是使用它们,更多的“异国情调”的选项。

+0

感谢您的指点,我已经走了并实施了JGroups解决方案 – tth 2012-03-27 01:04:17

2

我会建议使用数据库锁定,以及(你只需要一个布尔标志和一个干净的事务隔离),以锁定事件分派给所有其他用户和分布式JMS主题。我不知道是否以及如何使用BlazeDS做到这一点,但可以很容易地使用GraniteDS来设置这种架构。

基本上,当用户请求文档时,事务性的服务器端bean(比如EJB3)必须检查资源是否可用,将其锁定并将锁定事件发布到分布式JMS主题。由于该主题是分布式的,因此将在所有WebLogic节点和所有连接的用户(即连接到的任何群集节点)上分派消息,并通过长轮询消费者通知此事件。 GraniteDS的具有良好支持的WebLogic异步的servlet(见GravityWebLogicServlet),它会给你的用户带来更实时经验比用简单的投票,并在不损害可扩展性(异步的servlet是指在这种设置中使用) 。

一些额外的资源:

  • 实时消息documentation,并对GraniteDS。
  • 关于GraniteDS的群集,HA和实时消息功能(尽管有JBoss和基本的聊天应用程序)的简短video

即使您不希望或不能在您的项目中使用GraniteDS,我也会建议您考虑这个分布式JMS主题,为您的问题提供最好和最可靠的解决方案。