文档章节

Apache Camel加载路由源码(扫描包路径方式)分析及注意事项

傲娇字符
 傲娇字符
发布于 05/16 14:42
字数 663
阅读 16
收藏 0
点赞 0
评论 0

1.添加依赖包

gradle依赖:

compile 'org.apache.camel:camel-spring:2.20.3'

2.添加Spring配置信息

spring-camel.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">

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <packageScan>
            <package>com.chz.apps.esb.camel.routes</package>
            <excludes>**.*Excluded*</excludes>
            <includes>**.*</includes>
        </packageScan>
    </camelContext>
</beans>

com.chz.apps.esb.camel.routes包是用于存放camel的路由类

3.编写路由类(错误的类)

此处使用本地文件往ftp自动上传文件为例:

package com.chz.apps.esb.camel.routes;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

/**
 * 本地文件往服务器自动同步机制
 */
@Component
public class FileTransFtpRouteBuilder extends RouteBuilder {

    @Override
    public void configure() {
        from("file:D:\\tmp\\camel")
        .to("ftp:ftpUsername:ftpPassword@192.168.9.175");
    }
}

4.问题描述

上面的builder是参考《Apache Camel Developer's Cookbook》第23页实例编写。每次启动的时候,会发现创建的route并没有添加到Camel的CamelContext中,也就是说路由并没有生效。

经过源码分析,Apache Camel在于Spring进行集成的时候,使用CamelContextFactoryBean进行相关Bean实例的统一管理。而使用packageScan进行启动时,需要调用如下方法:

@Override
    protected void findRouteBuildersByPackageScan(String[] packages, PackageScanFilter filter, List<RoutesBuilder> builders) throws Exception {
        // add filter to class resolver which then will filter
        getContext().getPackageScanClassResolver().addFilter(filter);

        PackageScanRouteBuilderFinder finder = new PackageScanRouteBuilderFinder(getContext(), packages, getContextClassLoaderOnStart(),
                                                                                 getBeanPostProcessor(), getContext().getPackageScanClassResolver());
        finder.appendBuilders(builders);

        // and remove the filter
        getContext().getPackageScanClassResolver().removeFilter(filter);
    }

finder.appendBuilders(builders);此方法用于扫描包路径下面所有类,如果不是Spring的bean,则使用路由初始化方法,加载到Camel容器中。而书中提到使用Component注解后,会导致此处自动过滤掉:

在dubug的时候,日志如下:

[MI TCP Connection(3)-127.0.0.1] efaultPackageScanClassResolver DEBUG Searching for implementations of org.apache.camel.RoutesBuilder in packages: [com.chz.apps.esb.camel.routes]
[MI TCP Connection(3)-127.0.0.1] efaultPackageScanClassResolver DEBUG Found: [class com.chz.apps.esb.camel.routes.FileTransFtpRouteBuilder]
[MI TCP Connection(3)-127.0.0.1] DefaultListableBeanFactory     DEBUG Returning cached instance of singleton bean 'fileTransFtpRouteBuilder'
[MI TCP Connection(3)-127.0.0.1] PackageScanRouteBuilderFinder  DEBUG Ignoring RouteBuilder class: class com.chz.apps.esb.camel.routes.FileTransFtpRouteBuilder

通过分析源码(PackageScanRouteBuilderFinder.shouldIgnoreBean方法),只要是Spring已经加载的bean,此处不会做任何处理。所以正确的方式应该是去掉Component注解。

/**
     * Appends all the {@link org.apache.camel.builder.RouteBuilder} instances that can be found on the classpath
     */
    public void appendBuilders(List<RoutesBuilder> list) throws IllegalAccessException, InstantiationException {
        Set<Class<?>> classes = resolver.findImplementations(RoutesBuilder.class, packages);
        for (Class<?> aClass : classes) {
            LOG.trace("Found RouteBuilder class: {}", aClass);

            // certain beans should be ignored
            if (shouldIgnoreBean(aClass)) {
                LOG.debug("Ignoring RouteBuilder class: {}", aClass);
                continue;
            }

            if (!isValidClass(aClass)) {
                LOG.debug("Ignoring invalid RouteBuilder class: {}", aClass);
                continue;
            }

            // type is valid so create and instantiate the builder
            @SuppressWarnings("unchecked")
            RoutesBuilder builder = instantiateBuilder((Class<? extends RoutesBuilder>) aClass);
            if (beanPostProcessor != null) {
                // Inject the annotated resource
                beanPostProcessor.postProcessBeforeInitialization(builder, builder.toString());
            }
            LOG.debug("Adding instantiated RouteBuilder: {}", builder);
            list.add(builder);
        }
    }

 protected boolean shouldIgnoreBean(Class<?> type) {
        Map<String, ?> beans = applicationContext.getBeansOfType(type, true, true);
        if (beans == null || beans.isEmpty()) {
            return false;
        }
        return true;
    }

