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