在WildFly上将JPA和CDI Bean与骆驼一起使用
我并沒有真正為此計劃,但是在一個免費的會議月份中,我有機會進行了一些深入的探討,并向您展示了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
總結
以上是生活随笔為你收集整理的在WildFly上将JPA和CDI Bean与骆驼一起使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring rmi_Spring远程支
- 下一篇: 《星球大战:黑暗原力》复刻版上架 Ste