这是一个典型的集成问题。对于集成、调解、代理等不同的服务,甚至传输数据,请使用Apache Camel。有关什么是 Camel 的简短回答,请参阅 What exactly is Apache Camel?
在 Camel 中,您使用 Java DSL 或 XML Spring DSL 定义路由。 here 描述了代理 Web 服务。使用 XML Spring DSL,路由将如下所示:
<route>
<from uri="jetty:http://0.0.0.0:8080/myapp?matchOnUriPrefix=true"/>
<to uri="jetty:http://realserverhostname:8090/myapp?bridgeEndpoint=true&throwExceptionOnFailure=false"/>
</route>
使用 Java DSL,这将变成:
from("jetty:http://0.0.0.0:8080/myapp?matchOnUriPrefix=true"
.to("jetty:http://realserverhostname:8090/myapp?bridgeEndpoint=true&throwExceptionOnFailure=false")
Camel 支持许多不同的协议,例如 JSM、SOAP WS、RESTful WS、纯 HTTP、TCP。查看https://camel.apache.org/components.html 了解所有可能性。
下一个示例向您展示使用 Restlet component 定义 RESTful 服务器是多么容易:
from("restlet:http://localhost:8400/orders/{id}?restletMethod=post")
.process(new Processor() {
@Override
public void process(final Exchange exchange) throws Exception {
final String res = "received [" + exchange.getIn().getBody(String.class) + "] with order id = " + exchange.getIn().getHeader("id");
exchange.getIn().setBody(res);
}
});
对应的客户端如下:
from("direct:start")
.setBody(constant("Hello, world!!"))
.to("http://localhost:8400/orders/22?restletMethod=post")
.log("order: direct start body result = ${bodyAs(String)}")
也就是说,Camel 支持大量企业集成模式,例如拆分器、聚合器等,可用于满足您的需求。请查看http://camel.apache.org/enterprise-integration-patterns.html 了解更多信息。
您可以只使用“普通”Java 类来转换数据并将它们挂接到路由中。除此之外,还有许多用于将一种数据类型转换为另一种数据类型的集成类型转换器。这些转换器可以轻松扩展。见https://camel.apache.org/type-converter.html。
您可以使用 Camel 作为基础集成框架并添加例如JMS/ActiveMQ 用于通信。但是,也可以使用 ActiveMQ 作为基础并添加 Camel 来转换数据,请参阅https://activemq.apache.org/broker-camel-component.html:“代理骆驼组件使这变得更加容易——它在消息通过代理本身时拦截消息,允许它们被在它们被持久化到消息存储或交付给最终消费者之前进行修改和操作。”但是,我更喜欢使用 Camel 作为基础并添加 JMS/ActiveMQ 用于异步通信(例如,如果需要消息持久性或必须在不同主机之间进行通信)。
Camel 支持大量不同的协议和格式。但是,如果您不需要它们,则不必使用它们。如果需要,只需将依赖项添加到您的 pom.xml 即可。 Apache Camel 是一个小型库 (11.2 MB),具有最小的依赖项,可轻松嵌入任何 Java 应用程序。 Camel 在 Servlet 引擎或 OSGI 容器(如 Karaf/ServiceMix/JBoss Fuse ESB)中独立运行。如果您的需求不断增长,您可以从小处着手,应用程序也可以增长。
要开始使用 Camel,请阅读 Claus Ibsen 的优秀书籍:http://www.manning.com/ibsen/。