RPC异常处理概述
RPC异常处理指是,当客户端调用远端的服务,如果服务执行过程中发生异常,这个异常能否序列到客户端?
如果服务在执行过程中可能发生异常,那么在服务接口的声明中,就该声明该接口可能抛出的异常。
在Hessian中,服务器端发生异常,可以将异常信息从服务器端序列化到客户端,因为Exception本身是实现了Serializable的,因此,我们在自定义异常时,不需要显式的让自定义的
异常实现Serializable接口
举例
继续以【RPC框架Hessian二】中的代码为例,修改服务的save方法,刻意的让服务器端的代码抛出异常(抛出的是运行时异常,受检异常与此类似)
package com.tom.hessian.server; import com.tom.hessian.common.ComplexModel; import com.tom.hessian.common.IComplexModelService; import java.util.HashMap; import java.util.Map; /** * Created by tom on 14-9-2. */ public class ComplexModelService implements IComplexModelService { private Map<Integer,ComplexModel> models = new HashMap<Integer, ComplexModel>(); @Override public void save(ComplexModel model) { if (model.getId() == null){ throw new IllegalArgumentException("id could not be null"); } if (model.getId() == 1) { //客户端的model的id为1,因此会发生unchecked exception throw new IllegalArgumentException("id could not be 1"); } models.put(model.getId(), model); } @Override public ComplexModel read(Integer modelId) { return models.get(modelId); } }
当客户端的model的id为1时,调用save方法,抛出
if (model.getId() == 1) { //客户端的model的id为1,因此会发生unchecked exception throw new IllegalArgumentException("id could not be 1"); }
此时服务器端没有抛出异常,而客户端抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: id could not be 1 at com.tom.hessian.server.ComplexModelService.save(ComplexModelService.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:302) at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:198) at com.caucho.hessian.server.HessianServlet.invoke(HessianServlet.java:399) at com.caucho.hessian.server.HessianServlet.service(HessianServlet.java:379) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:324) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:842) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Hessian服务器端异常处理源代码分析
在Hessian的HessianSkeleton类的invoke方法中,通过反射调用服务代码:
try { result = method.invoke(service, values); //调用的服务端类、参数和方法 } catch (Exception e) { //捕获异常 Throwable e1 = e; if (e1 instanceof InvocationTargetException) e1 = ((InvocationTargetException) e).getTargetException(); log.log(Level.FINE, this + " " + e1.toString(), e1); out.writeFault("ServiceException", escapeMessage(e1.getMessage()), e1);//将异常信息序列到客户端 out.close(); return; }
相关推荐
本篇将深入探讨RPC框架的底层模拟,主要围绕以下几个核心概念进行讨论: 1. **服务接口与实现**: 在`HelloService.java`中定义了服务接口,如`sayHello(String name)`方法,而`HelloServiceImpl.java`则是该接口...
在实现过程中,你可能会遇到如网络编程、线程模型、协议设计、异常处理等问题,这些都是构建RPC框架时需要考虑的关键点。通过这个项目,你可以深入理解RPC的工作原理,同时提升对Netty框架的应用能力。
Hessian,由Caucho Technology开发,是一款轻量级、高效的RPC框架,它基于HTTP协议,以二进制格式传输数据,从而降低了网络通信的开销。本文将深入探讨Hessian在RPC实现中的原理、特点以及如何在实际项目中应用。 ...
本项目旨在通过深入研究Netty和Zookeeper来构建一个类似Dubbo的RPC框架,从而帮助开发者更好地理解和实践分布式服务调用。 Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器...
本文主要讨论的是如何将Hessian RPC与RMI技术整合到Structs、Spring、Hibernate和Ibatis这四个关键的Java开发框架中,以构建一个高效、灵活的分布式应用程序。 1. **Hessian配置说明**: Hessian的配置通常涉及...
本篇文章将深入探讨RPC框架的核心概念、工作原理以及QiuRPC框架的相关知识。 一、RPC框架基础 1. **核心概念**: - **客户端(Client)**:发起远程调用的一方,通常执行业务逻辑,需要调用远程服务。 - **服务...
在异常处理方面,Dubbo引入了熔断机制,通过Hystrix或者Sentinel等组件,可以防止服务雪崩,保护系统稳定性。当调用链路出现故障时,熔断器会快速失败并返回错误,减少对整个系统的冲击。 总的来说,基于Dubbo的RPC...
在这个"最简单的RPC框架源码"中,我们可以深入理解RPC的基本原理和实现机制。本文将详细讲解RPC框架的关键组成部分以及它们在Java中的应用。 首先,我们要明白RPC的核心思想:本地调用的感觉。在RPC框架中,客户端...
3. RPC框架的工作机制:RPC框架允许一个应用调用另一个地址空间(通常是远程)中的方法。它主要依赖于网络通信、数据序列化和反序列化、动态代理、服务注册与发现等机制。 4. Java NIO(New I/O):NIO是Java提供的...
RPC框架使得分布式系统中的不同服务能够透明地调用彼此的功能,仿佛它们都在同一个进程中运行。以下是一些关于如何设计这样一个框架的关键知识点,以及相关的架构考虑。 1. **理解RPC原理**:首先,要构建RPC框架,...
常见的Java RPC框架有Hessian、Dubbo、gRPC等,它们都提供了自动序列化、网络传输、服务发现等核心功能。 项目结构可能包括以下部分: 1. **服务端**:实现阶乘计算的业务逻辑,创建一个服务接口,定义计算阶乘的...
分析RPC调用的完整流程,学习如何处理异常和超时。 总结来说,Dubbo作为一款强大的RPC框架,它的设计和实现涉及到了服务治理的多个重要方面。通过对Dubbo的深入学习和源码分析,我们可以提升分布式系统的设计和运维...
RPC框架的研究,主要是Hessian和其它框架的对比,从性能、易用性等方面着手分析。
常见的RPC框架有Dubbo、gRPC、Hessian、Thrift等。这些框架提供了高性能、低延迟的通信机制,例如HTTP/2、TCP自定义协议等。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,...
6. **调用处理(Invocation Handler)**:处理远程调用的细节,如超时控制、异常处理等。 在Hessian框架中,它是一种二进制的Web服务协议,提供了一种轻量级的RPC方式。Hessian协议的优点在于其高效的数据编码,...
三、nfs-rpc框架特点 1. 高性能:通过优化通信协议和序列化方式,nfs-rpc力求提供低延迟、高吞吐量的RPC服务。 2. 易用性:提供简洁的API,方便开发者快速集成和使用。 3. 可扩展性:支持服务插件扩展,如监控、限...
在Java中,RPC框架如Hessian、Dubbo、gRPC等已经非常成熟,而nfs-rpc可能是针对特定场景或需求进行优化的版本。这里我们将深入探讨基于Java的RPC框架设计与实现的关键技术点。 1. **序列化与反序列化**:在RPC调用...
HARPC(High Availability RPC)是基于Thrift的跨语言、高可用的RPC框架。具备高性能、高可用、轻量级等特点 * 跨语言通信 * 方便的使Java、Python、C++三种程序可以相互通信 * 负载均衡和容灾处理 * 方便的实现...
本实例重点探讨的是基于Spring框架和Hessian协议的Web Service实现,这是一种轻量级、高效的远程调用解决方案。 首先,我们要理解Spring框架。Spring是Java领域的一个核心框架,它提供了全面的编程和配置模型,用于...
Hessian是一种高效的二进制序列化协议,常...总之,Hessian作为一个高效的RPC框架,其不同版本在功能、性能和兼容性上有所不同。通过下载并了解这些版本,开发者可以更好地满足项目需求,实现高效、安全的数据交换。