BaseSPIManager组件介绍
来源:互联网 发布:网络教育哪个学校好 编辑:程序博客网 时间:2024/05/21 17:46
bboss项目下载列表 在sourceforge访问地址为:
https://sourceforge.net/project/showfiles.php?group_id=238653
在bboss aop框架中,我们将业务组件配置到xml文件中(关于配置的语法请参考《bboss aop配置语法》),比如manager-provider.xml,然后就可以通过组件BaseSPIManager来获取这些业务组件的实例。除了对业务组件进行管理,bboss aop框架还提供了系统全局属性配置的功能,这些属性同样可以通过BaseSPIManager提供的相关接口来获取。下面分三个部分说明上述的功能。
BaseSPIManager介绍
BaseSPIManager管理业务组件
BaseSPIManager管理系统配置属性(在文章采用bboss aop进行系统全局属性管理 中介绍)
BaseSPIManager介绍
包路径说明
BaseSPIManager的完整包路径如下:
com.chinacreator.spi.BaseSPIManager
BaseSPIManager管理业务组件
管理业务组件的两个静态接口
l 接口1 获取id为managerid的管理服务接口实例(如果有多个provider,则获取第一个provider实现)
public static Object getProvider(String providerManagerType) throws SPIException
l 接口2 获取id为managerid的管理服务接口实例,参数二对应多个provider中相应的provider 类型标识
public static Object getProvider(String providerManagerType, String sourceType) throws SPIException
方法1和方法2的区别是:方法1的返回值和抛出的异常以默认(或者多个中的第一个provider)的provider的相应方法的返回值和异常为准,方法2返回值和抛出的异常以指定类型的provider的相应方法的返回值和异常为准。方法1和方法2的事务管理机制是一致和相同的。
这两个接口返回的对象类型为java.lang.Object,调用程序可以将该对象转型为相应的组件接口类型。
举例说明如下:
配置文件
<manager id="managerid " //管理服务id
singlable="true" //单列模式
>
<provider type="provider_a" //provider实现a
class="test.A" />
<provider type="provider_b" //provider实现b
class="test.B" />
<transactions>
<method name="handle" txtype="REQUIRED_TRANSACTION"/>
</transactions>
</manager>
获取实例
AI a = (AI)BaseSPIManager.getProvider("managerid");
a将是test.A的代理实例。因为默认获取第一个provider实现。
AI a = (AI)BaseSPIManager.getProvider("managerid",”provider_b”);
A将是test.B的代理实例。
实现远程服务调用
这里只介绍远程服务的调用方法,具体内容后面章节再详细介绍。
远程服务调用和本地服务调用使用的是同一套接口,也就是上面的两个接口。
public static Object getProvider(String providerManagerType, String sourceType) throws SPIException
public static Object getProvider(String providerManagerType) throws SPIException
只是在使用的时候在参数providerManagerType前面加上远程服务器的信息接口,添加的规则如下:
Ø (all)/providerManagerType表示在集群环境下向所有的集群节点发出服务调用请求
Ø (ip:port)/providerManagerType 表示向远程服务器发送服务调用请求,类似于ejb或者rmi的功能
Ø (ip:port; ip1:port1;….)/providerManagerType 表示向集群环境中指定的多个服务器节点发送远程服务调用请求。
现在举例说明如下:
Ø 环境准备
n 服务器A
Ip 172.16.17.56
端口 1185
服务部署
<manager id="managerid " //管理服务id
singlable="true" //单列模式
>
<provider type="provider_a" //provider实现a
class="test.A" />
<provider type="provider_b" //provider实现b
class="test.B" />
<transactions>
<method name="handle" txtype="REQUIRED_TRANSACTION"/>
</transactions>
</manager>
n 服务器B
Ip 172.16.17.51
端口 1185
服务部署
<manager id="managerid " //管理服务id
singlable="true" //单列模式
>
<provider type="provider_a" //provider实现a
class="test.A" />
<provider type="provider_b" //provider实现b
class="test.B" />
<transactions>
<method name="handle" txtype="REQUIRED_TRANSACTION"/>
</transactions>
</manager>
n 服务器C
Ip 172.16.17.52
端口 1185
服务部署
<manager id="managerid " //管理服务id
singlable="true" //单列模式
>
<provider type="provider_a" //provider实现a
class="test.A" />
<provider type="provider_b" //provider实现b
class="test.B" />
<transactions>
<method name="handle" txtype="REQUIRED_TRANSACTION"/>
</transactions>
</manager>
服务中定义了方法handle(),返回值为Object,代码如下
public Object handle()
{
return new Integer(1);
}
Ø 点对点远程调用
前提条件:两台服务器中的网络是联通的
n 在服务器A中调用服务器B的服务managerid
AI a = (AI)BaseSPIManager.getProvider("(172.16.17.51: 1185)/managerid");
Integer value = (Integer)a.handle();
n 在服务器B中调用服务器A的服务managerid
AI a = (AI)BaseSPIManager.getProvider("(172.16.17.56: 1185)/managerid");
Integer value = (Integer)a.handle();
n 在服务器A中调用服务器A的服务managerid
AI a = (AI)BaseSPIManager.getProvider("(172.16.17.56: 1185)/managerid");
Integer value = (Integer)a.handle();
这种情况将被视为本地服务调用。
Ø 集群多点远程调用
前提条件:多点服务器之间的网络是联通的,并且启用了集群管理服务(具体的内容在远程管理服务一节中介绍),同时远程服务接口的返回值类型必须为java.lang.Object
n 在服务器c中同时调用服务器A和B的服务managerid
AI a = (AI)BaseSPIManager.getProvider("(172.16.17.51: 1185; 172.16.17.56: 1185)/managerid");
Object values = a.handle();
//获取A服务器返回的值:
Integer value = (Integer)BaseSPIManager.getRPCResult("172.16.17.56", "1185", values)
//获取B服务器返回的值:
Integer value = (Integer)BaseSPIManager.getRPCResult("172.16.17.51", "1185", values)
n 在服务器C中调用集群中每台服务器(包括服务器A,B,C)的服务managerid
AI a = (AI)BaseSPIManager.getProvider("(all)/managerid");
Object values = a.handle();
//获取A服务器返回的值:
Integer value = (Integer)BaseSPIManager.getRPCResult("172.16.17.56", "1185", values)
//获取B服务器返回的值:
Integer value = (Integer)BaseSPIManager.getRPCResult("172.16.17.51", "1185", values)
//获取C服务器返回的值:
Integer value = (Integer)BaseSPIManager.getRPCResult("172.16.17.52", "1185", values)
- BaseSPIManager组件介绍
- 使用BaseSPIManager获取组件实例和直接创建组件实例的区别
- CDONTS.NewMail组件介绍
- swing组件介绍
- 组件(component)技术介绍
- 数据库组件介绍(Delphi)
- struts2核心组件介绍
- Jmeter常用组件介绍
- 常用widget组件介绍
- owb组件介绍
- oracle olap组件介绍
- C++组件简要介绍
- Tomcat组件介绍
- amStock Flex 组件介绍
- Android四大组件介绍
- AsWing组件介绍
- COM 组件基本介绍
- 介绍报表组件Qreport
- 采用bboss aop进行系统全局属性管理
- SQL2005 BOM递归方法整理
- DIV CSS网页布局中常用的列表元素ul ol li dl dt dd释义
- HashMap遍历
- 单片机
- BaseSPIManager组件介绍
- as3 操作 zip文件
- bboss aop 远程服务介绍
- 高级工程师和初级工程的区别(简洁版)
- How to start to learn dc synthesis?
- net 2.0 服务器应用程序不可用 解决方案集
- Synthesis basic concepts
- 命运
- VC编译器-链接 默认库“XXXXX”与其他库的使用冲突 的解决办法