首页 > Web开发 > 详细

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

时间:2016-05-23 02:03:27      阅读:269      评论:0      收藏:0      [点我收藏+]

本实验的配置文件 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 动态路由以及HttpServletRequest/Reponse的使用

原文:http://iwin.iteye.com/blog/2298797

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!