REST端点,可使用Apache Camel进行集成

REST是一种用于组织资源的体系结构样式,当应用于基于HTTP的服务时,REST可以构建无状态的,解耦的,可伸缩的服务。 HTTP方法,HTTP标头和mime类型都允许开发人员实现REST样式。 诸如Jersey和Fuse Services Framework(Apache CXF)之类的框架可用于加快服务的开发和部署,以尝试实现RESTful风格,在本博文中,我想讨论如何构建资源的后端,依赖于Fuse中介路由器(也称为Apache Camel)提供的集成。

顺便说一句,对于那些想知道您的体系结构确实是RESTful还是REST试图缓解的高度耦合的RPC风格的人,也许我很感兴趣。 关于REST撰写论文的Roy Fielding积极主张资源表示中的超链接对于REST风格必不可少的观点,甚至进一步阐明了实现REST的不确定性。

该示例的源代码可以在我的github存储库中找到

Fuse中介路由器是FuseSource的企业级硬化版Apache Camel,提供了舒适的DSL,用于描述集成,中介和路由。 它是免费的开放源代码,并具有Apache许可证。 对于那些不熟悉Mediation Router / Camel的人,请看DZone企业集成区Apache Camel:Integration Nirvana的 Jon Anstey( Camel in Action的合著者)的介绍。

我们将使用中介路由器来帮助在REST端点和文件系统上的资源文件之间编写简单的集成。 我将使用camel-cxfrs组件公开REST端点,并将使用camel-file组件读取文件系统上的目录。 该样本的目的是描述必要的配置,以通过中介路由器公开REST接口,以某种方式与后端集成,将数据转换为适当的REST响应并发送回该响应。

首先,让我们专注于如何设置REST端点。 为此,您将创建一个JAX-RS资源,该资源描述将用作REST端点的java方法。 此样本代码要求熟悉RESTful Web服务 (又称JAX-RS)的Java API 。 对于那些不熟悉的人,这里有一些不错的教程,可以帮助您理解JAX-RS。

@Path("/customerservice/")
public class CustomerServiceResource {// NOTE: The instance member variables will not be available to the
// Camel Exchange. They must be used as method parameters for them to
// be made available
@Context
private UriInfo uriInfo;public CustomerServiceResource() {
}@GET
@Path("/customers/{id}/")
@Produces("text/xml")
public Customer getCustomer(@PathParam("id") String id) {return null;
}@PUT
@Path("/customers/")
public Response updateCustomer(Customer customer) {return null;
}}

如您所见,注释是JAX-RS注释,用于描述REST端点所涉及的操作,HTTP方法和mime类型。 注意,返回值全为空,因为此类实际上将不会用于处理进入端点的请求。 中介路由器路由将负责处理和响应。 但是请注意,实例成员不可用于中介路由器交换,即,通过JAX-RS @Context注释注入的任何实例成员将不可用。 要使它们可用,请将它们作为参数添加到您的方法中。

可以使用以下两种方法之一来声明使用中介路由器的CXF-RS端点:直接在端点配置中,如下所示:

from("cxfrs://http://localhost:9090/route?resourceClasses=com.fusesource.samples.CustomerServiceResource")

直接在配置中创建它需要较少的xml配置,但灵活性有限。 另一个选择是创建一个负责端点的单独的bean,然后在端点配置中引用它:

from("cxfrs:bean:rsServer")

Bean rsServer应该在骆驼上下文中定义。 例如:

<cxf:rsServer id="rsServer" address="http://localhost:9090/route"serviceClass="com.fusesource.samples.CustomerServiceResource"/>

这种方法允许您解耦端点配置,并允许端点配置更快,更省力。 尽管使用了第一个选项,但两个选项都显示在示例代码中。

这就是使用中介路由器公开REST端点所需的全部配置。 很简单。 下一步是根据来自REST端点的内容来使用文件系统中的文件。 该文件的内容将返回给REST调用的客户端。 为此,我们使用骆驼文件组件,并通过DSL中的pollEnrich调用丰富Exchange:

.setHeader(Exchange.FILE_NAME, simple("test-${body}.xml"))
.pollEnrich("file:src/data?noop=true", 1000, new CustomerEnricher())

