JBoss Fuse:使用JEXL的动态蓝图文件
在本文中,我將展示如何在Apache Aries Blueprint xml文件中添加一些內(nèi)聯(lián)腳本。
我不一定會稱其為最佳實(shí)踐,但我一直認(rèn)為這種功能可能有用。 可能當(dāng)我被迫使用xml來模擬命令式編程結(jié)構(gòu)(例如使用Apache Ant時(shí))時(shí),我開始想要這個(gè)。
而且我發(fā)現(xiàn)這個(gè)想法在諸如Gradle或Vagrant之類的項(xiàng)目中得到了驗(yàn)證,在該項(xiàng)目中,一種完整的編程語言實(shí)際上是在變相中隱藏著,假裝是特定于領(lǐng)域的語言或令人驚訝的靈活配置語法。
在展示如何在JBoss Fuse中使用MVEL時(shí),我曾經(jīng)談?wù)撨^類似的事情。
這次,我將限制自己,展示如何使用可以插入到您原本為靜態(tài)的xml文件中的小代碼段,這種技巧在您需要執(zhí)行簡單的操作(例如替換字符串,算術(shù)符號或其他任何操作)的情況下可能會有用。想要避免為此編寫Java類。
讓我說,我這里沒有發(fā)明任何新東西。 我只是在展示如何使用Apache Aries項(xiàng)目直接提供的功能,但是我并沒有經(jīng)常使用該功能。
目的是允許您編寫如下代碼段:
...<bean id="accountFactory" class="org.apache.aries.simple.AccountFactory"> <argument value="$[karaf.home.replaceAll("\\\\", "/")]"> </argument></bean> ...您可以看到我們正在對環(huán)境變量的值調(diào)用java.lang.String.replaceAll()方法。
我們可以感謝Apache Aries Bluerpint JEXL Evaluator,它是Apache Aries Blueprint的擴(kuò)展,它實(shí)現(xiàn)了“擴(kuò)展” Aries Blueprint基本功能的自定義令牌處理器。
在此特定情況下,它將令牌插值委托給項(xiàng)目Apache JEXL來完成 。
JEXL,Java表達(dá)式語言,它只是一個(gè)向Java平臺公開腳本功能的庫。 它的功能不是唯一的,因?yàn)槟梢酝ㄟ^對Javascript或Groovy的本機(jī)支持實(shí)現(xiàn)相同的功能。 但是由于已經(jīng)編寫了與Blueprint的集成,因此我們將使用它,因此我們可以在我們的Apache Karaf或JBoss Fuse實(shí)例上直接使用它。
以下說明已在JBoss Fuse 6.2.1上得到驗(yàn)證:
# install JEXL bundle install -s mvn:org.apache.commons/commons-jexl/2.1.1 # install JEXL Blueprint integration: install -s mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.jexl.evaluator/1.0.0這就是我們需要的所有準(zhǔn)備工作,現(xiàn)在我們只需要在Bluerpint文件中使用正確的XSD版本1.2.0 :
xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"完成后,我們可以通過以下方式利用功能:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0" xsi:schemalocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"><ext:property-placeholder system-properties="override" evaluator="jexl" placeholder-prefix="$[" placeholder-suffix="]"><bean id="myString" class="java.lang.String"><argument value="1"></argument></bean><service interface="java.lang.CharSequence" ref="myString"><service-properties><entry key="osgi.jndi.service.name" value="$[karaf.home.toUpperCase()]___$[1+2]"></entry></service-properties></service> </ext:property-placeholder></blueprint>將那個(gè)blueprint.xml直接復(fù)制到deploy/文件夾中,然后您可以從Karaf shell中檢查那些內(nèi)聯(lián)腳本的動態(tài)調(diào)用實(shí)際上已經(jīng)發(fā)生了!
JBossFuse:karaf@root> ls (id blueprint.xml) | grep osgi.jndi.service.name osgi.jndi.service.name = /OPT/RH/JBOSS-FUSE-6.2.1.REDHAT-107___3當(dāng)您尋找一種快速的方法來創(chuàng)建動態(tài)配置時(shí),這在某些情況下可能很有用。
如果您可能對實(shí)現(xiàn)自定義評估程序感興趣,則需要提供以下接口:
- https://github.com/apache/aries/blob/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java
這是您需要公開的服務(wù)的示例,以便能夠在您的<property-placeholder>節(jié)點(diǎn)中進(jìn)行引用:
<service interface="org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator"><service-properties><entry key="org.apache.aries.blueprint.ext.evaluator.name" value="jexl"></entry></service-properties><bean class="org.apache.aries.blueprint.jexl.evaluator.JexlPropertyEvaluator"> </bean></service>翻譯自: https://www.javacodegeeks.com/2016/05/jboss-fuse-dynamic-blueprint-files-jexl.html
總結(jié)
以上是生活随笔為你收集整理的JBoss Fuse:使用JEXL的动态蓝图文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot和Spring数据
- 下一篇: 手机如何发起ddos攻击(手机如何发起d