Spring Integration Publisher

考虑一个假设的要求–您的应用程序中有一个服务类,并且想要捕获有关此服务调用的一些信息:

@Service
public class SampleBean {private static final Logger logger = LoggerFactory.getLogger(SampleBean.class);public Response call(Request request) {logger.info("SampleBean.call invoked");return new Response(true);}
}

AOP非常适合这种需求,它允许干净地捕获方法调用(切入点)周围的信息,并使用此信息进行一些处理(建议):

public class AuditAspect {private static final Logger logger = LoggerFactory.getLogger(AuditAspect.class);@Pointcut("execution( * core.SampleBean.call(model.Request)) && args(r)")public void beanCalls(Request r){}@Around("beanCalls(r)")public Object auditCalls(ProceedingJoinPoint pjp, Request r) {logger.info("Capturing request: " + r);try{Object response = pjp.proceed();logger.info("Capturing response: " + response);return response;}catch(Throwable e) {throw new RuntimeException(e);}}
}

这似乎足够好。 现在,如果我想立即将响应返回给客户端,但继续处理方法调用的上下文,该怎么办?我们可以使用ThreadPool将Advice的逻辑放在单独的线程中。 现在让我增加另一层复杂性,如果我们要绝对确保不丢失上下文,该怎么办?一个好的方法是将方法调用的上下文保留在JVM之外,通常像RabbitMQ和ActiveMQ这样的消息传递提供者将非常适合

考虑到这些额外的要求,一个更简单的解决方案(尤其是在正在使用消息传递场景的情况下)将使用Spring Integration。 让我们首先定义一个新的Spring Integration应用程序上下文:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><annotation-config/><channel id="tobeprocessedlater"/><logging-channel-adapter channel="tobeprocessedlater" log-full-message="true"/></beans:beans>

它只是具有一个通道的定义,以及一个出站适配器,该适配器从该通道读取并记录完整的消息。 为了捕获对SampleBean的调用的上下文,可以将Publisher注释添加到SampleBean的相关方法,该方法将“东西”定向到添加到注释的通道。

@Service
public class SampleBean {private static final Logger logger = LoggerFactory.getLogger(SampleBean.class);@Publisher(channel = "tobeprocessedlater")public Response call(@Header("request") Request request) {logger.info("SampleBean.call invoked");return new Response(true);}
}

通过附加注释指定将什么“东西”发送到此“ tobeprocessedlater”信道–默认情况下,该方法的返回值发送到该信道,此外,我还使用@Header注释标记了请求,这将使请求作为响应消息的头发送。 为了完整起见,集成上下文具有一个<annotation-config />标记,该标记注册寻找@Publisher注释的相关组件,并在发现一个组件时将其织入要执行的其他操作中。

如果现在执行此代码,则输出将遵循以下几行:

core.SampleBean - SampleBean.call invoked
o.s.integration.handler.LoggingHandler - [Payload=Response{success=true}][Headers={request=RequestType1{attr='null'}, id=52997b10-dc8e-e0eb-a82a-88c1df68fca5, timestamp=1389268390212}]

现在,为了满足第一个需求,在单独的执行线程中处理建议(在本例中为日志记录):

只需更改配置即可完成! –在此示例中,我选择使用执行者通道,而不是将消息发布到直接通道,而是将其发布为可以缓冲消息或使用执行程序来分派消息的通道类型:

<channel id="tobeprocessedlater"><dispatcher task-executor="taskExecutor"/></channel>

现在,为了增加将异步消息处理发布到外部消息传递提供程序(并稍后处理消息)以使其更加可靠的要求,让我通过将消息发布到RabbitMQ进行演示,代码更改再次是纯配置,代码中没有任何变化!:

<channel id="tobeprocessedlater"/><int-amqp:outbound-channel-adapter amqp-template="amqpTemplate" channel="tobeprocessedlater"  />

消息传递接收器可以是任何东西–数据库,文件系统,ActiveMQ,而需要进行的更改是纯配置。

参考: all和其他博客中的JCG合作伙伴 Biju Kunjummen的Spring Integration Publisher 。

翻译自: https://www.javacodegeeks.com/2014/01/spring-integration-publisher.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ - 1125(Stockbroker Grapevine)

Stockbroker Grapevine 题目链接&#xff1a; http://poj.org/problem?id1125 题目&#xff1a; Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 39459 Accepted: 22024Description Stockbrokers are known to overreact to rumours. You have been contracted t…

php开发微信图灵机器人

本着开源为原则&#xff0c;为这个世界更美好作出一份共享&#xff0c;我就给大家做个指路人&#xff0c;如果实用&#xff0c;记得给提供开源的朋友一些鼓励。 简单介绍一下实现思路&#xff0c;使用swoole扩展接管php运行&#xff0c;由于swoole只能在类UNIX上运行&#xff0…

jQuery源码的基础知识

序言&#xff1a;DOM addEventListener attachEvent与addEventListener区别适应的浏览器版本不同&#xff0c;同时在使用的过程中要注意attachEvent方法 按钮onclickaddEventListener方法 按钮click一、arguments对象&#xff1a; 1、arguments 属性 为当前执行…

python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...

数据库数据导出为excel表格&#xff0c;也可以说是一个很常用的功能了。毕竟不是任何人都懂数据库操作语句的。 下面先来看看完成的效果吧。 数据源导出结果依赖 由于是Python实现的&#xff0c;所以需要有Python环境的支持 Python2.7.11 我的Python环境是2.7.11。虽然你用的可…

android手机连接无线路由器上网设置,手机连接无线网络怎么设置?手机Wifi无线网设置教程...

