在大型Java企业基础架构中,我遇到过如何从多个JNDI服务器访问资源的模式,例如,每个服务器服务于企业bean模块的不同应用程序服务器。
此模式由客户端显式指示JNDI通过jndi provider url属性解析给定资源的服务器。
为了实现它,客户端为每个要求资源的不同服务器设置给定的命名上下文。
我想知道一种不同的,可能更强大的方法: 客户端设置唯一的初始上下文,可以连接到多个JNDI服务器。 这样的事情:
env.put (Context.PROVIDER_URL, "serverA:1100,serverB:1100,serverC:1100")
JNDI实现本身应该根据一致的命名模式发现哪个服务解析了给定的资源。
这是一种可行且合理的方法吗?
答案 0 :(得分:0)
您描述的URL模式(“serverA:1100,serverB:1100,serverC:1100”)已被某些应用程序服务器InitialContext实现接受,但用于定义LOAD BALANCE以到达集群中的初始上下文!
例如,如果您在Weblogic Server中使用此URL,它将使用循环算法从列表中的服务器检索可用的初始上下文。它不会使用您在查找时描述的逻辑,而只会连接到初始上下文。
一种替代方法是使用外部JNDI提供程序,这是一种将外部JNDI服务器和组件映射到集中式服务器和组件的技术,然后您可以在链接名称中使用一致的命名方案(谷歌“外部JNDI提供程序”到找到一些信息)。 Weblogic也支持这个功能,就像其他服务器一样。
服务定位器模式也可用于在应用层中执行此逻辑。
规范没有定义有关provider_url的规则,只是说这个属性用法是由初始上下文实现定义的。所以它似乎是合理的,但一旦用于定义负载平衡就不会直观。另一个问题是Java EE规范不保证EJB组件的JNDI绑定名称,因此一个糟糕的JNDI实现不能让你定义JNDI名称。
我认为最好的解决方案是使用外部JNDI映射或服务定位器。