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  获取idmanagerid的管理服务接口实例(如果有多个provider,则获取第一个provider实现)

public static Object getProvider(String providerManagerType) throws SPIException

l         接口2  获取idmanagerid的管理服务接口实例,参数二对应多个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中同时调用服务器AB的服务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)

 

原创粉丝点击