java和c#通过esb服务互调用组件
来源:互联网 发布:淘宝详情图尺寸是多少 编辑:程序博客网 时间:2024/06/14 17:29
场景:java和c#写的服务,互相调用。
解决方案:使用这种轻量级的esb架构,通过tcp通信解决通信传输问题,总线服务解决服务地址问题,契约解决数据交互问题。由于组件封装了底层细节,比较方便好用,所以开发效率还是挺高的。
主组件:
Java: Ljc.JFramework.jar(jre1.8)
C#:Ljc.Framework.dll(.net 4.5)
LJC.FrameWork.SOA.dll(.net 4.5)
依赖组件:无
使用方法:
前提:
需要一个总线服务。总线服务的作用就是接收服务注册,并转发请求,客户端口不需要关心服务的地址。总线服务可以发布在任何地方,只需要ip端口能访问。
ESBServer _esb = new ESBServer(20000); //总线使用的tcp端口
_esb.StartServer(); //启动
开发跨语言服务
1、添加配置文件
2、设计服务契约
这个是服务请求和响应的需要的类,见后面契约部分。
3、编写服务
增加一个服务,继承类ESBService,并且增加一个构造函数,然后重写方法DoResponse,获取请求参数,响应服务调用。
Java的demo:
public final class SparkService extends ESBService {
public SparkService(int sNo, boolean supportTcpServiceRidrect) throws Exception {
super(sNo, supportTcpServiceRidrect);
// TODO Auto-generated constructor stub
}
@Override
public Object DoResponse(Tuple<Integer,byte[]> tup) throws java.lang.Exception{
int funid=tup.GetItem1();
byte[] buffer=tup.GetItem2();
switch(funid) {
case 1:
{
//解析出请求参数
SubmitSparkRequest request=EntityBufCore.DeSerialize(SubmitSparkRequest.class, buffer, true);
//使用请求处理业务
...
SubmitSparkResponse resp= new SubmitSparkResponse();
resp.setSuccess(true);
//返回结果
return resp;
}
}
return super.DoResponse(tup);
}
}
C#的demo:
class SparkTaskCallBackService:ESBService
{
public SparkTaskCallBackService()
: base(101)
{
}
public override object DoResponse(int funcId, byte[] Param)
{
switch(funcId){
case 1:
{
//这里获取请求参数
var request = EntityBufCore.DeSerialize<CallBackRequest>(Param);
//响应
return new CallBackResponse
{
Success=true
};
}
}
return base.DoResponse(funcId, Param);
}
}
4、注册服务到总线
//100是要注册到总线的服务号
//由于只通过总线转发,不需要客户端直调,所以第二个参数为false
SparkService _sparkservice = new SparkService(100, false);
_sparkservice.StartService();
5、服务关闭后注销服务
Java
try {
_sparkservice.UnRegisterService();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
_sparkservice.CloseClient();
C#
service.UnRegisterService();
service.Dispose();
客户端调用服务
1、添加配置文件
2、添加或者引用目标服务提供的契约,具体看下面契约部分
3、调用方法
响应契约=ESBClient.DoSOARequest(服务号,功能号,请求契约)
Java:
Date end=new Date();
CallBackRequest request=new CallBackRequest();
request.setSparkTaskId(sparktaskid);
request.setStartTime(start);
request.setEndTime(end);
request.setErrorOutPut(errinfo);
request.setStdOutPut(stdinfo);
request.setSuccess(errinfo=="");
CallBackResponse resp= Ljc.JFramework.SOA.ESBClient.DoSOARequest(CallBackResponse.class, Statics.CallBackServiceNo, Statics.Fun_CallBack, request);
C#:
var resp = ESBClient.DoSOARequest<SubmitSparkResponse>(SubmitContract.Consts.SparkServiceNo,
Consts.Fun_SubmitSpark, new SubmitSparkRequest()
{
Context = new SparkLauncherContext
{
AppResource = item.AppResource,
MainClass = item.MainClass,
Master = item.Master,
SparkHome = item.SparkHome,
},
TaskId = item._id.ToString()
});
配置文件
配置文件名称:ESBConfig.xml
内容:
<?xml version="1.0" encoding="utf-16"?>
<ESBConfig>
<ESBServer>127.0.0.1</ESBServer>
<ESBPort>20000</ESBPort>
<AutoStart>true</AutoStart>
</ESBConfig>
字段
含义
说明
ESBServer
总线地址
支持ipv4,和计算机名
ESBPort
总线端口
AutoStart
是否自动启动
固定为true
说明:java服务放到程序执行目录下,net服务放到程序目录下,net web放到网站根目录下。
关于契约
Esb组件仅使用内置的序列化和反序列化机制,不依赖外部其它的如json/pb的序列化器工作。
契约包括请求契约和响应契约,调用方发送请求契约,服务方返回响应契约。
契约可以是简单的数据类型如int,string等,也可以是复杂的结构化类型,建议不要用简单的类型来作契约,后期扩展性差,且建议使用一对xxxRequest/xxxResponse规范命名。由于契约是要被序列化和反序列化的,类型有限制。简单类型目前只支持以下类型:
Java类型
Net类型
java.lang.Short/short
Short
java.lang.Integer/int
Int16/int
不支持
UInt16
不支持
Ushort
java.lang.Long/long
Int32/long/Int64
java.lang.Byte/byte
Byte
char/java.lang.Character
Char
java.lang.Double/double
Double
java.lang.Float/float
Float
java.lang.String
String
java.util.Date
DateTime
Boolean/boolean
bool
java.util.HashMap
Dictionary
java.util.List
List
Array
Array
不支持
enum
不支持
Decimal
Complex(复杂对象)
Complex(复杂对象)
成员类型必须是上面支持的类型,或者也是Complex及Complext的数组,Complext的列表或字典
说明:跨越java和c#的契约字段类型按上面对照,list和array是两种数据类型,不能对应。有些字段java不支持,如果c#服务要求的契约包含这种数据,java无法调成功。字段名称不一样,但字段类型要一致,顺序也要对应,字段要写成属性,java用getxxx和setxxx,net写成public 类型 xxx{get;set;}。
Java:
public class SubmitSparkRequest {
private SparkLauncherContext _context;
private String _taskId;
public SparkLauncherContext getContext()
{
return this._context;
}
public void setContext(SparkLauncherContext value) {
this._context=value;
}
public String getTaskId()
{
return this._taskId;
}
public void setTaskId(String value) {
this._taskId=value;
}
}
C#:
public class SubmitSparkRequest
{
public SparkLauncherContext Context
{
get;
set;
}
public String TaskId
{
get;
set;
}
}
跨语言情况下,服务端契约和客户端契约应该单独写成文件最好不要混合其它无关的字段和方法,防止干扰出错,下面列出服务端契约变动的影响:
情况
影响
必须同步契约
服务端改契约字段名或者类名
无影响
不需要
服务端改契约字段类型
调方失败
需要
服务端增加字段
调方获取不了新字段,旧的无影响
不一定需要
服务端删除字段
调方失败
需要
说明:组件在我的CSDN资源里面找。
- java和c#通过esb服务互调用组件
- 通过COM组件方式实现java调用C#写的DLL文件 转
- 通过COM组件方式实现java调用C#写的DLL文件
- 通过COM组件方式实现java调用C#写的DLL文件
- 通过COM组件方式实现java调用C#写的DLL文件
- Mule ESB 学习笔记 服务调用
- C#通过调用API函数来安装和卸载windows服务
- Java通过Jolt调用Tuxedo服务
- 通过Java来调用WTC服务
- 通过Java来调用WTC服务
- java通过wtc调用tuxedo服务超时
- Java通过Jolt调用Tuxedo服务
- Mule ESB java组件两种写法
- C#通过COM组件调用C++的代码(转载)
- C++和C#编写调用COM组件
- C++和C#编写调用COM组件
- C++和C#编写调用COM组件
- C++和C#编写调用COM组件
- 欢迎使用CSDN-markdown编辑器
- java 注解 反射
- 如何解决超链接被点击后hover样式不出现问题
- SDUT-3375 数据结构实验之查找三:树的种类统计
- R高水平绘图
- java和c#通过esb服务互调用组件
- 1.1数组和链表:160. Intersection of Two Linked Lists(Leetcode)
- CBK精准扶贫走进广东省暨全国代理商大会圆满落幕
- Tensorflow入门(MNIST学习)
- 欢迎使用CSDN-markdown编辑器
- Android图片放大缩小自由移动控件
- 设计23式—原型
- golang使用protobuf简易教程
- TensorFlow 辨异 —— tf.placeholder 与 tf.Variable