`

Camel 动态路由以及HttpServletRequest/Reponse的使用

 
阅读更多

本实验的配置文件 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);
    }


}

 

 

0
0
分享到:
评论

相关推荐

    ActiveMQ路由配置方式

    使用Camel Choice进行配置的方式是通过在Route中使用Choice元素,可以根据不同的条件进行路由选择。例如,以下是一个使用Camel Choice进行配置的示例: ```xml &lt;route id="route2" xmlns:ns2="http://camel.apache....

    camel的使用

    通常,这样的博客可能会涵盖Camel的基本概念、配置、路由定义、以及如何在实际项目中应用Camel。 标签中包含“源码”和“工具”,这意味着内容可能涉及到Apache Camel的源代码分析以及作为开发工具的使用方式。源码...

    ApacheCamel快速入门(中)

    接上文EndpointDirect用于在两个编排好的路由间实现Exchange消息的连接,上一个路由中由最后一个元素处理完的Exchange对象,将被发送至由Direct连接的下一个路由起始位置(http://camel.apache.org/direct.html)。...

    Camel服务集成,服务编排操作文档

    提供的“Apache Camel 开发指南”将详细介绍如何设置开发环境、创建第一个路由、调试和测试Camel应用,以及如何利用Camel的高级特性。它是学习和精通Camel的宝贵资源。 通过掌握上述知识点,开发者可以有效地利用...

    Camel in action(camel实战)

    - 第二章深入探讨了 Camel 中的路由机制,并展示了如何使用 Camel 进行数据转换。 - **使用 Beans** - 第四章介绍了如何在 Camel 应用程序中使用 Java Beans 来处理业务逻辑。 - **错误处理** - 第五章专门...

    Apache Camel 框架之---JMS路由.docx

    Apache Camel 框架实现的 JMS 路由是指使用 Apache Camel 框架来实现 Java 消息服务(JMS)的路由。JMS 是一个 Java API,用于在 Java 应用程序之间进行消息传递。Apache Camel 框架是一个开源的集成框架,提供了一...

    Apache Camel中文开发使用指南.zip

    4. **错误处理与事务管理**:Camel允许设置错误处理器来捕获并处理异常,比如使用`onException()`来定义全局或特定路由的错误处理策略。此外,它还支持基于XAPolicy的事务管理,确保消息传递的原子性和一致性。 5. ...

    apache-camel-1.0.0.zip

    4. **路由引擎**:基于EIP(Enterprise Integration Patterns)的Camel Engine负责执行路由规则。 5. **Spring集成**:与Spring框架紧密集成,可以在Spring配置中定义和管理Camel路由。 在"apache-camel-1.0.0.zip...

    servicemix 7安装使用及camel-cxf代理webservice

    【标题】:“servicemix 7安装使用及camel-cxf代理webservice”涉及的知识点主要涵盖Apache ServiceMix 7的安装配置、Apache Camel和Apache CXF的集成使用,以及如何利用它们来代理Web服务。 Apache ServiceMix是...

    01-ApacheCamel-HelloWorld

    Apache Camel 是一个强大的开源集成框架,它允许开发者在各种组件之间路由、转换和处理消息,以构建企业级的集成解决方案。在这个"01-ApacheCamel-HelloWorld"示例中,我们将深入理解如何使用 Camel 实现一个简单的 ...

    Apache Camel 中文开发指南.zip

    Apache Camel(http://camel.apache.org/) 是一个非常强大的基于规则的路由以及媒介引擎,该引擎提供了基于POJO的 企业应用模式(EIP--Enterprise Integration Patterns)的实现。

    Camel实战中文版第四章.pdf

    通过对《Camel实战中文版第四章》的学习,我们可以了解到Camel如何与现有的Java Bean集成,以及不同调用方式的特点和适用场景。无论是通过纯Java调用还是Spring XML配置,都各有优劣,开发者可以根据实际需求选择最合适...

    camel-java-http

    3. **Camel路由**:学习如何使用Java DSL或XML DSL定义Camel路由,以及如何在Java代码中启动和停止路由。 4. **Camel测试**:了解如何编写和执行Camel路由的测试,确保HTTP通信的正确性。 5. **Maven项目结构**:...

    Camel_应用开发文档.pdf

    Camel 提供了多种路由方式,例如基于内容的路由、基于headers 的路由等。开发者可以根据需要选择合适的路由方式。 6. Apache Camel 的使用场景 Apache Camel 的使用场景非常广泛,例如: * 企业应用集成:Camel ...

    使用CXF和camel-cxf调用webservice

    本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个全面的服务开发框架,它支持多种Web服务标准,如SOAP、WS-*协议栈、RESTful服务等。CXF提供了丰富的...

    姜宁-我和Apache Camel这些年/Years of Apache Camel and I

    总结来说,Apache Camel是一个功能强大且广泛使用的集成框架,它将复杂的消息路由和转换逻辑简化为一套简单的规则,从而让开发者能够快速且高效地实现系统之间的集成。它的版本历史展示了其稳定的发展和社区的活跃...

    亲测好用——Apache Camel简介以及使用场景.pptx.zip

    - **路由(Routes)**:Camel 路由定义了消息从源到目的地的路径,通常包含“from”和“to”端点。 - **处理器(Processors)**:在路由中,可以添加处理器来执行特定操作,如转换消息内容、过滤或聚合数据。 - *...

    Apache Camel 开发指南.rar

    这允许开发者根据消息内容、属性或外部条件进行动态路由,增强了路由的灵活性。 四、camel高级编程 在深入学习Camel时,了解其高级特性至关重要。这包括: 1. **错误处理**:Camel 提供了多种错误处理策略,如继续...

    ApacheCamel-JDBC

    Apache Camel 是一个流行的开源集成框架,它允许开发者以声明式的方式定义路由和转换数据,使得在不同的软件组件之间实现通信变得更加简单。JDBC(Java Database Connectivity)是Java平台中的一个标准API,用于与...

    [Camel实战].(Camel.in.Action).Claus.Ibsen&Jonathan;.Anstey.文字版

    - **Bean路由**:解释了如何在Camel中使用Bean路由,以及这种方式的优点和限制。 - **远程调用**:探讨了远程调用的实现机制及其应用场景。 #### 三、附加内容 - **简单表达式语言 (Simple, the expression ...

Global site tag (gtag.js) - Google Analytics