Dubbo应用与异常记录

结合项目里使用暴露出的问题,对并发较多的核心业务或者对请求失败等敏感的业务场景不太建议使用Dubbo,

如电商的购买等行为,使用Dubbo就必须阅读源码,熟悉相关机制,或者直接自己造轮子。

1.使用Dubbo踩过的坑

(1)Spring Cache在Service层对消费者不起作用
原因是:Spring容器还未加载完,就在Dubbo中暴露服务导致Cache的AOP不可用。因此需要将服务放在Spring容器加载完后再暴露。

(2)Dubbo对方法重载支持有问题

如果让hessian支持调用重载方法需要isOverloadEnabled()设为false。

2.Dubbo常见异常和错误

(1)调用超时com.alibaba.dubbo.remoting.TimeoutException异常
通常是业务处理太慢,可在服务提供方执行:jstack PID > jstack.log 分析线程都卡在哪个方法调用上,这里就是慢的原因。
如果不能调优性能,请将timeout设大。

(2)出现java.util.concurrent.RejectedExecutionException或者Thread pool exhausted

RejectedExecutionException表示线程池已经达到最大值,并且没有空闲连,拒绝执行了一些任务。
Thread pool exhausted通常是min和max不一样大时,表示当前已创建的连接用完,进行了一次扩充,创建了新线程,但不影响运行。
原因可能是连接池不够用,请调整dubbo.properites中的:


1

2

3

// 设成一样大,减少线程池收缩开销

dubbo.service.min.thread.pool.size=200

dubbo.service.max.thread.pool.size=200

  

3.dubbo如何正确关闭Spring容器

Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用"kill -9 PID"等强制关闭指令,是不会执行优雅停机的,只有通过"kill PID"时,才会执行。
服务提供方停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。
然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
服务消费方停止时,不再发起新的调用请求,所有新的调用在客户端即报错。
然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
设置优雅停机超时时间,缺省超时时间是10秒:(超时则强制关闭)


1

2

3

<dubbo:application ...>

    <dubbo:parameter key="shutdown.timeout" value="60000" /> <!-- 单位毫秒 -->

</dubbo:application>

看一下源码实现:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

if ("true".equals(System.getProperty("dubbo.shutdown.hook"))) {

        Runtime.getRuntime().addShutdownHook(new Thread() {

          public void run() {

            for (Container container : this.val$containers) {

              try {

                container.stop();

                Main.logger.info("Dubbo " + container.getClass().getSimpleName() + " stopped!");

              catch (Throwable t) {

                Main.logger.error(t.getMessage(), t);

              }

              synchronized (Main.class) {

                Main.access$102(false);

                Main.class.notify();

              }

            }

          }

        });

      }

 

时间: 2024-09-24 09:49:38

Dubbo应用与异常记录的相关文章

dubbo调用时报异常channel is closed

问题描述 dubbo调用时报异常channel is closed DUBBO服务消费方调用时报如下异常,一般是什么原因导致的? com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed 解决方案 OK了 原来是网络不通 从服务消费方到服务提供方网络问题

Android实现异常记录并重启程序

异常捕获主要是在全局的Application中来处理的,Android提供了一个CrashHandler用来进行错误处理. intent添加 "Intent.FLAG_ACTIVITY_NEW_TASK" 标记的原因是--Content的startActivity方法,需要开启一个新的task.如果使用 Activity的startActivity方法,不会有任何限制,因为Activity继承自Context,重载了startActivity方法.所以如果是context启动Activ

MySQL应用的异常记录

Error Code: 1045. Access denied for user 'test'@'%' (using password: YES) 使用MySQL的select * into outfile '/tmp/rs.txt' from tb_name来导出结果时遇到这个问题, 当前用户虽然拥有全部权限,但是file权限需要单独赋予,使用root用户执行: 1 grant file on *.* to test@localhost; Error Code: 1093. You can't

hadoop 异常记录 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times

当我把hadoop.hbase安装配置(具体参考这里)好了之后,启动hbase的shell交互模式,输入命令却出现了下面这样的错误: ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times 这是为什么呢,Master为什么没有启动起来呢? 查看logs目录下的Master日志,发现有以下信息: 2012-02-01 14:41:52,867 FATAL org.apache.hadoop.hbase.ma

oracle记录一次存储异常数据库恢复后遗症ORA-600[kafspa:columnBuffer1]错误处理

先说下前提,这个库以前是由于存储异常,找硬件厂商做了raid重组,然后我进行数据恢复的,恢复出来数据之后,应用厂商通过验证和补数据,然后迁移到另外一台机器做生产用的,这个库一直没有怎么看,最近检查数据库发现ORA-600[kafspa:columnBuffer1]错误,通过删除异常记录的方式解决. 数据库alert日志 Mon Aug 10 00:00:21 2015 LNS: Standby redo logfile selected for thread 1 sequence 617 for

PHP中错误与异常的日志记录用法分析_php技巧

本文分析了PHP中错误与异常的日志记录用法.分享给大家供大家参考,具体如下: 提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方式来安装,其自有一套较为合理的的配置文件可用.再者运行的应用程序中的配置也会影响到日志记录的方式及内容. 错误与异常的区别 关于错误

AOP记录异常邮件发送记录

一般我们的异常都会抛出到控制层,如果使用struts2也就是action.然后try{//正确代码实现}catch{//在里面记录错误日志},这样咋一看是不错,代码很完美.但是如果项目中有成千上万个项目怎么办?难道在每个action的catch里面都要加入异常记录代码?很显然工作量是很大的.7 `, X, R" [  \1 [2 D 0 S+ I4 X, f& F) \, L  C/ Y$ t; P6 ~# Q4 g- Q4 v) H" M       鉴于项目中配置了数据库事

浅谈Java应用异常使用简单原则

定义异常: 尽量给自己应用量身定制一套异常类,反应各种不同的错误,以便构建统一的.健壮的API. 应用每层定义统一的接口异常类,而不是简单抛出来自实现遇到的异常,否则实现一经改变,原来的异常可能会变化,接口可能也需要跟着更改. 给每个异常和错误定义统一的标识,如错误码,方便根据错误码找到详细的错误信息以及支持国际化,方便统一的异常处理框架. 抛出异常: 如果一个异常是致命的,不可恢复的,或者调用者去捕获它没有任何益处,使用unChecked异常. 如果一个异常是可以恢复的,可以被调用者正确处理的

《Java程序员面试秘笈》—— 1.9 线程中不可控异常的处理

1.9 线程中不可控异常的处理 在Java中有两种异常. ◆ 非运行时异常(Checked Exception):这种异常必须在方法声明的throws语句指定,或者在方法体内捕获.例如:IOException和ClassNotFoundException. ◆ 运行时异常(Unchecked Exception):这种异常不必在方法声明中指定,也不需要在方法体中捕获.例如:NumberFormatException. 因为run()方法不支持throws语句,所以当线程对象的run()方法抛出非