在 Java EE 组件中使用 Camel Routes

摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes。

【编者按】作者 Markus Eisele 是 Red Hat 的 Developer Advocate,主要从事 JBoss Middleware 相关研究,拥有超过14年的 Java EE 工作经验。本篇博文中, Markus 主要分享了基于 Java EE 组件的 Camel Routes 应用实践。

以下为译文:

在生产环境中使用 Camel 有一段时间后,我愈发的喜欢上它的简单。在 Java EE 上使用它确实存在一些挑战,而在最近一次演讲中我也提到了如何实现这一点。在 Java EE 中,我们可以通过不同的途径来使用 Camel 的,其中比较推荐的是使用 WildFly-Camel 子系统。在接下来的一个系列中,我将探索实现它的不同方法,并提供一些在演讲中没有涉及的例子。很期待能够通过留言或者在 Twitter上@myfear 的方式获得你的反馈和提问。

Camel On WildFly 8.2入门

WildFly-Camel 子系统提供了 Apache Camel 和 WildFly 应用服务器的集成环境。它允许你添加 Camel Routes(路由)作为 WildFly 配置的一部分。Routes 可以作为 Java EE 应用程序的一部分部署。Java EE 组件能够使用 Camel 的核心 API 和多个 Camel Component APIs。你的企业级集成解决方案可以架构于 Java EE 和 Camel 的联合功能之上。

备注:最新的 WildFly9 预期将由 WildFly-Camel 的 3.x 版本支持。

准备阶段

下载并解压 WildFly 8.2.0.Final 到你指定的目录下,下载并解压 wildfly-camel patch(2.3.0) 到 wildfly 目录下。通过以下命令启动 WildFly:

bin/standalone[.bat|.sh] -c standalone-camel.xml

最快速的启动和运行方式是使用 Docker 和 WildFly Camel image。这里的 image 需要预先安装好 WindFly8.1 和 Camel 子系统。

定义和使用Camel Context

CamelContext 代表着一个 Camel 路由规则库。使用 CamelContext 和使用 Spring ApplicationContext 的方式是十分相似的。它包含针对你应用的所有路由。你可以根据需求使用任意数量的 CamelContext,当然它们需要使用不同的名称来定义。

WildFly-Camel 可以通过下面3种不同的方式定义和部署:

  1. 在 standalone-camel.xml 和 domain.xml 中作为子系统的一部分来定义;
  2. 在一个支持它们的 deployment artifact 进行部署,当然这个 deployment artifact 必须包含后缀为 -camel-context.xml 的文件;
  3. 通过 RouteBilder 和 CDI integration 定义部署并提供路由信息。

一个定义的 CamelContext 可以通过两种不同的方式被使用:

  1. 通过Camel-CDI注入
  2. 通过 JNDI 树进入。

Context 和 Route 示例

在接下来的例子中,我将使用一个关联路由的 context,通过 CDI 和 RouteBuilder 提供。是一个应用级别的 bean,在应用启动的时候自动启动。@ContextName 注解给了 CamelContext 一个特定的名字。

@ApplicationScoped
@Startup
@ContextName("cdi-context")
public class HelloRouteBuilder extends RouteBuilder {

    @Inject
    HelloBean helloBean;

    @Override
    public void configure() throws Exception {
        from("direct:start").transform(body().prepend(helloBean.sayHello()).append(" user."));
    }
 }

路由本身并不真的具有挑战性。它有一个空的信息主体 from direct:start 并且用 CDI bean 方法 "sayHello" prepends 输出,再 append 字符串" user."。作为参照,完整的代码可以在我的GitHub(https://github.com/myfear/camel-javaee)中找到。因此,接下来我们需要知道的是,如何在各种Java EE组件中使用这个路由。

在 CDI 中使用 Camel

Camel 自从2.10 版本即支持 CDI。在没有子系统之前,它需要被 bootstrapped。不过现在不需要了,你可以仅仅用一个已部署或者已定义的 CamelContext 在 @Named CDI bean 中通过简单的 @Injecting 注入它的 name 实现。

@Inject
    @ContextName("cdi-context")
    private CamelContext context;

在 JSF、JAX-RS 和 EJBs 中使用 Camel

在 Java EE 组件中使用 Camel Routes
在 Java EE 组件中使用 Camel Routes

有了对在 CDI 中如何使用 CamelContext 的了解,你可能会想,在 类似 JSF 中使用应该一样的简单,事实却并不如此——你无法将它注入 ManagedBeans 或者和 JSF 组件绑定的 CDI Beans。此外,它在 EJB 中也不能使用。这里我并没有深挖细节,但是认为它在边界控制上确实需要改进。一个合理的解决方法,事实上,更好的应用程序设计是将一个完整的 Camel 逻辑放入一个单独的 CDI bean 并且注入。

@Named
public class HelloCamel {

    @Inject
    @ContextName("cdi-context")
    private CamelContext context;

    private final static Logger LOGGER = Logger.getLogger(HelloCamel.class.getName());

    public String doSomeWorkFor(String name) {

            ProducerTemplate producer = context.createProducerTemplate();
        String result = producer.requestBody("direct:start", name, String.class);
        LOGGER.log(Level.INFO, result);
        return result;
    }
}

ProducerTemplate 接口允许你从 Java 代码发送信息交换到 endpoint,通过多种不同的方式使得同 Camel Endpoint 实例协作非常容易。在这种特殊情况下,它仅仅是启动路由并且添加上代表我使用组件名称的字符串到 body 中。

CDI Bean,对于使用它的组件来说扮演着 backing-bean 的角色:

@Inject
    HelloCamel helloCamel;

    public String getName() {
            return helloCamel.doSomeWorkFor("JSF");
}

返回的字符串是 "Hello JSF user.",同时也写进了 WildFly 的服务器日志。对于其他 Java EE 组件来讲这个方法同样是最好的。

在 EJB 中使用 Camel

如果你正在使用EJB作为你的主要应用组件模块,那么使用JNDI方法也是合理的:

CamelContext camelctx = 
             (CamelContext) inicxt.lookup("java:jboss/camel/context/cdi-context");

Hawtio:一个 Camel 控制台

在子系统中另一个隐藏的宝贝就是 Hawtio 控制台。这是一个模块化的 Web 控制台,用来管理你的 Java 组件,它有一个 Apache Camel 插件来可视化你的上下文和路由信息。记住,它是自动配置的,安全起见,你在使用它之前需要先添加一个管理用户。


在 Java EE 组件中使用 Camel Routes
在 Java EE 组件中使用 Camel Routes

原文地址:Using Camel Routes In Java EE Components

本文系 OneAPM 工程师编译整理。OneAPM 是应用性能管理领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 官方博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 可能没有人去想过为什么我们一天是24小时 而不是18小时或者26小时呢?但我今天读了刘润老师这篇三八理论明白时间是...
    缪青霞阅读 233评论 0 1
  • 作者:九尾白狐 我相信, 云层之外一定有一个仙境, 那里有会飞的鱼和会说话的独角兽。...
    九尾白猫阅读 330评论 2 4