spring rmi_Spring集成–使用RMI通道适配器

spring rmi

1.引言

本文介绍了如何使用Spring Integration RMI通道适配器通过RMI发送和接收消息。 它由以下部分组成:

  • 实施服务:第一部分着重于创建和公开服务。
  • 实现客户端:显示如何使用MessagingTemplate类调用服务。
  • 抽象SI逻辑:最后,我添加了另一部分,解释了如何实现抽象所有Spring Integration代码的相同客户端,而使客户端专注于其业务逻辑。

您可以在github上获取源代码。

2.实施服务

第一部分非常简单。 该服务是通过注释定义的,因此它将通过组件扫描自动检测。 它注入了一个存储库,该存储库从嵌入式数据库获取数据,这将在同一部分中显示:

@Service("defaultEmployeeService")
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeRepository employeeRepository;@Overridepublic Employee retrieveEmployee(int id) {return employeeRepository.getEmployee(id);}
}

存储库如下:

@Repository
public class EmployeeRepositoryImpl implements EmployeeRepository {private JdbcTemplate template;private RowMapper<Employee> rowMapper = new EmployeeRowMapper();private static final String SEARCH = "select * from employees where id = ?";private static final String COLUMN_ID = "id";private static final String COLUMN_NAME = "name";@Autowiredpublic EmployeeRepositoryImpl(DataSource dataSource) {this.template = new JdbcTemplate(dataSource);}public Employee getEmployee(int id) {return template.queryForObject(SEARCH, rowMapper, id);}private class EmployeeRowMapper implements RowMapper<Employee> {public Employee mapRow(ResultSet rs, int i) throws SQLException {Employee employee = new Employee();employee.setId(rs.getInt(COLUMN_ID));employee.setName(rs.getString(COLUMN_NAME));return employee;}}
}

以下配置通过RMI公开服务:

服务器配置文件

<context:component-scan base-package="xpadro.spring.integration"/><int-rmi:inbound-gateway request-channel="requestEmployee"/><int:channel id="requestEmployee"/><int:service-activator method="retrieveEmployee" input-channel="requestEmployee" ref="defaultEmployeeService"/><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean><!-- in-memory database -->
<jdbc:embedded-database id="dataSource"><jdbc:script location="classpath:db/schemas/schema.sql" /><jdbc:script location="classpath:db/schemas/data.sql" />
</jdbc:embedded-database>

让我们关注带有'int'名称空间的行:

网关的功能是将消息传递系统的管道与应用程序的其余部分分开。 这样,它就被业务逻辑隐藏了。 网关是双向的,因此您具有:

  • 入站网关:将消息带入应用程序并等待响应。
  • 出站网关:调用外部系统,并将响应发送回应用程序。

在此示例中,我们使用RMI入站网关。 它将通过RMI接收一条消息并将其发送到requestEmployee通道,该通道也在此处定义。

最后, 服务激活器允许您将spring bean连接到消息通道。 在这里,它连接到requestEmployee通道。 消息将到达通道,服务激活器将调用retrieveEmployee方法。 考虑到如果bean只有一个公共方法或带有@ServiceActivator注释的方法,则不需要'method'属性。

然后,响应将发送到回复通道。 由于我们没有定义此通道,因此它将创建一个临时回复通道。

临时频道

3,实施客户

我们将要实现的客户端将调用服务以检索员工。 为此,它将使用MessagingTemplate类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:xpadro/spring/integration/test/config/client-config.xml"})
public class TestRmiClient {@AutowiredMessageChannel localChannel;@AutowiredMessagingTemplate template;@Testpublic void retrieveExistingEmployee() {Employee employee = (Employee) template.convertSendAndReceive(localChannel, 2);Assert.assertNotNull(employee);Assert.assertEquals(2, employee.getId());Assert.assertEquals("Bruce Springsteen", employee.getName());}
}

客户端使用messagingTemplate将Integer对象转换为Message并将其发送到本地通道。 如下所示,有一个出站网关连接到本地通道。 该出站网关将通过RMI发送请求消息。

<int-rmi:outbound-gateway request-channel="localChannel" remote-channel="requestEmployee" host="localhost"/><int:channel id="localChannel"/><bean class="org.springframework.integration.core.MessagingTemplate" />

4,抽象SI逻辑

在上一节中,您可能已经注意到,访问服务的客户端类具有特定于Spring Integration的逻辑及其业务代码:

  • 它使用MessagingTemplate,它是一个SI类。
  • 它了解本地通道,该本地通道特定于消息传递系统

在本节中,我将实现与抽象消息传递逻辑相同的示例,因此客户端将只关心其业务逻辑。