5.编写路由类(正确的类)

package com.chz.apps.esb.camel.routes;

import org.apache.camel.builder.RouteBuilder;

/**
 * 本地文件往服务器自动同步机制
 */
public class FileTransFtpRouteBuilder extends RouteBuilder {

    @Override
    public void configure() {
        from("file:D:\\tmp\\camel")
        .to("ftp:ftpUsername:ftpPassword@192.168.9.175");
    }
}

© 著作权归作者所有

共有 人打赏支持
傲娇字符
粉丝 4
博文 36
码字总数 13903
作品 0
武汉
架构师
selenium+js处理display属性为none

Author='jolting' Date='2018-05-09' 故事and事故 故事是这样开始的,正在写自动化测试用例,然后执行,报错啦~ ,原因就在这个导入按钮上,来来,给展示一下这个元素,下图那货↓ 目前针对它...

麻辣烫里面放麻花 ⋅ 05/09 ⋅ 0

物联网:数据淘金——从数据中挖掘有效信息

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 如今是信息时代,得数据者得天下。然而,只是“有”数据还不够,数据的“准确性”和数据的“分析”也是至关重要的。爱因斯坦也说...

腾讯云+社区 ⋅ 05/14 ⋅ 0

使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组建返回类型, 之前使用的是ViewModel, 如果想返回结...

solenovex ⋅ 04/08 ⋅ 0

mybatis-plus 2.3 发布:以后停止维护,代号:终结者

mybatis-plus 2.3 发布,mybatis-plus 是一款 mybatis 动态 SQL 自动注入 mybatis 增删改查 crud 操作中间件, 减少你的开发周期优化动态维护 xml 实体字段。 代号:终结者!! I will be ba...

青苗 ⋅ 05/16 ⋅ 25

springboot的后台系统的初步搭建

springboot的后台系统的初步搭建 基于springboot的设备管理系统的架构搭建 使用工具:idea 数据库:mysql 相关技术:shiro mybatis activemq等 (1) 新建项目 new project ,idea有专门的sprin...

代金券优惠 ⋅ 04/15 ⋅ 0

[译] 更可靠的 React 组件:清楚易懂的可表达性

原文摘自:https://dmitripavlutin.com/7-architectural-attributes-of-a-reliable-react-component/ 对于一个 意义明确(meaningful) 的组件,是易于理解其行为的。 不要低估代码可读性的重...

江米小枣tonylua ⋅ 06/21 ⋅ 0

adb怎么判断是否有root权限,并更改system/app内容

一、首先判断root权限: 二、更改system/app内容 一般情况下system/app都会出现read only,所以需要adb remount(这是一个重新mount你的分区的命令,让system分区从只读变成可读可写,获得了roo...

TreasureWe ⋅ 03/15 ⋅ 0

瞩目!2018 Google Play Awards 提名名单揭晓

今年 Google Play Awards 将会在美国时间 5 月 7 日 (周一) 举行颁奖,并为为期一周的 Google I/O 盛事拉开帷幕。在这第三个年头,我们精心设计了 9 大奖项,有一些奖项大家已经很熟悉了,有...

谷歌开发者 ⋅ 04/27 ⋅ 0

架构设计:系统间通信(38)——Apache Camel快速入门(下1)

======================= (接上文《架构设计:系统间通信(37)——Apache Camel快速入门(中)》) 3-5-2-3循环动态路由 Dynamic Router 动态循环路由的特点是开发人员可以通过条件表达式等...

yinwenjie ⋅ 2016/07/04 ⋅ 0

架构设计:系统间通信(42)——自己动手设计ESB(3)

==================================================== (接上文《架构设计:系统间通信(41)——自己动手设计ESB(2)》) 4-2-3、业务层与Class文件管理 zookeeper控制模块的业务相关层(...

yinwenjie ⋅ 2016/07/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 38分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 40分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部