我们不能在pollEnrich调用中使用任何动态表达式,因此我们在设置扩展之前设置文件组件可以理解的标头。 在这种情况下,REST消息的主体是可用于对文件系统资源进行模板化的标识符。

最后,我们可以对路线进行一些附加处理:

.process(new CustomerServiceProcessor())

如上所述,该示例的目的是显示如何配置终结点并将其附加到进一步的中介路由器处理中。 请注意,REST端点的消息交换模式(MEP)为InOut并期望响应。 该示例并不意味着是完整的端到端解决方案,因为该解决方案将根据预期的功能而有所不同。 请注意上面有关Roy关于什么是REST和不是REST 的讨论的链接。

如果我遗漏了一些内容,或者您​​需要对示例进行更多说明,请给我评论,我们可以进行讨论。

参考:来自Christian Posta Software博客的JCG合作伙伴 Christian Posta 使用Apache Camel进行集成的REST端点 。


翻译自: https://www.javacodegeeks.com/2012/05/rest-endpoint-for-integration-using.html

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

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

相关文章

Appium+Python API相关知识了解

首先&#xff0c;要先了解&#xff0c;官方Appium API // https://testerhome.com/topics/3144 刚开始的时候&#xff0c;没有看官方API&#xff0c;然后在网上瞎找学习资料&#xff0c;发现python相关的很少&#xff0c;看了API才知道&#xff0c;就是selenium webdriver的定位…

JSON用于多态Java对象序列化

长期以来&#xff0c;JSON已成为客户端和服务器之间各种数据序列化的事实上的标准。 除其他外&#xff0c;它的优势是简单和易于阅读。 但是&#xff0c;简单起了一些限制&#xff0c;我今天要谈的其中一个限制是&#xff1a;存储和检索多态Java对象。 让我们从一个简单的问题开…

linux 命令分类,常用linux 命令分类整理(篇一)

工作中接触linux时间也不算短了&#xff0c;不同于Windows的图形化操作&#xff0c;使用linux几乎百分之九十五的情况是在命令行下过日子&#xff0c;过去的两年里&#xff0c;零零碎碎整理过一版自己工作中涉及到和学习过的命令(不过常用的只有三十个左右)&#xff0c;思前想后…

考研复习策略

考研复习是一个不容易的过程&#xff0c;有好的策略事半功倍&#xff0c;以我曾经失败的教训和成功的实践给出了我认为不错的策略&#xff0c;只要能做到&#xff0c;我相信一定能考研成功。 院校选择&#xff1a;985院校在选择考研院校是有优势的&#xff0c;院校考虑的因素有…

js中的this指针(二)

在 js 中声明并定义一个函数后&#xff0c;除了定义时传入的形式参数&#xff0c;函数还会接收到 2 个附加的参数&#xff1a;this 和 arguments。 this 指针的值取决于调用时的模式。 当这个函数被保存为对象的一个属性时&#xff0c;它被称为“方法”。当一个方法被调用时&am…

使用AspectJ和Spring简化了AOP

我最近开始研究面向方面的编程&#xff08;AOP&#xff09;&#xff0c;至少可以说使我兴奋。 当然我很熟悉它&#xff0c;因为我看到它在Spring中用于事务管理&#xff0c;但是我从未深入研究它。 在本文中&#xff0c;我想展示通过AspectJ可以快速掌握AOP和Spring。 本文中的…

第一冲刺阶段 工作总结 04

1、昨天我继续我的任务&#xff0c;连接数据库。 2、今天打算继续做数据库的连接。 3、遇到的问题&#xff1a;昨天在数据库连接时&#xff0c;老是连接不上&#xff0c;显示错误&#xff0c;所以今天打算接着弄。转载于:https://www.cnblogs.com/zz0906/p/5422510.html

windows2012同步linux时间,Windows server2012时间同步NTP配置

遇到经常服务器时间无法同步&#xff0c;可以自己建立一台时间同步服务器&#xff0c;NTP配置如下&#xff1a;一、服务端配置 (Ntp服务器&#xff0c;客户端将根据这台服务器的时间进行同步)1、微软键R键&#xff0c;进入“运行”&#xff0c;输入“regedit”,进入注册表2、 H…