首先,让我们看一下新客户端:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:xpadro/spring/integration/test/config/client-gateway-config.xml"})
public class TestRmiGatewayClient {@Autowiredprivate EmployeeService service;@Testpublic void retrieveExistingEmployee() {Employee employee = service.retrieveEmployee(2);Assert.assertNotNull(employee);Assert.assertEquals(2, employee.getId());Assert.assertEquals("Bruce Springsteen", employee.getName());}
}

现在我们可以看到客户端仅实现其业务逻辑,而不使用消息通道或消息传递模板。 它将仅调用服务接口。 所有消息传递定义都在配置文件中。

<int-rmi:outbound-gateway request-channel="localChannel" remote-channel="requestEmployee" host="localhost"/><int:channel id="localChannel"/><int:gateway default-request-channel="localChannel" service-interface="xpadro.spring.integration.service.EmployeeService"/>

客户端网关配置文件

我们在这里所做的是添加一个网关,该网关将拦截对服务接口EmployeeService的调用。 Spring Integration将使用GatewayProxyFactoryBean类在服务接口周围创建代理。 该代理将使用消息传递模板将调用发送到请求通道并等待响应。

gatewayProxyFactoryBean

5,结论

我们已经看到了如何使用Spring Integration通过RMI访问服务。 我们还看到,我们不仅可以使用MessagingTemplate显式发送消息,还可以使用GatewayProxyFactoryBean透明地发送消息。

参考: Spring Integration –使用 XavierPadró博客博客中的JCG合作伙伴 Xavier Padro 使用RMI通道适配器 。

翻译自: https://www.javacodegeeks.com/2014/02/spring-integration-using-rmi-channel-adapters.html

spring rmi

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

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

相关文章

Java:如何在不到5分钟的时间内通过Hazelcast提高生产力

如果要使用Hazelcast内存数据网格&#xff08;IMDG&#xff09;来加快数据库应用程序的速度&#xff0c;但是要处理数百个表怎么办&#xff1f; 手动编码所有Java POJO和序列化支持将需要数周的工作&#xff0c;完成后&#xff0c;手动维护该域模型将很快成为一场噩梦。 阅读本…

android 自定义baseadapter listview,android之ListView和BaseAdapter的组合使用

BaseAdapter是基本适配器&#xff0c;功能强大&#xff0c;凡是能用ArrayAdapter和SimpleAdapter解决的&#xff0c;都可以使用BaseAdapter解决。BaseAdapter是一个抽象类&#xff0c;所以需要自定义一个类来继承BaseAdapter。BaseAdapter中所必须重写的方法的意义&#xff1a;…

layui datetimepicker 只日期范围到当前时间的前一天_浪琴手表如何正确调整日期?手表调日期的方法...

浪琴手表怎么样&#xff1f;先看下品牌知识浪琴表起源于1832年&#xff0c;由一位年青商人Auguste Agassiz创办。他以自己的名字在瑞士Saint-Imier开始经营钟表生意&#xff0c;其后,他的侄儿Ernest Francillon巧妙地把其业务拓展为较具规模的钟表公司&#xff0c;于1866年在瑞…

尚未提交线上版本_ABRSM 线上演奏考试报名指引(目前考试仅限英国 amp; 部分国家及地区)...

昨天&#xff0c;ABRSM英国公布了2021年英国本土和亚洲部分地区演奏、乐理的“线上、线下”报名及考试时间&#xff0c;虽然中国大陆的考试时间为“待定”状态&#xff0c;但为了满足考生和家长了解线上演奏考试报名流程&#xff0c;今天我们就为大家作一个详尽的线上考试报名指…

关于以太网光纤收发器,逻辑隔离与物理隔离的理解与区别

现如今&#xff0c;随着以太网的广泛应用&#xff0c;在很多领域&#xff0c;比如说电力、银行、公安、部队、铁路、大型企事业单位专网有广泛物理隔离的以太网接入需求&#xff0c;但是什么是物理隔离以太网呢&#xff1f;什么又是逻辑隔离以太网呢&#xff1f;我们该如何判断…

javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第2部分

javafx 自定义控件自从我开始创建Nest恒温器FX自定义控件以来&#xff0c;已经有一段时间了&#xff01; 因此&#xff0c;上次&#xff0c;正如Gerrit Grunwald所建议的那样&#xff0c;我花了一些时间使用inkscape复制Nest恒温器设计&#xff0c;这是构建JavaFX版本的第一步。…

初中参观机器人博物馆的作文_展馆导览机器人好不好用?小笨展馆机器人案例...

每次科技发展都会给社会带来技术变革&#xff0c;例如工业革命时代的纺纱机&#xff0c;发电机等&#xff0c;极大地提高了生产效率&#xff0c;推动了社会的进步。二十一世纪&#xff0c;人工智能成为了当下技术变革的排头兵&#xff0c;机器人作为其载体已经被应用在各类展馆…

