在jboss集群时,有一种服务被称为高可用单例服务,意思是指在集群中同时肯定有且只会有一个节点提供这个服务。换句话说这种服务只会在一个节点上启动,并且当这个节点不可用时,集群中会有另一个节点代替它,它是一个具有故障恢复能力的单例服务。要实现这种服务,最简单的方法就是把部署单元,如war, ear, jar,等放到jboss/server/all/deploy-hasingleton/ 目录下。但是放在这个目录下的应用是不能热部署,也不具有farm deploy功能的。还好jboss里有一个很特殊的mbean叫 jboss.ha:service=HASingletonDeployer,type=Barrier,利用它可以很容易的实现高可用单例服务。这个bean很特殊,只有在集群的master节点上它才会被启动,而一旦master节点不再是master,它又会停止。所以一个普通的部署单元,只要依赖上了barrier,就会具有高可用单例服务的能力。下面举一个例子。
现在要实现一个高可用的消息驱动bean,监听远程机器上的消息topic/a。如果只在集群中的一个节点上部署这个MDB,一旦这个节点不可用,消息处理就停止了。为了提高可用性,可以在每个节点上部署这个MDB,但这时同一个消息会被每个MDB收到和处理,这不是我们想要的,因为同一个消息应该只被一个 MDB处理。这个时候只要让这个MDB对barrier依赖,再把它部署在所有节点上,那么就只有主节点上的MDB会运行,并且当主节点完蛋时,其他节点变成主节点时,那个节点上的MDB会自动运行。这样我们就实现了高可用单例消息驱动bean服务。
要让mbean对barrier依赖,只要在它的部署文件里填上一行,例如:
<mbean name="xx" code="xx.xx.xxx">
<depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
</mbean>
</server>
对于war,jar,ear,可以在jboss.xml里添加,具体见jboss文档。对于ejb3,加上下面的annotation就好了:
我想让整个ear包部署成单例。
把jboss.xml放到ear的META-INF下
jboss.ha:service=HASingletonDeployer,type=Barrier
jboss已经配成集群了,但是启动两个jboss发现两边都部署了。
WHY???????????
望指教!!!!
我想让整个ear包部署成单例。
把jboss.xml放到ear的META-INF下
<jboss>
<container-configurations>
</container-configuration>
<depends>jboss.ha:service=HASingletonDeployer,type=Barrier</depends>
</container-configuration>
</container-configurations>
</jboss>
jboss已经配成集群了,但是启动两个jboss发现两边都部署了。
WHY???????????
望指教!!!!
如果我没有记错的话,Barrier阻止依赖他的mbean进入 start状态,但是依赖他的mbean还是能created的。
首先,确认你的jboss是在一个集群里了,而不是各自在自己的集群里。其次,看jboss文档上的话:
On the other hand, the barrier-dependent service will be instantiated/created (i.e., any create() method invoked) on all nodes, but only started on the master node. This is different with the deploy-hasingleton approach that will only deploy (instantiate/create/start) the contents of the deploy-hasingleton directory on one of the nodes.
ear会被部署,只是没有启动而已。
原文在 http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Clustering_Guide/4/html/ch05s11s03.html
谢谢你的回复!
我这的ear是被启动了,因为ear包里有个自启动的war工程,日志显示两边都启动了。
是不是我的jboss.xml写的有问题?
这个jboss.xml是个令人头痛的东西,我没有在jboss的网站上找到详细的使用说明,或许你能找到。我之前只让ejb对barrier bean依赖过,没有试过让整个container对其依赖。可能你写的格式不对,再查查看吧。