本实验的配置文件 camel-context.xml 内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="route" class="com.suneee.esb.jetty.time.TProcessor"/>
<bean id="testBean" class="com.suneee.esb.jetty.time.Time"/>
<!-- camel核心配置 -->
<camelContext id="main" xmlns="http://camel.apache.org/schema/spring">
<!-- 处理来自发布端口上的请求 -->
<route id="processor">
<from uri="jetty:http://0.0.0.0:5678/?matchOnUriPrefix=true"/>
<dynamicRouter> <!-- 路由 由 parseRoute 方法决定,在本例中 定义的 uri 为 /a/b/c-->
<method ref="route" method="parseRoute"/>
</dynamicRouter>
</route>
<!-- matchOnUriPrefix=true 时候,访问是不受 uri 影响-->
<route>
<from uri="direct:a-b-c"/>
<!--
<transform><constant>Bye World</constant></transform>
-->
<to uri="bean:testBean?method=showBody(${exchange})"/>
<to uri="bean:testBean?method=parseRequest(${exchange},${body})"/>
<to uri="bean:testBean?method=process(${body})"/>
<to uri="bean:testBean?method=response(${exchange},${body})"/>
<to uri="bean:route?method=end(${exchange})"/>
</route>
</camelContext>
</beans>
//TProcessor.java 的源代码,
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.ByteArrayInputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;;
public class TProcessor implements Processor {
private static final Log log = LogFactory.getLog(TProcessor.class);
public void process(Exchange exchange) throws Exception {
log.info("-->process exchange:"+exchange);
log.info("--ESBProcessor---in--");
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
Message in=exchange.getIn();
System.out.println("process-->"+exchange);
System.out.println("head="+in.getHeaders()+
",\r\n\tip="+req.getRemoteAddr()+",\r\n\turi="+req.getRequestURI());
String sb="none input!";
ByteArrayInputStream bin=new ByteArrayInputStream(sb.getBytes());
exchange.getIn().setBody(bin);
}
public String parseRoute(Exchange exchange){
Message in=exchange.getIn();
Map<String, Object> hs=in.getHeaders();
if(hs==null){
System.out.println("-----end--3333---");
return null;
}
if(hs.containsKey("_finished")){ //达到退出循环的条件
System.out.println("-----end--2222---");
return null;
}
HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
if(req==null){
System.out.println("-----end--1111---");
return null;
}
System.out.println("\r\n--------------------------\r\n");
System.out.println("parseRoute-->"+exchange);
System.out.println("parseRoute-->head="+hs);
System.out.println("\r\n\t----from ip="+req.getRemoteAddr()+",uri="+req.getRequestURI());
String uri=req.getRequestURI();
uri=uri.replace('/', '-');
if(uri.startsWith("-")){
uri=uri.substring(1);
}
uri="direct:"+uri;
System.out.println("parseRoute-->to:{"+uri+"}");
return uri;
}
public void end(Exchange exchange){
Message in=exchange.getOut();
Map<String, Object> hs=in.getHeaders();
hs.put("_finished", true); //动态路由会循环路由,设置退出循环的条件
}
}
Time.java 源代码
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Time {
private static final Log log = LogFactory.getLog(Time.class);
public Time(){
super();
}
public String showBody(Exchange exchange) throws Exception {
System.out.println("\r\n\r\n");
System.out.println("showBody-->From context:"+ exchange.getContext().getName());
Message in=exchange.getIn();
Object os=in.getBody();
String msg=String.valueOf(os)+"[String]";
if(os instanceof ByteArrayInputStream){
byte []bs=read((ByteArrayInputStream)os);
msg=new String(bs,"utf-8")+"[stream]";
}
System.out.println("showBody-->msg="+msg);
return msg;
}
private byte[] read(ByteArrayInputStream in){
int len=in.available();
byte []data=new byte[len];
in.read(data,0,data.length);
return data;
}
public void showHeads(Map<String, Object> h){
System.out.println("\r\n\r\n");
System.out.println("showHeads--> heads="+h);
}
public Request parseRequest(Exchange exchange,String body) {
System.out.println("\r\n\r\n");
Message in=exchange.getIn();
Map<String, Object> ms=in.getHeaders();
Request r=new Request();
r.setHead(ms);
System.out.println("parseRequest--> heads="+ms+"\r\n\t-->body="+body);
r.setBody(body);
return r;
}
public String process(Request req) {
System.out.println("\r\n\r\n");
System.out.println("process--> heads="+req.getHead()+"\r\n\t-->body="+req.getBody());
String s="你好,系统时间为:"+new Date();
return s;
}
public void response(Exchange exchange,String html) throws IOException {
System.out.println("\r\n\r\n");
/*
exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "text/html" + "; charset=utf-8");
//out.getOut().setHeader(Exchange.CONTENT_TYPE, "application/octet-stream" + "; charset=utf-8");
exchange.getOut().setBody(html);
*/
Message in=exchange.getIn();
Map<String, Object> hs=in.getHeaders();
System.out.println("response 1-->head="+hs);
System.out.println("response 1-->html="+html);
//HttpServletResponse res = exchange.getOut().getBody(HttpServletResponse.class);
//HttpServletResponse res = (HttpServletResponse)hs.get(Exchange.HTTP_SERVLET_RESPONSE);
HttpServletResponse res = exchange.getIn().getBody(HttpServletResponse.class);
//HttpServletResponse.class);
res.addHeader(Exchange.CONTENT_TYPE, "text/html; charset=utf-8");
PrintWriter writer = res.getWriter();
writer.print(html);
}
public void response(Exchange exchange) throws IOException {
System.out.println("\r\n\r\n");
String html="欢迎你!";
Message in=exchange.getIn();
Map<String, Object> hs=in.getHeaders();
System.out.println("response 2-->head="+hs);
System.out.println("response 2-->html="+html);
/*
exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "text/html" + "; charset=utf-8");
exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "application/octet-stream" + "; charset=utf-8");
exchange.getOut().setBody(html);
*/
HttpServletResponse res = exchange.getIn().getBody(HttpServletResponse.class);
//HttpServletResponse / HttpServletRequest 都 从 In 初获得,
res.addHeader(Exchange.CONTENT_TYPE, "text/html; charset=utf-8");
PrintWriter writer = res.getWriter();
writer.print(html);
}
public String toHtml(Object r) {
System.out.println("\r\n\r\n");
System.out.println("toHtml--> object="+r);
return String.valueOf(r);
}
}
相关推荐
使用Camel Choice进行配置的方式是通过在Route中使用Choice元素,可以根据不同的条件进行路由选择。例如,以下是一个使用Camel Choice进行配置的示例: ```xml <route id="route2" xmlns:ns2="http://camel.apache....
通常,这样的博客可能会涵盖Camel的基本概念、配置、路由定义、以及如何在实际项目中应用Camel。 标签中包含“源码”和“工具”,这意味着内容可能涉及到Apache Camel的源代码分析以及作为开发工具的使用方式。源码...
接上文EndpointDirect用于在两个编排好的路由间实现Exchange消息的连接,上一个路由中由最后一个元素处理完的Exchange对象,将被发送至由Direct连接的下一个路由起始位置(http://camel.apache.org/direct.html)。...
提供的“Apache Camel 开发指南”将详细介绍如何设置开发环境、创建第一个路由、调试和测试Camel应用,以及如何利用Camel的高级特性。它是学习和精通Camel的宝贵资源。 通过掌握上述知识点,开发者可以有效地利用...
- 第二章深入探讨了 Camel 中的路由机制,并展示了如何使用 Camel 进行数据转换。 - **使用 Beans** - 第四章介绍了如何在 Camel 应用程序中使用 Java Beans 来处理业务逻辑。 - **错误处理** - 第五章专门...
Apache Camel 框架实现的 JMS 路由是指使用 Apache Camel 框架来实现 Java 消息服务(JMS)的路由。JMS 是一个 Java API,用于在 Java 应用程序之间进行消息传递。Apache Camel 框架是一个开源的集成框架,提供了一...
4. **错误处理与事务管理**:Camel允许设置错误处理器来捕获并处理异常,比如使用`onException()`来定义全局或特定路由的错误处理策略。此外,它还支持基于XAPolicy的事务管理,确保消息传递的原子性和一致性。 5. ...
4. **路由引擎**:基于EIP(Enterprise Integration Patterns)的Camel Engine负责执行路由规则。 5. **Spring集成**:与Spring框架紧密集成,可以在Spring配置中定义和管理Camel路由。 在"apache-camel-1.0.0.zip...
【标题】:“servicemix 7安装使用及camel-cxf代理webservice”涉及的知识点主要涵盖Apache ServiceMix 7的安装配置、Apache Camel和Apache CXF的集成使用,以及如何利用它们来代理Web服务。 Apache ServiceMix是...
Apache Camel 是一个强大的开源集成框架,它允许开发者在各种组件之间路由、转换和处理消息,以构建企业级的集成解决方案。在这个"01-ApacheCamel-HelloWorld"示例中,我们将深入理解如何使用 Camel 实现一个简单的 ...
Apache Camel(http://camel.apache.org/) 是一个非常强大的基于规则的路由以及媒介引擎,该引擎提供了基于POJO的 企业应用模式(EIP--Enterprise Integration Patterns)的实现。
通过对《Camel实战中文版第四章》的学习,我们可以了解到Camel如何与现有的Java Bean集成,以及不同调用方式的特点和适用场景。无论是通过纯Java调用还是Spring XML配置,都各有优劣,开发者可以根据实际需求选择最合适...
3. **Camel路由**:学习如何使用Java DSL或XML DSL定义Camel路由,以及如何在Java代码中启动和停止路由。 4. **Camel测试**:了解如何编写和执行Camel路由的测试,确保HTTP通信的正确性。 5. **Maven项目结构**:...
Camel 提供了多种路由方式,例如基于内容的路由、基于headers 的路由等。开发者可以根据需要选择合适的路由方式。 6. Apache Camel 的使用场景 Apache Camel 的使用场景非常广泛,例如: * 企业应用集成:Camel ...
本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...
总结来说,Apache Camel是一个功能强大且广泛使用的集成框架,它将复杂的消息路由和转换逻辑简化为一套简单的规则,从而让开发者能够快速且高效地实现系统之间的集成。它的版本历史展示了其稳定的发展和社区的活跃...
- **路由(Routes)**:Camel 路由定义了消息从源到目的地的路径,通常包含“from”和“to”端点。 - **处理器(Processors)**:在路由中,可以添加处理器来执行特定操作,如转换消息内容、过滤或聚合数据。 - *...
这允许开发者根据消息内容、属性或外部条件进行动态路由,增强了路由的灵活性。 四、camel高级编程 在深入学习Camel时,了解其高级特性至关重要。这包括: 1. **错误处理**:Camel 提供了多种错误处理策略,如继续...
Apache Camel 是一个流行的开源集成框架,它允许开发者以声明式的方式定义路由和转换数据,使得在不同的软件组件之间实现通信变得更加简单。JDBC(Java Database Connectivity)是Java平台中的一个标准API,用于与...
- **Bean路由**:解释了如何在Camel中使用Bean路由,以及这种方式的优点和限制。 - **远程调用**:探讨了远程调用的实现机制及其应用场景。 #### 三、附加内容 - **简单表达式语言 (Simple, the expression ...