同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...

基本知识1.数与代数A、数与式&#xff1a;1. 有理数■ 有理数&#xff1a;①整数→正整数/0/负整数②分数→正分数/负分数■ 数轴&#xff1a;①画一条水平直线&#xff0c;在直线上取一点表示0(原点)&#xff0c;选取某一长度作为单位长度&#xff0c;规定直线上向右的方向为正…

4路电话光端机概述及产品特性详解

4路电话光端机&#xff0c;采用桌面型机箱结构设计&#xff0c;提供来电显示功能的4路普通电话接口。那么&#xff0c;关于4路电话光端机的功能、应用及产品特性这一块你是否了解呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 4路电话光端机概…

word如何一键全选_学会这七个Word小技巧,五分钟完成3小时的工作

在办公中我们最常用的就是Word&#xff0c;而掌握一些常用Word小技巧&#xff0c;可以助力我们的办公效率&#xff0c;从此和加班说拜拜。今天就让我们一起来看看有哪些我们常用的Word小技巧&#xff0c;快点赞收藏起来吧~一、 Word小技巧汇总1. 文档加密限制编辑有时一些重要文…

服务器日志记录_5种改善服务器日志记录的技术

服务器日志记录在最近的时间里&#xff0c;我们已经看到了许多工具可以帮助您理解日志。 开源项目&#xff08;例如Scribe和LogStash&#xff09;&#xff0c;内部部署工具&#xff08;例如Splunk&#xff09;以及托管服务&#xff08;例如SumoLogic和PaperTrail&#xff09;。…

#让人物运动_篮球人物之黄云龙,淡泊名利的他是篮球运动员中的楷模,你可记得...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。 说起CBA联赛&#xff…

HDMI光端机基本知识及相关品牌介绍

因技术的提高,光纤价格的降低使它在各个领域得到很好的应用,因此各个光端机的厂家就好比是雨后春笋般发展起来。但是这里的厂家大部分技术并不是完全成熟&#xff0c;开发新技术需要耗资和人力、物力等&#xff0c;这就产生厂家多是中小企业&#xff0c;各品牌也先后出现。但是…

线程,代码和数据–多线程Java程序实际运行的方式

有些事情是您在学术或培训班上没有学到的&#xff0c;经过几年的工作经验后才逐渐了解&#xff0c;然后才意识到&#xff0c;这是非常基本的事情&#xff0c;我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程&#xff0c;如何启动线…

HDMI光端机是什么?hdmi光端机产品参数及性能特点介绍

HDMI光端机就是光信号传输的终端设备。在广泛领域应用中&#xff0c;往往需要把HDMI信号源输送远处进行处理。最为突出的问题有&#xff1a;远处接收到的信号出现偏色、模糊&#xff0c;信号产生重影和拖尾及网纹干扰。(多模)/(单模)HDMI视频光端机发送器和相应的光收发系列产品…

html中的保存功能代码怎么写,java保存html代码怎么写

java保存html代码怎么写[2021-01-31 03:29:24] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff…

hdmi光端机运用于多媒体信息发布系统案例介绍

杭州飞畅科技HDMI光端机运用于多媒体信息发布等应用系统中&#xff0c;能将HDMI音视频信号进行远距离传输。用普通的HDMI电缆长距离传输&#xff0c;会出现信号差&#xff0c;容易受干扰&#xff0c;显示出来的图像会出现模糊、拖尾、分色等现象。如果传输距离短&#xff0c;就…

西门子实数转整数_西门子PLC指令全都翻译过来了!

点击蓝字关注我们有时我们关注的公众号消息比较多&#xff0c;错过了一些自己喜欢的消息&#xff0c;不能及时看到工控论坛的推送&#xff0c;我们可以给公众号加星标或置顶。那如何星标置顶呢&#xff1f;【打开一篇工控论坛公众号的文章&#xff0c;点击文章标题下方的蓝色字…

鸿蒙os怎么还没发布,关于鸿蒙OS系统!小米为何从支持到“失声”?看看中兴就知道了!...

鸿蒙OS在还没有正式召开发布会的时候&#xff0c;大家就一直很关注友商们对于鸿蒙OS的态度。此前中兴就表过态&#xff0c;他们不会考虑鸿蒙OS的系统&#xff0c;因为中兴自己有这一方面的规划。而在鸿蒙发布之前&#xff0c;除了中兴是正式的官方发出了相关的态度之外&#xf…

js webapp://_Project Student:维护Webapp(只读)

js webapp://这是Project Student的一部分。 其他职位包括具有Jersey的 Web服务 客户端&#xff0c;具有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成和JPA标准查询 。 当我开…