SOA服务又一个服务域名和一个服务名全局唯一标识,在调用SOA服务时,系统根据服务域名和服务名找到相应的SOA服务,进行调用,再将调用结果返回
1.新建一个服务类(如ServiceDemo),同时让该服务类实现ServiceListener接口,实现其包含的四个方法:
public boolean doProcess(Object EventInfo, Object signature,Object who,int certificate){}
public int getCertificateID(String MsgSignature) {}
public int getQos(String MsgSignature) {}
public int init(String ServiceChannel, String[] ServiceLists) {}
ServiceListener接口是SOA服务的统一接口,制定了服务的规范
2.创建一个服务名称的字符串数组,数组中的各个元素即为服务的名称,一个服务类可以包含多个具体的服务,形如:
String [] services ={
"serviceExample1",
" serviceExample2"
};
3.创建一个无参数的构造方法,内容为调用ServiceChannel的静态registerListener方法,完成的功能即为对服务进行ESB的注册,形如:
public ServiceDemo() {
ServiceChannel.registerListener("DEMO", this, services);
}
该方法第一个参数为服务的目录名(一个服务类对应一个服务目录),第二个参数为当前对象,第三个为服务名称数组,即为将之前创建的服务名称放置到DEMO服务目录名下,同时将他们注册到ESB中。
4.在实现的四个方法中,doProcess()方法是核心的服务处理方法,是服务调用的入口方法,在这里填写服务的业务逻辑,使用的具体形式如:
public boolean doProcess(Object EventInfo, Object signature,Object who,int certificate){
if(((String)MsgSignature).equals("serviceExample1")){
//当调用serviceExample1 服务时,则以此为入口,执行以下程序
DataWindow params = (DataWindow) EventInfo;
// EventInfo为参数容器,强制转换为DataWindow,获取调用的相关参数
//如果是后台调用服务,则可以在params中直接通过参数名称取得参数值
String userName = (String) params.getAttribute("userName ");
/*如果是前台调用服务,则前台所传参数会被统一放入到params中名称为PostData的参数中,所以要取得参数,需要先解析出PostData参数,具体方法如下*/
DataWindow PostData = (DataWindow)params.getAttribute("PostData");
String userName = (String) PostData.getAttribute("userName ");
// userName为调用时的传入参数,平台会自动将其转入DataWindow容器中
…………….
//在此完成业务逻辑程序
params.putAttribute("Result", "
//将服务的执行结果放置到DataWindow的“Result”中进行返回
}
}
其余的三个方法负责进行身份认证、服务质量等,可暂不使用,至此一个完整的服务定义已经完成,完整的服务类程序可参照如下:
package com.demo;
import com.dc.soa.MService.ServiceChannel;
import com.dc.soa.MService.ServiceListener;
import com.dc.soa.util.DataWindow;
/**
* 示例服务类
* @author dream
* @version 1.0
*/
public class ServiceDemo implements ServiceListener{
String[] services = [
“服务名称1”,
“服务名称2”
];
public ServiceDemo() {
ServiceChannel.registerListener("DEMO", this, services);
}
public boolean doProcess(Object EventInfo, Object signature, Object who, int certificate) {
//serviceExample1对应的服务实现
if (((String) signature).equals("serviceExample1")) {
DataWindow params = (DataWindow) EventInfo;
String userName = (String) params.getAttribute("userName");
//......
params.putAttribute("Result","
}
//serviceExample2对应的服务实现
if (((String) signature).equals("serviceExample2")) {
//......
}
return false;
}
public int getCertificateID(String MsgSignature) {
return 0;
}
public int getQos(String MsgSignature) {
return 0;
}
public int init(String ServiceChannel, String[] ServiceLists) {
return 0;
}
}
5.服务配置
在完成了服务的定义之后,需要对服务进行相应的配置:
在源文件src根目录下创建plugin_services.properties属性文件,将所有的服务类以插件的形式注入,服务器启动时会自动加载这些服务类所包含的服务,形如:
Block1= com.demo. ServiceDemo
Block2=……(对应的其他服务类)
注:属性名称不可重复,属性值对应的是服务类的路径
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24944228/viewspace-682287/ ,如需转载,请注明出处,否则将追究法律责任。