在 Java EE 组件中使用 Camel 路由

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

我使用 Camel 已经有一段时间了,我真的很喜欢它的简单性。在 Java EE 上使用它总是有点挑战,我最近发表的关于如何做到这一点的演讲之一以及在 Java EE 中引导 Camel 的不同方法实际上建议使用 WildFly-Camel 子系统 。在一个正在进行的系列中,我将探索执行此操作的不同方法,并提供一堆在演讲中仍然缺少的示例。我很高兴在评论中或通过推特上的 @myfear 收到您的反馈和请求。


在 WildFly 8.2 上开始使用 Camel

Wildfly-Camel 子系统提供 Apache Camel 与 WildFly 应用服务器的集成。它允许您将 Camel Routes 添加为 WildFly 配置的一部分。路由可以作为 Java EE 应用程序的一部分进行部署。 Java EE 组件可以访问 Camel 核心 API 和各种 Camel 组件 API。您的企业集成解决方案可以构建为 Java EE 和 Camel 功能的组合。

备注:WildFly-Camel 3.x 版本预计将支持最新的 WildFly 9。


做好准备

下载 WildFly 8.2.0.Final 并将其解压缩到您选择的文件夹中。下载并解压 wildfly-camel 补丁 (2.3.0) 到 wildfly 文件夹。开始 WildFly


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

启动和运行的最快方法之一是使用 Docker 和 WildFly Camel 映像 。此图像与 WildFly 8.1 捆绑在一起,并且已经安装了 Camel 子系统。

定义和使用 Camel 上下文

CamelContext 表示单个 Camel 路由规则库。您以类似于 Spring ApplicationContext 的方式使用 CamelContext。它包含您的应用程序的所有路由。您可以根据需要拥有任意数量的 CamelContext,只要它们具有不同的名称即可。 WildFly-Camel 让您将它们定义为 a) 在 standalone-camel.xml 和 domain.xml 中作为子系统定义本身的一部分和 b) 或将它们部署在 包含 -camel-context.xml 后缀文件的受支持的部署工件 中c) 它可以通过 RouteBilder 和 CDI 集成 与其路由一起提供。

定义的 CamelContext 可以通过两种不同的方式使用:a) @Injected via Camel-CDI 或 b) 从 JNDI 树 访问。


示例上下文和路由

对于以下示例,我使用了一个上下文以及通过 CDI 和 RouteBuilder 提供的关联路由。它是一个应用程序范围的 bean,随着应用程序的启动而自动启动。 @ContextName 注释为 CamelContext 指定了一个特定的名称。


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

路线本身并不十分具有挑战性。它从 direct:start 获取一个空的消息体,并在 CDI bean 方法“sayHello”的输出前加上字符串“user”。给它。作为参考,完整的代码可以在 我的 GitHub 帐户 上找到。所以,接下来我们需要弄清楚的是,如何在各种 Java EE 组件规范中使用这条路线。


从 CDI 使用 Camel

Camel 从 2.10 版本开始支持 CDI。在子系统之前和之外,它需要被引导。这不再是必需的,您只需按名称 @Injecting 即可在 @Named CDI bean 中使用部署或定义的 CamelContext:


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


从 JSF、JAX-RS 和 EJB 使用 Camel

有了关于如何在 CDI 中使用 CamelContext 的知识,您会假设,从 JSF 等中做同样的事情很容易。这不是真的。实际上,您不能将它注入到绑定到 JSF 组件的 ManagedBean 甚至 CDI Beans 中。另外,它在 EJB 中不起作用。我没有详细研究它,但假设它与范围有关。一个合理的解决方法,事实上,一个更好的应用程序设计是将完整的 Camel 逻辑放入一个单独的 CDI bean 中,然后注入它。


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

ProducerTemplate 接口允许您以各种不同的方式将消息交换发送到端点,以便从 Java 代码轻松使用 Camel Endpoint 实例。在这种特殊情况下,它只是启动路由并将一个 String 放入主体中,该主体代表我正在使用它的组件的名称。

CDI Bean,充当组件的支持 bean,只使用它:


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

返回的字符串是“你好 JSF 用户”。这也被写入 WildFly 服务器日志。对于所有其他 Java EE 组件,同样的方法是最好的。


从 EJB 使用 Camel

如果您使用 EJB 作为您的 man 应用程序组件模型,那么仅使用 JNDI 方法也是非常合理的:


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


Hawtio - 骆驼控制台

子系统中的另一个隐藏的宝石是 Hawtio 控制台的捆绑。它是一个模块化的 Web 控制台,用于管理您的 Java 内容,并有一个 Apache Camel 插件,可以可视化您的上下文和路由。请记住,它是自动配置的安全性,您需要先添加管理用户才能访问它。



进一步阅读和帮助

与 Freenode 上的开发人员交谈

WildFly-Camel 子系统文档

GitHub 上的 WildFly 骆驼

阿帕奇骆驼网站