客户端必须具备以下几点:

  • java客户端包含Hessian.jar的包。
  • 具有和服务器端结构一样的接口。
  • 利用HessianProxyFactory调用远程接口。
  • 使用spring方式需要配置HessianProxyFactoryBean 

    注意:使用resin容器时,resin已经包含了hessian.jar包

JAVA服务器端必须具备以下几点:

  • 包含Hessian的jar包。
  • 设计一个接口,用来给客户端调用。
  • 实现该接口的功能。
  • 配置web.xml,配好相应的servlet。
  • 对象必须实现Serializable 接口。
  • 对于spring方式DispatcherServlet拦截url,HessianServiceExporter提供Bean服务

完整代码下载

https://gitee.com/zml2015/HessianDemo

引入必要jar包

<dependency><groupId>com.caucho</groupId><artifactId>hessian</artifactId><version>4.0.51</version>
</dependency>

服务器端

定义接口

package top.wuyongshi.service;
/*** Created by 郑明亮 on 2017/10/10 16:28.*/import java.util.List;import top.wuyongshi.model.CommonVO;
import top.wuyongshi.model.PageInfo;
import top.wuyongshi.model.TaskEntity;/*** @author 郑明亮* @version 1.0* @time 2017/10/10 16:28* @description <p> </p>*/
public interface ITaskRPC {/*** 根据作业名称查询作业信息* @param taskName* @return*/PageInfo<TaskEntity> queryTaskByName(String taskName, CommonVO commonVO);/*** 查询作业列表* @return*/PageInfo<TaskEntity> queryAll(CommonVO commonVO);List<TaskEntity> queryAll();/*** 查询 源连接池 列表* @return*/List<String> querySourcePools();/*** 查询 目标连接池 列表* @return*/List<String> queryTargetPools();}

实现接口

package top.wuyongshi.service.impl;
/*** Created by 郑明亮 on 2017/10/10 16:27.*/import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;import top.wuyongshi.model.CommonVO;
import top.wuyongshi.model.PageInfo;
import top.wuyongshi.model.TaskEntity;
import top.wuyongshi.service.ITaskRPC;/*** @author 郑明亮   @email 1072307340@qq.com* @version 1.0* @time 2017/10/10 16:27* @description <p> </p>*/
public class TaskRPCImpl implements ITaskRPC {@Overridepublic PageInfo<TaskEntity> queryTaskByName(String taskName, CommonVO commonVO) {return null;}@Overridepublic PageInfo<TaskEntity> queryAll(CommonVO commonVO) {return getTask(commonVO);}@Overridepublic List<TaskEntity> queryAll() {return getTask();}static final String frequentness[] = {"日报","月报","季报","半年报","年报"};@Overridepublic List<String> querySourcePools() {return getSourcePools();}@Overridepublic List<String> queryTargetPools() {return getTargetPools();}/*** 模拟作业数据* @return*/public static List<TaskEntity> getTask(){List<TaskEntity> list = new ArrayList<>();Random random = new Random();initTask(list, frequentness[random.nextInt(1000) % 5]);return list;}private static void initTask(List<TaskEntity> list, String frequentness) {for (int i = 0; i < 30; i++) {TaskEntity task = new TaskEntity();task.setId(""+i);task.setTaskName("task"+ getRandomCode(4));task.setTaskDesc("作业描述"+ UUID.randomUUID().toString());task.setTaskCreator("郑明亮");task.setTaskFrequentness(frequentness);task.setLimitTime(10);list.add(task);}}public static PageInfo<TaskEntity> getTask(CommonVO commonVO){List<TaskEntity> list = new ArrayList<>();Random random = new Random();initTask(list, frequentness[random.nextInt(1000)%5]);PageInfo pageInfo = new PageInfo();pageInfo.setList(list);pageInfo.setPageSize(commonVO.getPageSize());pageInfo.setTotal(30);pageInfo.setPages(((int) Math.ceil(30.0 / commonVO.getPageSize())));pageInfo.setPageNum(commonVO.getPageNo());return pageInfo;}public static List<String> getSourcePools() {List<String> soucePools = new ArrayList<>();for (int i = 0; i < 10; i++) {soucePools.add("源连接池"+(i+1));}return soucePools;}public List<String> getTargetPools() {List<String> targetPools = new ArrayList<>();for (int i = 0; i < 10; i++) {targetPools.add("目标连接池"+(i+1));}return targetPools;}public static String getRandomCode(int number) {String codeNum = "";int[] code = new int[3];Random random = new Random();for (int i = 0; i < number; i++) {int num = random.nextInt(10) + 48;int uppercase = random.nextInt(26) + 65;int lowercase = random.nextInt(26) + 97;code[0] = num;code[1] = uppercase;code[2] = lowercase;codeNum += (char) code[random.nextInt(3)];}System.out.println(codeNum);return codeNum;}
}

