`
bit1129
  • 浏览: 1070079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【RPC框架Hessian三】Hessian 异常处理

 
阅读更多

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;
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
0
分享到:
评论
1 楼 kidding87 2014-09-03  
在Hessian中,服务器端发生异常,可以将异常信息从服务器端序列化到客户端,因为Exception本身是实现了Serializable的,因此,我们在自定义异常时,不需要显式的让自定义的

异常实现Serializable接口


Serializable表明jdk实现的序列化

hessian自身有序列化协议+Http传输

相关推荐

    RPC框架底层模拟

    本篇将深入探讨RPC框架的底层模拟,主要围绕以下几个核心概念进行讨论: 1. **服务接口与实现**: 在`HelloService.java`中定义了服务接口,如`sayHello(String name)`方法,而`HelloServiceImpl.java`则是该接口...

    基于netty的手写rpc框架

    在实现过程中,你可能会遇到如网络编程、线程模型、协议设计、异常处理等问题,这些都是构建RPC框架时需要考虑的关键点。通过这个项目,你可以深入理解RPC的工作原理,同时提升对Netty框架的应用能力。

    hessian轻量级 rpc实现

    Hessian,由Caucho Technology开发,是一款轻量级、高效的RPC框架,它基于HTTP协议,以二进制格式传输数据,从而降低了网络通信的开销。本文将深入探讨Hessian在RPC实现中的原理、特点以及如何在实际项目中应用。 ...

    自定义rpc框架

    本项目旨在通过深入研究Netty和Zookeeper来构建一个类似Dubbo的RPC框架,从而帮助开发者更好地理解和实践分布式服务调用。 Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器...

    Hessian RPC-RMI技术 整合Structs Spring Hibernate Ibatis

    本文主要讨论的是如何将Hessian RPC与RMI技术整合到Structs、Spring、Hibernate和Ibatis这四个关键的Java开发框架中,以构建一个高效、灵活的分布式应用程序。 1. **Hessian配置说明**: Hessian的配置通常涉及...

    RPC 框架学习 好的参考学习

    本篇文章将深入探讨RPC框架的核心概念、工作原理以及QiuRPC框架的相关知识。 一、RPC框架基础 1. **核心概念**: - **客户端(Client)**:发起远程调用的一方,通常执行业务逻辑,需要调用远程服务。 - **服务...

    基于dubbo实现的rpc框架RPC 框架

    在异常处理方面,Dubbo引入了熔断机制,通过Hystrix或者Sentinel等组件,可以防止服务雪崩,保护系统稳定性。当调用链路出现故障时,熔断器会快速失败并返回错误,减少对整个系统的冲击。 总的来说,基于Dubbo的RPC...

    最简单的RPC框架源码.zip

    在这个"最简单的RPC框架源码"中,我们可以深入理解RPC的基本原理和实现机制。本文将详细讲解RPC框架的关键组成部分以及它们在Java中的应用。 首先,我们要明白RPC的核心思想:本地调用的感觉。在RPC框架中,客户端...

    如何用Netty写一个自己的RPC框架

    3. RPC框架的工作机制:RPC框架允许一个应用调用另一个地址空间(通常是远程)中的方法。它主要依赖于网络通信、数据序列化和反序列化、动态代理、服务注册与发现等机制。 4. Java NIO(New I/O):NIO是Java提供的...

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    RPC框架使得分布式系统中的不同服务能够透明地调用彼此的功能,仿佛它们都在同一个进程中运行。以下是一些关于如何设计这样一个框架的关键知识点,以及相关的架构考虑。 1. **理解RPC原理**:首先,要构建RPC框架,...

    java基于RPC框架的阶乘计算客户端与服务端

    常见的Java RPC框架有Hessian、Dubbo、gRPC等,它们都提供了自动序列化、网络传输、服务发现等核心功能。 项目结构可能包括以下部分: 1. **服务端**:实现阶乘计算的业务逻辑,创建一个服务接口,定义计算阶乘的...

    Dubbo RPC框架原理解析和源码

    分析RPC调用的完整流程,学习如何处理异常和超时。 总结来说,Dubbo作为一款强大的RPC框架,它的设计和实现涉及到了服务治理的多个重要方面。通过对Dubbo的深入学习和源码分析,我们可以提升分布式系统的设计和运维...

    RPC框架的研究报告

    RPC框架的研究,主要是Hessian和其它框架的对比,从性能、易用性等方面着手分析。

    RPC框架+json+反射+注解annonation

    常见的RPC框架有Dubbo、gRPC、Hessian、Thrift等。这些框架提供了高性能、低延迟的通信机制,例如HTTP/2、TCP自定义协议等。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,...

    myRpc一个极简单的RPC框架

    6. **调用处理(Invocation Handler)**:处理远程调用的细节,如超时控制、异常处理等。 在Hessian框架中,它是一种二进制的Web服务协议,提供了一种轻量级的RPC方式。Hessian协议的优点在于其高效的数据编码,...

    基于java的高性能RPC框架 nfs-rpc.zip

    三、nfs-rpc框架特点 1. 高性能:通过优化通信协议和序列化方式,nfs-rpc力求提供低延迟、高吞吐量的RPC服务。 2. 易用性:提供简洁的API,方便开发者快速集成和使用。 3. 可扩展性:支持服务插件扩展,如监控、限...

    基于Java的源码-高性能RPC框架 nfs-rpc.zip

    在Java中,RPC框架如Hessian、Dubbo、gRPC等已经非常成熟,而nfs-rpc可能是针对特定场景或需求进行优化的版本。这里我们将深入探讨基于Java的RPC框架设计与实现的关键技术点。 1. **序列化与反序列化**:在RPC调用...

    java写非常不错的RPC框架,基于Thrift

    HARPC(High Availability RPC)是基于Thrift的跨语言、高可用的RPC框架。具备高性能、高可用、轻量级等特点 * 跨语言通信 * 方便的使Java、Python、C++三种程序可以相互通信 * 负载均衡和容灾处理 * 方便的实现...

    基于spring+hessian框架的webservice实例

    本实例重点探讨的是基于Spring框架和Hessian协议的Web Service实现,这是一种轻量级、高效的远程调用解决方案。 首先,我们要理解Spring框架。Spring是Java领域的一个核心框架,它提供了全面的编程和配置模型,用于...

    Hessian多个版本打包下载

    Hessian是一种高效的二进制序列化协议,常...总之,Hessian作为一个高效的RPC框架,其不同版本在功能、性能和兼容性上有所不同。通过下载并了解这些版本,开发者可以更好地满足项目需求,实现高效、安全的数据交换。

Global site tag (gtag.js) - Google Analytics