Camel 动态启停路由

        Camel动态启停路由的实现思路。首先将路由定义class存入表中,作为基础数据使用。当tomcat启动完成后,我们启动一个定时任务,让他读取表中所有需要启动的路由,然后利用反射技术动态生成路由实例,将该实例注册到camelContext中。到此tomcat的启动全部完成,我们启用的路由也全部加载了。

         第二步,提供一个全部路由的展示页面,在该页面中提供路由的启动和停用button。当一个停用路由button被按下时。我们首先找到该路由对应的是表中的那条记录,并从记录中找到该路由的routeId,利用camelContext中提供的停止和移除路由操作,来停用该路由。如果是启动路由button被按下时,操作处理同tomcat启动时动态加载是一样的,只不过这时我们只针对一个路由进行处理。

下面看代码

首先是工程结构


CamelRouteContraller.java

package contraller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import service.CamelRouteService;

@Controller
@RequestMapping("crc/")
public class CamelRouteContraller {

	@Autowired
	CamelRouteService service;

	/**
	 * 路由启动按钮处理
	 * @return
	 */
	@RequestMapping("start")
	public String startRoute() {
		service.routeStart();
		return null;
	}

	/**
	 * 路由停用按钮处理
	 * @return
	 */
	@RequestMapping("stop")
	public String stopRoute() {
		service.routeStop();
		return null;
	}
}

CamelRouteContralMapper.java

package dao;
import java.util.List;
import model.CamelRouteContral;

public interface CamelRouteContralMapper {

	// 取得全部启用路由
	public List<CamelRouteContral> getAllUseRoutes();
	
//	public CamelRouteContral getRouteByRouteName(String routeName);
	
	// 更行路由routteId
	public void updateRouteRouteIdByRouteName(CamelRouteContral crc);
	
//	public void updateRouteUseFlagByRouteName(String routeName);
}

CamelRouteStart.java

package job;
import java.util.List;
import model.CamelRouteContral;
import org.apache.camel.CamelContext;
import org.apache.camel.Route;
import org.apache.camel.builder.RouteBuilder;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import dao.CamelRouteContralMapper;

public class CamelRouteStart implements Job {

	@Autowired
	private CamelContext camelContext;
	
	@Autowired
	CamelRouteContralMapper mapper;
	
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {}
	
	public void execute() throws JobExecutionException {
		try {
			// 取全部使用中路由
			List<CamelRouteContral> lst = mapper.getAllUseRoutes();
			
			for (CamelRouteContral crcResult : lst) {
				// 利用反射将路由添加到camelContext中
				String className = crcResult.getClassName();
				Class routeClass = Class.forName(className);
				
				camelContext.addRoutes((RouteBuilder)routeClass.newInstance());
				
				// 取得添加到camelContext中路由的routeId
				List<Route> lstR = camelContext.getRoutes();
				String routeId = lstR.get(lstR.size()-1).getId();
				
				// 将routeId更新回DB
				CamelRouteContral crc = new CamelRouteContral();
				crc.setRouteName(crcResult.getRouteName());
				crc.setRouteId(routeId);
				mapper.updateRouteRouteIdByRouteName(crc);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

CamelRouteContralMapper.xml

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.CamelRouteContralMapper">
	<resultMap type="model.CamelRouteContral" id="ResultMap">
		<result column="routeName" property="routeName" />
		<result column="routeType" property="routeType" />
		<result column="routeId" property="routeId" />
		<result column="useFlag" property="useFlag" />
		<result column="className" property="className" />
	</resultMap>

	<select id="getAllUseRoutes" resultMap="ResultMap" >
		select * from camelroutecontral where useFlag = '1'
	</select>
	
	<update id="updateRouteRouteIdByRouteName" parameterType="model.CamelRouteContral">
		update camelroutecontral set routeId = #{routeId} where routeName = #{routeName}
	</update>
	
</mapper>

CamelRouteContral.java

package model;

public class CamelRouteContral {

	private String routeName;
	private String routeType;
	private String routeId;
	private String useFlag;
	private String className;
	
	public String getRouteName() {
		return routeName;
	}
	public void setRouteName(String routeN
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值