比如当前有个需求,需要拦截dubbo的服务提供方或者服务消费方的方法,判断参数中是否包含某个关键字进行拦截阻止执行,那么我们可以通过使用dubbo的SPI机制通过实现Filter类来拦截,话不多说直接上代码:

1、新建一个类实现dubbo的Filter接口

/**
* 回滚任务Dubbo拦截正在回滚或备份小区的方法调用,阻止执行
* @author wl
* @date 2019-08-16 13:24
*/
@Activate(group={ Constants.PROVIDER, Constants.CONSUMER })
public class DubboRollbackTaskFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(DubboRollbackTaskFilter.class); private RedisTemplate redisTemplate; /**
* Filter中@Autowired会失效
* 使用dubbo自动注入redisTemplate类
* @param redisTemplate
*/
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
} public static final String ROLLBACK_READIS_KEY = "server_rollback_task_region_ids"; @Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
try {
String method = invocation.getMethodName();
String name = invoker.getInterface().getName();
Object[] args = invocation.getArguments();
String ageString = JSON.toJSONString(args);
// redis中获取数据
Object redisValues = redisTemplate.opsForValue().get(DubboRollbackTaskFilter.ROLLBACK_READIS_KEY);
logger.debug(">>>>>dubboRollbackTaskFilter-className:{},method:{},args:{},redisValues:{}", name, method, ageString, JSON.toJSONString(redisValues));
if (null != redisValues && redisValues.toString().trim().length() > 0) {
String[] regionIds = redisValues.toString().split(",");
for (String regionId : regionIds) {
if (regionId.trim().length() <= 0) {
continue;
}
// 只要包含当前有处理的小区,那么直接抛出参数异常
if (ageString.contains(regionId)) {
logger.info(">>>>>dubboRollbackTaskFilter-拦截:{},method:{},args:{},regionId:{}", name, method, ageString, regionId);
return new RpcResult(new IllegalArgumentException("回滚任务拦截提示:当前小区正在备份或回滚数据,一切操作不允许执行!"));
}
}
}
} catch (Exception e) {
// 拦截异常,不影响正常操作
logger.error(">>>>>dubboRollbackTaskFilter-异常", e);
}
return invoker.invoke(invocation);
}
}

2、META-INF下新建文件

  

  文件内容为:

dubboRollbackTaskFilter=com.qdingnet.pcloud.helper.utils.DubboRollbackTaskFilter

  至此就可以成功的拦截你想拦截的东西

3、下面解释几个点:

  1、关于@Activate,Activate注解表示一个扩展是否被激活,可以放在类定义和方法上,dubbo用它在spi扩展类定义上,表示这个扩展实现被激活。

    具体如何实现可以百度或看下(这篇文章

    如果不使用此注解可以直接在配置中添加

    1.1 比如配置中添加   dubbo.provider.filter =dubboServiceFilter

    1.2 或者在dubbo配置xml中添加 <dubbo:provider filter="xxxFilter" /> 或者 <dubbo:consumer filter="xxxFilter" /> 使Filter生效

  2、关于在Filter中使用@Resoure或@Autowired

    在dubbo拦截器中以上两个注解是不会生效的,我们可以用以下两种方式注入

    2.1 可以采取通过setter方式来注入其他的bean,就像最上面的代码示例

    2.2 通过Spring的ApplicationContextAware接口

      

    2.3 直接从Spring中取,ServiceBean.getSpringContext().getBean(clazz)

  3、说说拦截的invoke返回方式

    如果想直接返回自定义的拦截,直接使用dubbo提供的RpcResult,然后将异常作为参数传给此类进行返回

dubbo中拦截生产者或消费者服务方法调用的更多相关文章

  1. dubbo源码分析2-reference bean发起服务方法调用

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  2. Java中的生产者、消费者问题

    Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...

  3. java多线程中的生产者与消费者之等待唤醒机制@Version1.0

    一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notify ...

  4. Java中的生产者和消费者实例(多线程 等待唤醒机制)

    1.什么是等待唤醒 我们实现的效果 创建生产者和消费者  对服装进行生产  和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...

  5. Linux内核中实现生产者与消费者(避免无效唤醒)【转】

    转自:http://blog.csdn.net/crazycoder8848/article/details/42581399 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...

  6. dubbo+zookeeper下生产者和消费者配置(基于springboot开发)

    一.总共分为三个目录: dubbo-api      服务的接口用于对接客户端和服务端 dubbo-client     客户端配置文件为:consumer.xml dubbo-service  服务 ...

  7. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

  8. Android中使用ContentProvider进行跨进程方法调用

    原文同一时候发表在我的博客 点我进入还能看到很多其它 需求背景 近期接到这样一个需求,须要和别的 App 进行联动交互,比方下载器 App 和桌面 App 进行联动.桌面的 App 能直接显示下载器 ...

  9. java多线程中的生产者与消费者之等待唤醒机制@Version2.0

    二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...

随机推荐

  1. net core 接受post值

    public static string GetPostParams(HttpContext context) { string param = string.Empty; if (context.R ...

  2. java+struts上传文件夹文件

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  3. 【bzoj1059】[ZJOI2007]矩阵游戏

    *题目描述: 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: ...

  4. 两类特殊的Nim游戏:Nim-K游戏与反Nim游戏

    Nim-K游戏 描述 有\(n\)堆石子,每次可从\(k\)堆石子中拿走任意数量的石子. 两个人轮流拿,谁不能拿谁输. 先手必胜条件 把\(n\)堆石子的石子数用二进制表示,统计每一个二进制位上\(1 ...

  5. Card Game Cheater

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. wannafly 挑战赛9 B 数一数(kmp)

    链接:https://www.nowcoder.com/acm/contest/71/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...

  7. [CSP-S模拟测试]:优化(贪心+DP)

    题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连 ...

  8. CDH安装时,部分节点不受管控

    解决方案: /opt/cm-5.12.0/etc/init.d/cloudera-scm-agent stop cd /opt/cm-5.12.0/lib/cloudera-scm-agent/ rm ...

  9. nodejs 简单的搭建一个服务器

    前言: nodejs 主要是后台语言  node 是在终端运行的,所以他可以进行 dos 命令 模块 自定义 JavaScript 是前台语言 nodejs 是 也是使用我们的 JavaScript ...

  10. tensorflow 分布式搭建

    https://blog.csdn.net/qq_40652148/article/details/80467131 https://yq.aliyun.com/articles/602111 git ...