传输对象

需要实现java.io.Serializable接口进行序列化

package top.wuyongshi.model;
import java.io.Serializable;
import java.util.Date;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;@Table(name = "T_TASK")
public class TaskEntity implements Serializable {/*** 任务ID,32位uuid*/@Id@Column(name = "ID")@GeneratedValue(generator = "UUID")private String id;/*** 调度任务id*/@Column(name = "SCHEDULE_ID")private String scheduleId;/*** 任务名称*/@Column(name = "TASK_NAME")private String taskName;/*** 任务描述*/@Column(name = "TASK_DESC")private String taskDesc;/*** 任务频度描述||如月报、季报、年报*/@Column(name = "TASK_FREQUENTNESS")private String taskFrequentness;/*** 源连接池*/@Column(name = "SOURCE_POOL")private String sourcePool;/*** 目标连接池*/@Column(name = "TARGET_POOL")private String targetPool;/*** 任务创建者*/@Column(name = "TASK_CREATOR")private String taskCreator;/*** 任务创建时间*/
//    @JSONField(format = "yyyy-MM-dd HH:mm:ss")@Column(name = "CREATE_TIME")private Date createTime;/*** 任务修改者*/@Column(name = "TASK_MENDER")private String taskMender;/*** 任务修改时间*/
//    @JSONField(format = "yyyy-MM-dd HH:mm:ss")@Column(name = "TASK_UPDATE_TIME")private Date taskUpdateTime;/*** 任务参数  以json集合形式存储;类型为List<Map>*/@Column(name = "TASK_PARAMS")private String taskParams;/*** 超时时间,时间单位分钟,默认值 10分钟*/@Column(name = "LIMIT_TIME")private Integer limitTime;/*** 记录id,主要用于标记调度任务计划执行过程中,某次运行的记录id*/@Transientprivate String scheduleRecordId;private static final long serialVersionUID = 1L;/*** 获取 任务ID,32位uuid*/public String getId() {return this.id;}/*** 设置 任务ID,32位uuid*/public void setId(String id) {this.id = id;}/*** 获取 任务名称*/public String getTaskName() {return this.taskName;}/*** 设置 任务名称*/public void setTaskName(String taskName) {this.taskName = taskName;}/*** 获取 任务描述*/public String getTaskDesc() {return this.taskDesc;}/*** 设置 任务描述*/public void setTaskDesc(String taskDesc) {this.taskDesc = taskDesc;}/*** 获取 任务频度描述||如月报、季报、年报*/public String getTaskFrequentness() {return this.taskFrequentness;}/*** 设置 任务频度描述||如月报、季报、年报*/public void setTaskFrequentness(String taskFrequentness) {this.taskFrequentness = taskFrequentness;}/*** 获取 任务创建者*/public String getTaskCreator() {return this.taskCreator;}/*** 设置 任务创建者*/public void setTaskCreator(String taskCreator) {this.taskCreator = taskCreator;}/*** 获取 任务创建时间*/public Date getCreateTime() {return this.createTime;}/*** 设置 任务创建时间*/public void setCreateTime(Date createTime) {this.createTime = createTime;}/*** 获取 任务修改者*/public String getTaskMender() {return this.taskMender;}/*** 设置 任务修改者*/public void setTaskMender(String taskMender) {this.taskMender = taskMender;}/*** 获取 任务修改时间*/public Date getTaskUpdateTime() {return this.taskUpdateTime;}/*** 设置 任务修改时间*/public void setTaskUpdateTime(Date taskUpdateTime) {this.taskUpdateTime = taskUpdateTime;}/*** 获取 任务参数  以json集合形式存储;类型为List<Map>*/public String getTaskParams() {return this.taskParams;}/*** 设置 任务参数  以json集合形式存储;类型为List<Map>*/public void setTaskParams(String taskParams) {this.taskParams = taskParams;}/*** 获取 源连接池*/public String getSourcePool() {return this.sourcePool;}/*** 设置 源连接池*/public void setSourcePool(String sourcePool) {this.sourcePool = sourcePool;}/*** 获取 源连接池*/public String getTargetPool() {return this.targetPool;}/*** 设置 源连接池*/public void setTargetPool(String targetPool) {this.targetPool = targetPool;}/*** 获取 调度任务id*/public String getScheduleId() {return this.scheduleId;}/*** 设置 调度任务id*/public void setScheduleId(String scheduleId) {this.scheduleId = scheduleId;}/*** 获取 超时时间  时间单位分钟,默认值 10分钟*/public Integer getLimitTime() {
//        if (this.limitTime == null){
//            limitTime = 10;
//        }return this.limitTime;}/*** 设置 超时时间 时间单位分钟,默认值 10分钟*/public void setLimitTime(Integer limitTime) {this.limitTime = limitTime;}@Overridepublic String toString() {return "TaskEntity{" +"id='" + id + '\'' +", scheduleId='" + scheduleId + '\'' +", taskName='" + taskName + '\'' +", taskDesc='" + taskDesc + '\'' +", taskFrequentness='" + taskFrequentness + '\'' +", sourcePool='" + sourcePool + '\'' +", targetPool='" + targetPool + '\'' +", taskCreator='" + taskCreator + '\'' +", createTime=" + createTime +", taskMender='" + taskMender + '\'' +", taskUpdateTime=" + taskUpdateTime +", taskParams='" + taskParams + '\'' +", limitTime=" + limitTime +"} " + super.toString();}/*** 获取 记录id,主要用于标记调度任务计划执行过程中,某次运行的记录id*/public String getScheduleRecordId() {return this.scheduleRecordId;}/*** 设置 记录id,主要用于标记调度任务计划执行过程中,某次运行的记录id*/public void setScheduleRecordId(String scheduleRecordId) {this.scheduleRecordId = scheduleRecordId;}
}