反差萌

反差萌 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0 Accepted Submission(s): 0 Problem Description有2N个人&#xff0c;每人有个萌值Mi(1<i<2N)。 要求将他们分为N对&#xff0c;使得反差值之和…

Java EE 6示例– Galleria第2部分

您可能在最后一篇Java EE 6 Galleria示例帖子中关注了我。 第一个是基本介绍。 第二个是关于在最新的GlassFish上运行它。 有人提到RedHat&#xff0c;我们应该研究将这个示例从GlassFish中移除。 很好;&#xff09;感谢您的好主意。 这正是我们今天要做的。 我将把Galleria示例…

suggest

http://lovebeyond.iteye.com/blog/941633转载于:https://www.cnblogs.com/sunxun/p/5421251.html

linux的tar命令压缩26g文件,linux如何使用tar命令大包压缩进文件

linux如何使用tar命令大包压缩进文件发布时间&#xff1a;2020-05-29 12:30:14来源&#xff1a;亿速云阅读&#xff1a;206作者&#xff1a;Leah本篇文章主要介绍linux中使用tar命令大包压缩进文件的方法。内容比较详细&#xff0c;文章包含了命令的使用示例&#xff0c;希望大…

与reCAPTCHA的Spring集成

有时我们只需要CAPTCHA &#xff0c;这是一个可悲的事实。 今天&#xff0c;我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级&#xff0c;所以我们将通过使用Spring Integration处理低级细节来过度设计&#xff08;&#xff1f;&#xff09;。 Google决定使…

《机器学习基石》---感知机算法

1 推导感知机模型 基本思想是&#xff0c;把特征的线性加权值作为一个分数&#xff0c;根据这个分数与一个门限值的关系来进行分类&#xff1a; 我们加一个特征x0等于1&#xff0c;门限值就可以放到w里面去&#xff0c;得到更简单的形式&#xff1a; 这就是感知机模型&#xff…

未知错误:1000正在终止线程

若在try{} catch{}的catch 块中加入 catch (Exception ex) { Response.Write(ex.Message); Response.End(); } 则捕获异常后&#xff0c;提示未知错误&#xff1a;1000正在终止线程 转载于:https://www.cnblogs.com/dennysong/p/5422567.…

分叉并加入Java 7 – JSR 166并发实用程序

Java 7最有趣的改进之一是对并发的更好支持。 使用JSR 166并发实用程序&#xff0c;我们可以对并发进行一些非常有用的改进。 在我看来&#xff0c;fork-join库在软件工程中具有很高的实际应用潜力。 Fork and join为算法提供了非常简单的编程模型&#xff0c;可以将其实现为递…

linux内核源码代码量,Linux内核源代码数量已经超过1000万行

Linux版本2.6.27更新后,人们发现,这一内核的源代码数量已经超过了1000万行.当然,这些行数仅仅是计算机统计出来的行数,包括空白行,为了代码的可读性增加的注释等,当然Linux和所有的长期项目一样,随着时间的推移,旧的代码 会被丢弃和更换,但总体规模来说,Linux的内核在不断增强,…

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路【第八篇】&#xff1a;堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前&#xff0c;先来学习Python的paramiko模块&#xff0c;该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接&#xff1a; 12…

关于typedef的使用方法

在计算机编程语言中用来为复杂的声明定义简单的别名。与宏定义有些差异。它本身是一种存储类的keyword&#xff0c;与auto、extern、mutable、static、register等keyword不能出如今同一个表达式中。typedef声明&#xff0c;简称typedef&#xff0c;为现有类型创建一个新的名字&…

ADF BC:创建绑定到业务组件的UI表

在此示例中&#xff0c;我们将展示如何创建绑定到业务组件的简单UI表&#xff08;af&#xff1a;table&#xff09;。 我再次尝试使用简单的标准在网上进行搜索&#xff1a; “如何创建绑定到业务组件ADF 11g的af&#xff1a;table” 我必须承认我没有得到我想要的答案。 信息…