文档章节

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

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

概述

本文分两个部分:有状态会话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集群中容错和状态同步机制。

© 著作权归作者所有

共有 人打赏支持
无鸯
粉丝 122
博文 132
码字总数 207249
作品 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
Hibernate Search 5.10.0.Beta2 发布,数据检索框架

Hibernate Search 5.10.0.Beta1 已发布,这是 5.10 分支的第二个测试版本,此版本主要包括升级到适用于JBoss模块的WildFly 12,但它也增加了一些错误修正和改进。 以下是自Hibernate Search ...

周其
04/16
0
0
JBoss 系列八十五: JBoss Modules 简单介绍

概述 从JBoss AS7开始,Classloader这块开始使用全新的JBoss Modules。本文简单介绍说明JBoss Modules的设计思路,以及给出一个例子说明这一设计思路。 JBoss Modules 介绍 我们都知道,Jav...

无鸯
2014/02/04
0
0
JBoss 系列二:使用Apache httpd(mod_cluster)和JBoss构架高可用集群环境

什么是企业应用集群 集群是指把不同的服务器集中在一起,组成一个服务器集合,这个集合给客户端提供一个虚拟的平台,使客户端在不知道服务器集合结构的情况下可以对这一服务器集合进行部署应...

无鸯
2014/02/04
0
0
JBoss 系列六十五:JBoss 7/WildFly 集群之无状态会话Bean集群 - I(基本理论)

概述 我们通过如下五个方面去明确无状态会话Bean集群的基本理论: 无数据的丢失 负载均衡 容错 集群拓扑 EJB client stub 无数据的丢失 无状态会话Bean avoids holding data on behalf of i...

无鸯
2014/02/04
0
0
JBoss Developer Studio 12.0 和 JBoss Tools 4.6.0 发布

Red Hat JBoss Developer Studio 12.0 和 JBoss Tools 4.6.0 for Eclipse Photon 已发布,该版本主要是引入完整的 Java 10 支持,改进基于容器的开发,以及一些 Bug 修复。下载地址: Red Ha...

王练
07/19
0
0
JBoss 系列四十九:JBoss 7/WildFly 中端口使用列表

JBoss 7中端口使用列表 JBoss 7中所有配置都在一个文件中(standaone*.xml, domain.xml),和之前的JBoss相比JBoss 7用到的端口变少,我们将以表格的形式列出所有使用到的端口。 remoting 444...

无鸯
2014/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

回想过往,分析当下,着眼未来

好久没有真正的在纸质笔记本上写过东西了,感觉都快不会写字了,笔画都不知道怎么写了。接下来就说说咱们的正事。 2018年7月22日,我做了一个决定,那就是去参加安全培训(可能是我职业生涯中...

yeahlife
30分钟前
1
0
关于工作中的人际交往

关于工作中的人际交往 Intro 写了篇发泄情绪的博客,但不会发布出来。 大概就是,要么忍,要么滚。 以及一些不那么符合社会主义核心价值观,不满于大资本家与小资本家剥削的废话。

uniqptr
36分钟前
0
0
springMVC的流程

1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(...

JavaSon712
51分钟前
0
0
大数据教程(3.2):Linux系统软件安装之自动化脚本

博主前面文章有介绍过软件的安装,可以帮助IT人员顺利的完成功能软件安装;但是,对于我们运维人员或者需要管理软件安装的项目经理来说,有些应用一次行需要搭建很多台相同的软件环境(如tom...

em_aaron
今天
0
1
Spring Boot 2.0.3 JDBC整合Oracle 12

整合步骤 1. Oracle驱动引入 Oracle驱动一般不能通过maven仓库直接下载得到,需自行下载并导入到项目的lib目录下,建议通过如下pom依赖引入下载的Oracle驱动 <!-- Oracle 驱动 -->...

OSC_fly
今天
0
0
java 8 并行流 - 1

下面创建一个并行流,与顺序流 //顺序流Stream.iterate(0L, i -> i + 1) .limit(Integer.MAX_VALUE) .reduce(0L, Long::sum);//并行流Stream.iterate(0L, i -> i......

Canaan_
今天
0
0
数据结构与算法5

二分法采用向下取整的方法 使用有序数组的好处是查找的速度比无序数组快的多,不好的方面是因为要将所有靠后的数据移开,所以速度较慢,有序数组和无序数组的删除操作都很慢。 有序数组在查找...

沉迷于编程的小菜菜
昨天
1
1
SpringBoot | 第十一章:Redis的集成和简单使用

前言 上几节讲了利用Mybatis-Plus这个第三方的ORM框架进行数据库访问,在实际工作中,在存储一些非结构化或者缓存一些临时数据及热点数据时,一般上都会用上mongodb和redis进行这方面的需求。...

oKong
昨天
5
0
对基于深度神经网络的Auto Encoder用于异常检测的一些思考

一、前言 现实中,大部分数据都是无标签的,人和动物多数情况下都是通过无监督学习获取概念,故而无监督学习拥有广阔的业务场景。举几个场景:网络流量是正常流量还是攻击流量、视频中的人的...

冷血狂魔
昨天
0
0
并发设计之A系统调用B系统

A-->B A在发送请求之前,用乐观锁,减少对B的重复调用,这样一定程度上是幂等性。 比如A系统支付功能,要调用B系统进行支付操作,但是前端对"支付"按钮不进行控制,即用户会不断多次点击支付...

汉斯-冯-拉特
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部