在WildFly上将JPA和CDI Bean与骆驼一起使用

我并没有真正计划,但在一个免费的会议月份中,我有机会进行了一些深入的探讨,并向您展示了WildFly-Camel子系统提供的WildFly魔术上的更多Camel。

商业背景

该演示来自Christina Lin在JBoss Demo-Central上的演示 。 她演示了Camel中File和JDBC连接器的用法,还添加了Spilled模式和Exception处理方法的用法。 该演示的场景是模拟银行帐户之间的交易过程。 输入是一个包含多个事务的批处理XML文件。 这些可以是现金存款,现金提取或银行帐户的转账信息。 根据交易的类型,它们会被散布起来,并且每笔交易都会从数据库中检索相关信息,进行交易并计算交易费用,然后再将其放回数据库中。

我为什么触摸它

原因:我实际上不想考虑新的业务案例。 而且,不仅仅是在技术层面上向您展示一些细腻的细节。 因此,我认为仅从克里斯蒂娜(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值