随着智能手机无线上网的流行&#xff0c;如今很多家庭都会组建Wifi无线网络&#xff0c;目前组建Wifi网络&#xff0c;大致有两种情况&#xff0c;一种是使用无线路由器&#xff0c;另外一种是将笔记本变身无线无路由器&#xff0c;从而实现智能手机也可以免费Wifi上网&#xf…

Spring XD 1.0.0.M5在这里!

Spring XD宣布发布Spring XD 1.0.0.Milestone 5 。 您可以从这里下载。 根据发布的Spring XD 1.0.0.M5 &#xff0c;Spring XD是用于实时分析&#xff0c;批处理&#xff0c;数据注入和数据导出的统一&#xff0c;分布式和可扩展系统。 1.0.0.Milestone 5版本提供了解决大数据问…

通俗易懂了解Vuex

1.前言 在使用Vue进行开发的时候&#xff0c;关于vue组件通信的方式&#xff0c;除了通俗易懂了解Vue组件的通信方式这篇博文谈到三种通信方式&#xff0c;其实vue更提倡我们使用vuex来进行组件间的状态管理以及通信问题。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。…

jQuery源码分析

(function( window, undefined ) {// jquery code})(window);这是一个自调用匿名函数。什么东东呢&#xff1f;在第一个括号内&#xff0c;创建一个匿名函数&#xff1b;第二个括号&#xff0c;立即执行为什么要创建这样一个“自调用匿名函数”呢&#xff1f; 通过定义一个匿名…

netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构

(给DotNet加星标&#xff0c;提升.Net技能)英文&#xff1a;samueleresca.net译文&#xff1a;cnblogs.com/Rwing/p/fast-growing译者&#xff1a;Rwing本篇文章的第一部分介绍了有关Serverless计算的基本概念。第二部分展示了如何构建 .NET Core的Lambda函数&#xff0c;其中使…

更多Requests的小技巧以及总结

对于requests的爬虫库&#xff0c;我们已经学到了尾声。 我们在这儿可以挖掘出更多的requests的使用小技巧。 一.cookie对象与字典的转换 在爬取目标cookie的时候&#xff0c;我们可以将cookie信息进行简化处理。 现在做一个简单的代码验证看看&#xff0c;使用百度的cookies&a…

进入Undertow Web服务器

随着Java EE 7的到来以及处理诸如Web Sockets API和HTTP升级&#xff08;例如EJB over HTTP&#xff09;之类的高级功能的要求&#xff0c;WildFly开发团队已经做出了重要决定。 在长期致力于JBoss Web服务器&#xff08;Apache Tomcat的一个分支&#xff09;之后&#xff0c;新…

HTTPHandler有什么作用

一 asp.net请求的处理过程&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;Http…

centos 重启网卡_CentOS6 网络管理之网卡配置及简单路由设置

CentOS6中关于网络配置的命令有很多&#xff0c;本文将介绍几个平时最长用的几个命令&#xff0c;以及网卡IP地址的配置和简单路由配置。1、经常使用的查看IP地址命令为 ifconfig&#xff0c;不跟参数的情况下默认查看所有已启用的网卡信息&#xff0c;如下图所示&#xff1a;如…

绝地求生 android版支持蓝牙吗,《绝地求生》吃鸡必须要顶配吗?这些配置也能畅玩...

导读《绝地求生》火爆之余&#xff0c;很多人在想要加入这款游戏时&#xff0c;却被游戏传闻中的超高配置要求给吓到了&#xff0c;然后心生退意。事实上&#xff0c;吃鸡的配置要求真的这么高吗&#xff1f;其实并不是&#xff01;传言1&#xff1a;8G内存不能玩这则传言的说法…

《美团机器学习实践》高清PDF+思维导图+美团算法团队

在美团的搜索、推荐、计算广告、风控、图像处理等领域&#xff0c;相关的人工智能技术得到广泛的应用。《美团机器学习实践》包括通用流程、数据挖掘、搜索和推荐、计算广告、深度学习以及算法工程6大部分内容&#xff0c;全面介绍了美团在多个重要方面对机器学习的应用。通过本…

如何使用HttpModule来实现我们日常的应用:

1、向每个页面动态添加一些备注或说明性的文字&#xff1a; 有的网站每一个页面都会弹出一个广告或在每个页面都以注释形式&#xff08;<!-- -->&#xff09;加入网站的版权信息。如果在每个页面教编写这样的JS代码的话&#xff0c;对于大一点的网站&#xff…

Java 8中的java.util.Random

Java 8中java.util.Random类的简洁功能之一是对其进行了改进&#xff0c;现在可以返回随机的数字流 。 例如&#xff0c;要生成一个介于0&#xff08;含&#xff09;和1&#xff08;不含&#xff09;之间的随机双精度数的无限流&#xff1a; Random random new Random(); Do…

appium判断元素是否存在_Python+selenium自动化之判定元素是否存在

在测试过程中&#xff0c;我碰到过这类的问题&#xff0c;使用find_element却找不到某个元素而产生异常&#xff0c;这就需要在操作某个元素之前判定该元素是否存在&#xff0c;而selenium中没有判定元素是否存在的方法&#xff0c;或者判定相同的元素有几个&#xff0c;需要操…

棋盘DP三连——洛谷 P1004 方格取数 洛谷 P1006 传纸条 Codevs 2853 方格游戏

P1004 方格取数 题目描述 设有N $\times N$NN的方格图(N $\le 9$)(N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字00。如下图所示&#xff08;见样例&#xff09;: A0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 …

html一张图片用两种滤镜,HTML图片CSS滤镜—灰度效果

this.p{ m:2,b:2,loftPermalink:,id:fks_082065087087086069087082087095083084084067083083082065,blogTitle:HTML图片CSS滤镜—灰度效果,blogAbstract: ,blogTag:html,blogUrl:blog/static/72507542200941384735902,isPublished:1,istop:false,type:2,modifyTime:13288029920…