web.xml配置hessian

  • 注意要将对外暴露的接口接口实现声明到配置文件中,接口可以缺省配置,这个网上的好多资料都比较坑,说多了都是泪…
  • 查看过HessianServlet其实就会注意到,它里面方法public void init(ServletConfig config)在实例化的时候默认会取的初始化参数名为home-class、service-class、object-class(接口实现类)、home-api、api-class、object-api(接口)
<servlet><servlet-name>hessianServlet</servlet-name><servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class><init-param><!--接口实现类,此处param-name可配置的名称有:home-class、service-class、object-class--><param-name>home-class</param-name><param-value>top.wuyongshi.service.impl.TaskRPCImpl</param-value></init-param><init-param><!--接口,param-name可配置的名称有:home-api、api-class、object-api(可不配置)--><param-name>home-api</param-name><param-value>top.wuyongshi.service.ITaskRPC</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>hessianServlet</servlet-name><url-pattern>/hessian</url-pattern></servlet-mapping>

客户端调用

先启动服务器端,浏览器访问配置的路径,出现以下图片内容,说明配置成功 

private String url;@Testpublic void testQueryAll() throws MalformedURLException {HessianProxyFactory factory = new HessianProxyFactory();url = "http://localhost:8088/HessianDemo2/hessian";
//        url = "http://localhost:8087/ScheduleTask/hessian";ITaskRPC taskRPC = (ITaskRPC) factory.create(ITaskRPC.class, url);List<TaskEntity> taskEntityPageInfo = taskRPC.queryAll();System.out.println(JSON.toJSONString(taskEntityPageInfo,true));List<String> strings = taskRPC.querySourcePools();for (String string : strings) {System.out.println(string);}}

测试结果

出处

文章首次发布于个人博客:吾勇士的博客http://wuyongshi.top/hessian-basic-use

Hessian的基本使用相关推荐

  1. Hessian源码分析(java)

    个人博客: 戳我,戳我 先扯一扯 前一篇博文Hessian通信案例(java)简单实现了Java版的Hessian客户端和服务端的通信,总体看来,实现起来比较简单,整个基于Hessian的远程调用过程 ...

  2. Hessian通信案例(java)

    个人博客: 戳我,戳我 前言 由于工作的原因,接触到了hessain,项目需要做hessain和xml之间的报文转换.但是对于hessian是个什么东西一头雾水.于是接下来的时间了解了hessain协 ...

  3. 化繁为简,一张图看懂梯度、散度、旋度、Jacobian、Hessian和Laplacian

    来源|王赟 Maigo@知乎,https://zhuanlan.zhihu.com/p/35323714 本文仅作学术分享,如有侵权,请联系后台作删文处理. 一.入门 图中的细实线箭头表示了四种一阶微 ...

  4. Hessian矩阵在XGBoost算法的应用小结

    来源:机器学习算法那些事本文约1100字,建议阅读5分钟 本文深入浅出的总结了Hessian矩阵在XGboost算法中的两种应用,即权重分位点算法和样本权重和算法 . 前言 Hessian矩阵最常见的 ...

  5. Spring整合Hessian

    Spring整合Hessian from:http://lavasoft.blog.51cto.com/62575/191871 Spring让Hessian变得不但强大,而且易用,但是易用背后,却有 ...

  6. 跨语言RPC框架Hessian、Thrift、Protocol Buffer之间的选择

    为什么80%的码农都做不了架构师?>>>    总结在几者之间选择的考量: 1. 如果你不需要很多语言相互调用, 希望保持清晰的java接口代码(无任何业务不相关的接口继承和方法,属 ...

  7. RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    RMI.Hessian.Burlap.Httpinvoker.WebService的比较 标签: webserviceservice数据结构spring通讯java 2011-08-24 16:46 ...

  8. Hessian RPC示例和基于Http请求的Hessian序列化对象传输

    本文主要介绍两个案例,第一个是使用Hessian来实现远程过程调用,第二个是通过Hessian提供的二进制RPC协议进行和Servlet进行数据交互,Hessian本身即是基于Http的RPC实现. ...

  9. Hessian的使用以及理解(转)

    Hessian的使用以及理解 Hessian版本:3.1.5 将包括如下的内容: Hessian的基本使用 Hessian的原理 Hessian和Spring 的结合使用 扩展 简单说来,Hessia ...

  10. hessian java php_探讨Hessian在PHP中的使用分析

    /** * 类名        : HessianApi * * 参考资料    : * 1.http://hessian.caucho.com/ ( Hessian主页 ) * 2.http://h ...

最新文章

  1. 江苏省计算机一级考试知识点总结,江苏省计算机一级考试注意要点1
  2. 用户态与内核态的区别
  3. Android 短视频拍摄、拍照滤镜 第三方库SDK
  4. 【Java】Volitile的作用、JVM规范如何要求内存屏障、硬件层级内存屏障如何帮助java实现高并发 - 第二天笔记
  5. 并发服务器设计思路,参考apache学习UDP和QoS,研究成果
  6. NPOI 教程 - 3.2 打印相关设置
  7. java content-length_为什么Content-Length HTTP头字段使用的值不是Java代码中给出的值?...
  8. python+selenium 实现完全控制浏览器
  9. (实测可用)GD32F303RCT6开发板移植RT-Thread操作系统(添加RTC时钟线程驱动DS1302时钟)
  10. SCHNOKA施努卡:锂电池密封性焊接质量视觉检测
  11. 32位qt程序, 利用32位mysql驱动,连接64位mysql8.0
  12. lnmp、lamp、lnmpa一键安装包(Updated: 2021-01-06)
  13. 高精度信号链电路精密模拟器件双轨供电方案
  14. 查询微信被谁投诉举报方法
  15. MATLAB 手把手教你如何将视频水彩风格化(简易版)
  16. android网络音乐播放器
  17. 经典:创业的100个成功经验方法谈
  18. linux开机启动任务和定时执行任务
  19. 输入名字显示其电话号码
  20. 一个陌生女人的来信-未完不续

热门文章

  1. JS基础 Array.concat()方法底层业务逻辑分析
  2. 阿里云esc服务器绑定域名及阿里云域名备案简单流程
  3. 虚拟化技术:实现资源高效利用和灵活管理的利器
  4. CTFHub-.DS_Store-wp
  5. 201803-1跳一跳 CCF (C语言)
  6. PTA浙大版《C语言程序设计(第3版)》习题4-8 高空坠球
  7. Gunicorn的安装与启动
  8. python高性能web框架排行榜_目前最受欢迎的12个Python web框架,你用过几个?
  9. java输入数组数据并保存到数组中(指定数组大小、不指定数组大小和直接输入数组)
  10. c语言 void swap,C语言的swap函数的易错点