我并没有真正为此计划,但是在一个免费的会议月份中,我有机会进行了一些深入的探讨,并向您展示了WildFly-Camel子系统提供的WildFly魔术上的更多Camel。
商业背景
该演示来自Christina Lin在JBoss Demo-Central上的演示 。 她演示了Camel中File和JDBC连接器的用法,还添加了Spilled模式和Exception处理方法的用法。 该演示的场景是模拟银行帐户之间的交易过程。 输入是一个包含多个事务的批处理XML文件。 这些可以是现金存款,现金提取或银行帐户的转账信息。 根据交易的类型,它们会被散布起来,并且每笔交易都会从数据库中检索相关信息,进行交易并计算交易费用,然后再将其放回数据库中。
- 您可以在GitHub上找到完整的原始源代码 。
我为什么触摸它
原因:我实际上不想考虑新的业务案例。 而且,不仅仅是在技术层面上向您展示一些细腻的细节。 因此,我认为仅从克里斯蒂娜(Christina)那里获得成功就是一个捷径。 其次,她正在基于Karaf并使用XML DSL进行路由定义的Fuse中做所有事情。 我只是一个可怜的Java人,并且学会了讨厌XML。 另外,她正在使用几个组件,而我在Java EE上下文中不会使用。
先决条件–部署应用程序
在开始演示之前,请确保已将WildFly 8.2.0.Final与WildFly-Camel子系统补丁2.2.0一起安装 。 现在,可以将我的github帐户上的演示存储库派生到您选择的目录中。 它不过是带有一些其他依赖项的Maven Java EE 7项目。 只要做一个:
mvn clean install
并将生成的target / javaee-bankdemo-1.0-SNAPSHOT.war部署到WildFly服务器。
此示例中没有任何UI,因此您基本上必须观看日志文件并在其中复制xml文件。 src \ main \ in-data文件夹包含bank.xml,您需要将其复制到standalone \ data \ inbox文件夹中。 第二步完成,骆驼开始了。
客户状态
一切都始于标准的Java EE应用程序。 实体CustomerStatus保存帐户信息(ID,VipStatus,余额)。 它还具有一些NamedQueries。 看起来完全不是骆驼特有的。 WildFly用作默认数据库的内存中H2数据库在三个脚本的帮助下进行了预填充,这三个脚本在persistance.xml中配置为架构生成属性。 我在这里与两个客户一起工作,分别是A01和A02。
骆驼和Java EE
在这种情况下,骆驼自举非常简单。 BankRouteBuilder具有@ContextName(“ cdi-context”)批注,它本身是应用程序范围内的启动bean,其中包含小演示所需的所有路由。 随时重新阅读并了解其他可能的选项,以部署/配置路由 。 hawt.io控制台(http:// localhost:8080 / hawtio /)很好地显示了它们。 该应用程序有五条路线。
ReadFile是第一个,它基本上仅准备好xml文件,并将各个条目( 由xPath表达式拆分 )推入processTransaction路由。
这个决定是“现金”交易还是“转移”交易。 分别以“ direct:doTransfer ”或“ direct:processCash ” 结尾 。 我将所有原始xml路由定义留在BankRouteBilder中作为注释。 如果您搜索特定的解决方案,可能会有所帮助。
保险丝演示的差异
Christina经常使用Camel JDBC组件 。 它完成了所有繁重的工作,甚至完成了初始的数据库设置。 这是我们在任何地方都不想做的事情,尤其是在Java EE环境中,在该环境中我们可以使用所有JPA magic。 实际上,有一个Camel JPA componente ,但是它非常有限,并且不真正支持NamedQueries或类似名称。
解决此问题的一种非常有效的方法是使用具有所有bean绑定的Camel Bean组件和已经集成的cdi组件。 所有数据库访问都通过CustomerStatusService进行管理。 基本上,这是一个@Named bean,它注入了EntityManager并知道如何加载CustomerStatus实体。 只需在bean端点中引用它即可将其注入到RouteBuilder中:
.to("bean:customerService?method=loadCustomer")
我同意,幕后发生了很多魔术,而CustomerStatusService依赖于Camel类这一事实是我不喜欢的另一件事。 但这可以通过将服务@ Inject-注入路由并以类似方式引用来轻松解决。 我决定不这样做,因为我想让Christina演示的最初流程保持活力。 她经常与交易所合作,并依赖它们。 因此,我更接近她的榜样。
关于交易的话
我实际上在此示例中使用扩展的持久性上下文,并将服务中的updateCustomer方法标记为@Transactional 。 这是一种将完整和更新的CustomerStatus实体合并回数据库的非常简单的方法。 整个doTransfer路由现在都不是事务性的。 即使第二个客户不在系统中,该金额仍将从第一个客户帐户中提取。 我想在稍后的阶段和单独的博客文章中介绍。
现在就这样。 享受您的周末,并与Camel和WildFly Camel子系统一起玩。 很高兴通过@myfear或在博客文章中发表评论来接收您的想法或问题。
翻译自: https://www.javacodegeeks.com/2015/07/using-jpa-and-cdi-beans-with-camel-on-wildfly.html