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,一经查实,立即删除!

相关文章

android过滤html标签,Android中处理TextView带超链接HTML标签的点击事件处理方法

主要的处理方法&#xff1a;/*** 格式化超链接文本内容并设置点击处理* */private CharSequence getClickableHtml(String html) {Spanned spannedHtml Html.fromHtml(html);SpannableStringBuilder clickableHtmlBuilder new SpannableStringBuilder(spannedHtml);URLSpan[]…

【渝粤教育】 国家开放大学2020年春季 2064管理学基础 参考试题

试卷代号&#xff1a;2079 2 0 2 0年春季学期期末统一考试 现代教师学导论 试题&#xff08;开卷&#xff09; 2020年7月 一、单项选择题&#xff08;在下列每小题的4个选项中只有1个是正确的&#xff0c;请选出并将题号填入括弧之中。每小题4分&#xff0c;共计20分&#xff0…

选购工业交换机时,工业交换机的IP等级多少比较合适?

工业交换机的防护等级&#xff0c;经常被成为IP防护指数&#xff0c; IP是指“ingress protection&#xff0c;进入防护”&#xff0c;防护等级是由IEC(国际电工协会)起草。那么&#xff0c;我们在选购工业交换机的时候&#xff0c;工业交换机的IP等级多少比较合适呢&#xff1…

【渝粤教育】 国家开放大学2020年春季 2134成本会计 参考试题

试卷代号&#xff1a;2175 2 0 2 0年春季学期期末统一考试 市场营销学 试题 2020年7月 注 意 事 项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人…

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

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

【渝粤教育】 国家开放大学2020年春季 2245社会福利与保障 参考试题

试卷代号&#xff1a;2251 座位号 2 0 2 0年春季学期期末统一考试 团体工作 试题 2020年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1&#xff0e;( )是第一个社区睦邻服务中心&#xff0c;标志着睦邻组织运动的开始。 A&#xff0e;赫尔馆 B&…

百兆工业交换机与千兆工业交换机如何计算码率?

工业上常常会用到工业交换机&#xff0c;工程商在做小型网络监控方案的时候&#xff0c;经常需要选配合适的百兆工业交换机或千兆工业交换机&#xff0c;但是&#xff0c;到底是配百兆工业交换机还是千兆工业交换机呢&#xff1f;今天飞畅科技的小编来教您如何计算百兆工业交换…

android 剪切板广播发送者,Android使用剪切板传递数据

Android使用剪切板传递数据发布时间&#xff1a;2020-08-30 14:15:07来源&#xff1a;脚本之家阅读&#xff1a;62作者&#xff1a;Ben_love_Nicole在Activity之间传递数据还可以利用一些技巧&#xff0c;不管windows还是Linux操作系统&#xff0c;都会支持一种叫剪切板的技术&…

【渝粤教育】 国家开放大学2020年春季 2411中国现代文学 参考试题

试卷代号&#xff1a;2422 2 0 2 0年春季学期期末统一考试 汽车发动机构造与维修 试题 2020年7月 一、单项选择题&#xff08;下列各题的备选答案中&#xff0c;只有一个选项是正确的&#xff0c;请把正确答案的序号填写在括号内。15小题&#xff0c;每小题2分&#xff0c;共30…

【渝粤教育】 国家开放大学2020年春季 2528监督学 参考试题

试卷代号&#xff1a;2586 2 0 2 0年春季学期期末统一考试 城市轨道交通车站设备 试题 2020年7月 一、单项选择题&#xff08;下列选项中只有一项是正确答案&#xff0c;请将正确选项的序号字母填入括号中。每小题2分&#xff0c;共20分&#xff09; 1.城市轨道交通线路按其空间…

非网管交换机和网管交换机的区别

交换机可以分为网管型交换机以及非网管交换机&#xff0c;那么&#xff0c;对于非网管交换机和网管交换机你是否有过详细了解呢&#xff1f;非网管交换机和网管交换机二者之间有何区别呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 什么叫非网…

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

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

【渝粤教育】 国家开放大学2020年春季 2710蔬菜栽培技术 参考试题

试卷代号&#xff1a;2718 2 0 2 0年春季学期期末统一考试 动物生理基础 试题 2020年7月 一、单项选择题&#xff08;共15分&#xff0c;每小题3分&#xff09; 1&#xff0e;营养物质分解产物的主要吸收部位在( )。 A&#xff0e;食管 B&#xff0e;胃 C&#xff0e;小肠 D&am…

【渝粤教育】 国家开放大学2020年春季 2772家畜环境卫生与设施 参考试题

试卷代号&#xff1a;2776 座位号口口 2 0 2 0年春季学期期末统一考试 兽医基础 试题 2020年7月 一、单项选择题&#xff08;每题3分&#xff0c;共60分&#xff09; 1&#xff0e;局部贫血病理变化特征之一是( )。 A&#xff0e;发红 B&#xff0e;水肿 C&#xff0e;发凉 D&a…

构建器模式_我喜欢构建器模式的三个原因

构建器模式有三种方法可以用Java编程语言创建新对象&#xff1a; 伸缩构造函数&#xff08;反&#xff09;模式 Javabeans模式 建造者模式 与其他两种方法相比&#xff0c;我更喜欢使用构建器模式。 为什么&#xff1f; Joshua Bloch描述了构建器模式以及在Effective Jav…

如何分辨PoE工业交换机是否标准供电

要了解如何分辨出一台PoE交换机/PoE工业交换机是否是标准PoE供电&#xff0c;首先得要弄清楚什么是PoE交换机/PoE工业交换机。接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; PoE供电交换机是指能够通过网线为远端受电终端提供网络供电的交换机&#xff0c;包…

android 蒙层广告1,subnvue安卓机打开只显示蒙层,没有任何内容【报Bug】

详细问题描述subnvue子窗体&#xff0c;在iphone上测试正常&#xff0c;而在安卓手机测试出现打开只有一个灰色蒙层&#xff0c;没有任何内容。经过调试之后发现&#xff1a;"style": {"top": "0px","bottom": "0px","…

【渝粤教育】 国家开放大学2020年春季 3956★汽车故障诊断技术 参考试题

试卷代号&#xff1a;3979 座位号 2 0 2 0年春季学期期末统一考试 会计学概论 试题 2020年7月 一、单项选择题&#xff08;在下列各题的备选答案中选择一个正确的&#xff0c;并将其序号字母填入题中的括号里&#xff0c;每小题2分&#xff0c;共20分&#xff09; 1&#xff0e…

【渝粤教育】 国家开放大学2020年春季 1007公司财务 参考试题

试卷代号&#xff1a;1013 2 0 2 0年春季学期期末统一考试 金融统计分析 试题&#xff08;开卷&#xff09; 2020年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共40分。每小题有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1&#xff0e;中央…

工业交换机出现故障问题排查步骤详解

工业交换机虽然说具有电信级性能特征&#xff0c;可耐受严苛的工作环境&#xff0c;但是其运行中出现故障问题是不可避免的&#xff0c;当工业交换机出现故障后应当迅速地进行处理&#xff0c;尽快查出故障点&#xff0c;排除故障。在遇到故障分析较复杂时&#xff0c;必须先从…