博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hessian——轻量级的二进制协议远程调用实现方案
阅读量:5857 次
发布时间:2019-06-19

本文共 2664 字,大约阅读时间需要 8 分钟。

hot3.png

       最近要做一个工作流的系统来支持子系统的上传,审批,复审,会签等操作,而一般传统的项目间交流主要是通过http调用另外的服务器的地址,返回一个json或是字符串,这种方式效率低,并且极其消耗资源,上家公司作为一个电商网站,有两个项目和一个中间件,每个项目之间信息处理全是通过http实现,由于优化不到位(应该是根本没有优化),经常会出现runtimeout的异常,而将runtime的时间设置太长也会影响用户体验,由于有些数据经常需要跨项目(数据库不同)查询或更新,导致异常经常出现。那时以为项目间就应该通过http传输,直到遇到Hessian,才知道可以这样利用第三方的http实现方案,这样更加方便和可靠。

(1).客户端:

a.发送远程调用请求:

客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>通过HTTP协议发送远程请求代理到服务端。

b.接收远程调用响应:

远程调用结果—>HTTP响应—>客户端。

(1).服务端:

a.接收远程调用请求:

远程调用HTTP请求—>HessianServiceExporter接收请求—>HessianExporter将远程调用对象封装为HessianSkeleton框架—> HessianSkeleton处理远程调用请求。

b.返回远程调用响应:

HessianSkeleton封装远程调用处理结果—>HTTP响应—>客户端。

Hessian的实现:服务端Hessian需要四个东西就可以提供服务了,一个interface的java;一个实现interface的impl的java;一个实现了Serializable的实体,用来返回需要的东西;一个配置好了的web.xml用来实现暴露出远程接口,写好服务端接口和实现,测试完毕后将接口类和实体类已jar包形式导出;

客户端Hessian需要服务器接口和实体的jat包,服务器端的路径,就可以轻松的将服务器端的服务引用出来,这样就达到了对服务器端的操作。

eg:

接口:public interface BasicAPI {

public void setGreeting(String greeting);
public String hello();
public User getUser();
}

接口实现:

public class BasicService implements BasicAPI {

private String _greeting = "Hello, world";
public void setGreeting(String greeting)
{
_greeting = greeting;
System.out.println("set greeting success:"+_greeting);
}
public String hello()
{
return _greeting;
}
public User getUser() {
return new User("prance", "meshow");
}
}

pojo实体:

public class User implements Serializable{

String userName ="snoopy";
String password ="showme";
public User(String user, String pwd) {
this.userName =user;
this.password= pwd;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
}

web.xml配置:

<servlet>

        <servlet-name>hello</servlet-name>
        <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
        <init-param>
        <param-name>service-class</param-name>
        <param-value>demo.BasicService</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

客户端可以是一个main启动方法

import demo.User;

import demo.BasicAPI;
import com.caucho.hessian.client.HessianProxyFactory;

 public static void main(String[] args) {

 //在服务器端的web.xml文件中配置的HessianServlet映射的访问URL地址

        String url = "http://localhost:8081/OCROnline/hello";
        HessianProxyFactory factory = new HessianProxyFactory();
        BasicAPI service = (BasicAPI) factory.create(BasicAPI.class, url);//创建BasicAPI接口的实例对象
        User user = service.getUser();//调用Hessian服务器端的BasicAPI类中的getUser方法来获取一个User对象
        System.out.println(service.getUser().getPassword());
        System.out.println(service.hello());
        System.out.println(service.getUser() .getUserName());}

运行main方法就能调用服务端的方法了,超级简单!超级方便!当然这比较适合为子系统提供服务。

转载于:https://my.oschina.net/githubhty/blog/704245

你可能感兴趣的文章
Team Name
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
RedHat6 管理应用服务【11】
查看>>
从周五开始香港主机特别慢,香港主机用户有同感吗?
查看>>
Ember.js 3.9.0-beta.3 发布,JavaScript Web 应用开发框架
查看>>
python标准库00 学习准备
查看>>
4.2. PHP crypt()
查看>>
commonservice-config配置服务搭建
查看>>
Python递归函数与匿名函数
查看>>
loadrunner安装运行一步一步来(多图)
查看>>
监控工具htop的安装及使用
查看>>
Nodejs使用图灵机器人获取笑话
查看>>
Spring 任务调度 简单的,使用Schedule
查看>>
SQL 2005删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)的解决...
查看>>
【Touch&input 】支持多个游戏控制器(18)
查看>>
进老男孩的自我介绍和决心书
查看>>
Android一些问题的解决方案
查看>>
目标与绩效管理实战专家胡立
查看>>
2014手机分析图
查看>>
一元多项式相加
查看>>