文档章节

JBoss 系列六十八:JBoss 7/WildFly 集群之有状态会话Bean集群 - II(示例)

无鸯
 无鸯
发布于 2014/02/04 09:44
字数 764
阅读 106
收藏 1

概述

本文分两个部分:有状态会话Bean集群和有状态会话Bean集群示例

有状态会话Bean集群

关于有状态会话Bean集群的基本理论参照 JBoss 7/WildFly 集群之无状态会话Bean集群 - I(基本理论)

有状态会话Bean集群示例

有状态会话Bean集群示例架构如下图:


如图:

  • JBoss node1和node2组成一个集群,node1对应IP地址10.66.218.46,node2对应IP地址10.66.218.47
  • EJB 客户端位于另一台机器
我们通过如下几步部署运行有状态会话Bean集群示例。

定义StatefulSession接口

public interface StatefulSession {
	public String getServer();
	public String getName();
	public void setName(String name);
}

定义StatefulSession接口实现

@Stateful
@Remote(StatefulSession.class)
@Clustered
public class StatefulSessionBean implements StatefulSession {

	public String getServer() {
		StringBuffer sb = new StringBuffer();
        
        String ip = System.getProperty("jboss.bind.address");
        if(null != ip) {
                sb.append("jboss.bind.address: " + ip);
                sb.append(", jboss.node.name: ");
        }
        
        String jbossNodeName = System.getProperty("jboss.node.name");
        if(null != jbossNodeName) {
                sb.append(jbossNodeName);
        }
        
        String result = sb.toString();
        
        System.out.println(result);
        
        return result;
	}
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

启动并部署有状态会话Bean集群应用

EJB远程调运我们需要创建Application User,具体执行JBOSS_HOME/bin/add_user.sh或JBOSS_HOME/bin/add_user.bat创建Application User democlient/password1!
我们使用如下命令分别启动两个JBoss节点:

./standalone.sh -c standalone-ha.xml -b 10.66.218.46 -bmanagement=10.66.218.46 -u 239.255.100.100 -Djboss.node.name=node1  

./standalone.sh -c standalone-ha.xml -b 10.66.218.47 -bmanagement=10.66.218.47 -u 239.255.100.100 -Djboss.node.name=node2

有状态会话Bean集群应用代码位于: https://github.com/kylinsoong/cluster/tree/master/demo/sfsb

我们可以使用软件安装及资料下载中描述的方法下载,编译生成部署包cluster-demo-sfsb.jar。使用使用4种方式部署应用到JBoss7/WildFly中描述的方法分别部署cluster-demo-sfsb.jar到两个JBoss节点。

定义EJB客户端

EJB客户端配置文件jboss-ejb-client.properties内容如下:

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=node1,node2

remote.connection.node1.host=10.66.218.46
remote.connection.node1.port=4447
remote.connection.node1.connect.timeout=500
remote.connection.node1.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.node1.username=democlient
remote.connection.node1.password=password1!

remote.connection.node2.host=10.66.218.47
remote.connection.node2.port=4447
remote.connection.node2.connect.timeout=500
remote.connection.node2.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.node2.username=democlient
remote.connection.node2.password=password1!


remote.clusters=ejb
remote.cluster.ejb.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.cluster.ejb.username=democlient
remote.cluster.ejb.password=password1!

EJB客户端调运类如下:

public class StatefulSessionBeanClient {
	
	private String applicationContext = "cluster-demo-sfsb";
	private String SFSB_JNDI = "ejb:/" + applicationContext + "/StatefulSessionBean!" + StatefulSession.class.getName()  + "?stateful";		
	
	private void execute() throws Exception {
		Hashtable<String, String> jndiProps = new Hashtable<String, String>();
		jndiProps.put( Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming" );
		Context context = new InitialContext( jndiProps );
		StatefulSession sfsb = (StatefulSession)context.lookup(SFSB_JNDI);
		
		System.out.println("Sticky routes Test");
		for(int i = 0 ; i < 10 ; i ++){
			System.out.println(sfsb.getServer());
		}
		
		System.out.println("\nFail Over Test");
		for(int i = 0 ; i < 10 ; i ++) {
			System.out.println(sfsb.getName());
			sfsb.setName("sfsb-test-" + i);
			Thread.currentThread().sleep(1000 * 5);
		}
	}

	public static void main(String[] args) throws Exception {
		new StatefulSessionBeanClient().execute();
	}

}

运行StatefulSessionBeanClient输出如下:

Sticky routes Test
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1
jboss.bind.address: 10.66.218.46, jboss.node.name: node1

Fail Over Test
null
sfsb-test-0
sfsb-test-1
sfsb-test-2
sfsb-test-3
sfsb-test-4
sfsb-test-5
sfsb-test-6
sfsb-test-7
sfsb-test-8

我们看到同一个EJB Client通过相同的client stub的一系列EJB调运会进行Sticky 转发,即所有请求都分配到节点1。当 sfsb-test-3输出后我们手动关闭节点1,我们发现sfsb-test-4,sfsb-test-5...输出,查看JBoss日志我们可以发现有状态会话Bean集群中容错和状态同步机制。

© 著作权归作者所有

共有 人打赏支持
无鸯
粉丝 123
博文 132
码字总数 207249
作品 0
朝阳
技术主管
Java 应用服务器 WildFly 14.0.1 发布

Java 应用服务器 WildFly 14.0.1 发布了。暂未发现该版本的更新说明,更多关于 WildFly 的更新请点此查看。 WildFly,原名 JBoss AS 或者 JBoss,是一套应用程序服务器,属于开源的企业级 Ja...

淡漠悠然
09/12
0
0
JBoss 系列八十九: JBoss 7/WildFly 中如何阻止一个模块被默认加载

概述 如前面 JBoss Modules 简单介绍等的介绍,JBoss 7/WildFly 使用模块化的类加载机制,它定义了模块之间的明确依赖关系, JBoss 7/WildFly 启动时一些模块会被默认加载,JBoss 的日志系统是...

无鸯
2014/02/04
0
0
JBoss 系列五十五:JBoss 7/WildFly 集群之 HornetQ Messaging - III(示例补充说明)

概述 如下两个链接为JBoss 7/WildFly HornetQ Messaging 集群示例中用到的配置文件 https://github.com/kylinsoong/cluster/blob/master/demo/jms/standalone-full-ha-node1.xml https://gi......

无鸯
2014/02/04
0
0
JBoss AS / JBoss EAP / wildfly 区别

JBoss AS 开源社区版本,发布比较频繁。JBoss 7 ,先后发布了 7.0.0, 7.0.1, 7.0.2, 7.1.0, 7.1.1, 7.1.2, 7.1.3, 7.2.0,其中 7.1.1 比较经典,7.2.0 是 JBoss EAP 6.1 的基础,但7.1.2, 7....

郑小贱
2014/01/14
0
0
JBoss 系列五:JBoss 7/WildFly中配置使用Oracle数据库

内容概要 JBoss 系列五主要目的是演示如何在JBoss 7/WildFly中配置使用Oracle数据库,主要分两大部分Oracle数据库相关的配置,一个使用Oracle数据库的HelloWorld小程序。如下为一简单示意图:...

无鸯
2014/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
28分钟前
1
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
43分钟前
4
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
3
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
1
0
mixin混入

①新建mixin.js文件 const mixin = { methods: { /** * 分页公共方法 */ handleSizeChange(val) { this.pageData.size = val; this.query(); }, hand......

不负好时光
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部