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

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

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

相关文章

mybatis 直接执行sql 【我】

Connection conn getConnection();// Connection conn this.ss.getConnection(); 返回Connection对象 try { String sql "UPDATE PARTY SET PARTY_NAME 测试0000 WHERE PARTY_ID 0;UPDATE PARTY SET PARTY_NAME 测试1111 WH…

jquery点击非div区域隐藏div

点击非div区域隐藏div&#xff0c;如图&#xff0c;点击圆的头像&#xff08;.person-msg&#xff09;弹出白色底框(.person-centre)。点击圆头像以外的区域隐藏白色底框 html代码 <div class"per_c"><div class"person-msg pull-right"><i…

几种常用的函数

range()函数: range(起始位置,终止位置,步长)  next()函数: __next__是迭代器方法变量.__next__() 带双下火线的魔术发那个方法 一般情况下不直接使用next(变量)带双下划线的所有方法都可能和内置函数有千丝万缕的联系iter()函数: 可迭代的迭代器 可迭代的.__iter__()迭代器…

java sql server连接字符串_关于Java:SQL Server的等效jdbc连接字符串

我目前正在使用以下连接字符串连接到数据库(该数据库与ServerIP在同一服务器上)&#xff1a;String constr "Data SourceServerIP,1433;Network LibraryDBMSSOCN;InitialCatalogdbName;User IDdbUserID;PassworddbUserPassword";在asp.net中使用时&#xff0c;此连接…

上传图片或文件 方法一

最近在巩固一些知识点&#xff0c;回过头看之前做过的项目&#xff0c;所以就在这里总结一下 话不多说&#xff0c;直接看源码 前端 publish-menu.jsp 1 <form action"PublishMenu" method"post" enctype"multipart/form-data" > 2 3 …

如何在Ubuntu上轻松安装Oracle Java

Ubuntu上的开发人员习惯于至少看到两种Java风格。 OpenJDK是Java运行时和编译器的开源构建。 Oracle JDK以此为基础&#xff0c;但是增加了一些封闭源组件。 从理论上讲&#xff0c;OpenJDK是Java 7的官方参考实现 &#xff0c;并且完全可以满足您的所有需求。 在实践中&#…

今天发现新大陆:haml和Emmet

其实一开始小渣渣我只是想接触一下&#xff08;css预处理器&#xff09;sass&#xff0c;可是突然冒出一个haml。 原文是酱紫的。 Sass 是采用 Ruby 语言编写的一款 CSS 预处理语言&#xff0c;它诞生于2007年&#xff0c;是最大的成熟的 CSS 预处理语言。最初它是为了配合 H…

Docker系列(五):.Net Core实现k8s健康探测机制

k8s通过liveness来探测微服务的存活性&#xff0c;判断什么时候该重启容器实现自愈。比如访问 Web 服务器时显示 500 内部错误&#xff0c;可能是系统超载&#xff0c;也可能是资源死锁&#xff0c;此时 httpd 进程并没有异常退出&#xff0c;在这种情况下重启容器可能是最直接…

编写java程序计算梯形面积_学习练习 java面向对象梯形面积

package com.hanqi;public class Ladder {double ShangDi;double XiaDi;double Gao;double MianJi;Ladder(double ShangDi, double XiaDi, double Gao){//使用参数来初始化属性//this 代表当前类this.ShangDi ShangDi;this.XiaDi XiaDi;this.Gao Gao;}//方法的命名&#xff…

02-再探MySQL数据库

一、数据类型 1、数值类型 a、整数类型 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT 作用&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等。 tinyint[(m)] [unsigned] [zerofill]小整数&#xff0c;数据类型用于保存一些范围的整数…

如何在WebLogic Server中创建MySQL数据源

使用应用程序服务器的一个很酷的事情是&#xff0c;它允许您在应用程序外部创建DataSource&#xff0c;并且可以与线程池和事务管理器等一起管理它。对于WebLogic Server&#xff0c;它附带了许多内置的JDBC驱动程序&#xff0c;例如Oracle数据库和MySQL等随时可用。 在这里&am…

js原生带缩略图的图片切换效果

js原生带缩略图的图片切换效果 本例中用到的 moveElement(elementID,final_x,final_y,interval)是来自《JavaScript DOM编程艺术&#xff08;中文第二版&#xff09;》一书第10章中有一段代码。&#xff08;可以直接baidu&#xff09; 左边是banner图&#xff0c;右边是缩略图…

linux 基础10-磁盘配额管理

1. 基本概念 1.1 概念&#xff1a; 在linux系统中&#xff0c;由于是多人多任务的使用环境&#xff0c;所以会有多人共同使用一个硬盘空间的情况&#xff0c;如果其中少数几个人大量使用了硬盘空间的话&#xff0c;势必会压缩其他使用者的使用空间&#xff0c;因此管理员应该适…

java 全半角转换_Java 全半角转换

* 全角转半角的 转换函数* return String*/public static final String full2HalfChange(String QJstr){StringBuffer outStrBuf new StringBuffer("");String Tstr "";byte[] b null;for (int i 0; i < QJstr.length(); i) {Tstr QJstr.substring…

第九章:内存管理

内存管理 引用计数&#xff1a;垃圾回收机制的依据 a.变量的值被引用&#xff0c;该值的引用计数 1b.变量的值被解绑&#xff0c;该值的引用计数 -1c.引用计数为0时就会被垃圾回收机制回收​ 引用计数会出现循环引用问题&#xff1a;相互引用无法释放 a.两个变量引用其值&#…

Centos系统通过tar.gz包安装MySQL5.7

环境准备&#xff1a; 操作系统&#xff1a; http://vault.centos.org/6.5/isos/x86_64/ 下载 CentOS-6.5-x86_64-bin-DVD1.iso vmware workstation下安装系统 MySQL安装包连接地址&#xff1a; https://downloads.mysql.com/archives/community/ 下载 mysql-5…

java web转码_javaweb后台转码

为什么需要转码?客户端向服务器发送请求的四种情况:1、URL方式直接访问;2、页面链接(属于get请求);3、表单get提交;4、表单post提交1.url(url和页面链接):各大浏览器、各个操作系统对URL的URI、QueryString编码都可能存在不同.tomcat对URI的解码操作是首先获取Connector的解码…

微信小程序实战篇:商品属性联动选择(案例)

本期的微信小程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果&#xff0c;素材参考了一点点奶茶。 效果演示&#xff1a; 商品属性联动.gif代码示例 1、commodity.xml <!-- <view class"title">属性值联动选择</view> --> <!--…

使用Mockito在Java中进行模拟入门

我们都编写了单元测试&#xff0c;但是有时我们面临的挑战是被测单元可能依赖于其他组件。 并且配置其他组件进行单元测试绝对是一个过大的选择。 相反&#xff0c;我们可以使用Mocks代替其他组件&#xff0c;并继续进行单元测试。 为了说明如何使用模拟&#xff0c;我有一个数…

2.12 Hivet中order by,sort by、distribute by和cluster by

https://cwiki.apache.org/confluence/display/Hive/LanguageManualSortBy一、order by对全局数据的排序&#xff0c;仅仅只有一个reduce&#xff1b;Hive中的order by跟传统的sql语言中的order by作用是一样的&#xff0c;会对查询的结果做一次全局排序&#xff0c; 所以说&am…