jboss fuse 教程
在本文中,我将展示如何在Apache Aries Blueprint xml文件中添加一些内联脚本。
我不一定会称其为最佳实践,但我一直有这样的想法:这种能力可能有用。 可能当我被迫使用xml来模拟命令式编程结构(例如使用Apache Ant时)时,我开始想要这个。
而且我发现这个想法在诸如Gradle或Vagrant之类的项目中得到了验证,在该项目中,一种完整的编程语言实际上是在变相中隐藏着,假装是特定于领域的语言或令人惊讶的灵活配置语法。
在展示如何在JBoss Fuse中使用MVEL时,我曾经谈论过类似的事情。
这次,我将限制自己,展示如何使用可以插入到原本为静态的xml文件中的小代码段,这种技巧在您需要执行简单的操作(例如替换字符串,算术或其他任何操作)的情况下可能会有用。想要避免为此编写Java类。
让我说,我这里没有发明任何新东西。 我只是在展示如何使用Apache Aries项目直接提供的功能,但是我并没有经常使用该功能。
目的是允许您编写如下代码段:
...
<bean id="accountFactory" class="org.apache.aries.simple.AccountFactory">
<argument value="$[karaf.home.replaceAll("\\\\", "/")]">
</argument></bean>
...
您可以看到我们正在对环境变量的值调用java.lang.String.replaceAll()
方法。
我们可以感谢Apache Aries Bluerpint JEXL Evaluator,它是Apache Aries Blueprint的扩展,它实现了“扩展” Aries Blueprint基本功能的自定义令牌处理器。
在此特定情况下,它将令牌插值委托给项目Apache JEXL来完成 。
JEXL,Java表达式语言,它只是一个向Java平台公开脚本功能的库。 它的作用不是唯一的,因为您可以通过对Javascript或Groovy的本机支持实现相同的功能。 但是由于已经编写了与Blueprint的集成,因此我们将使用它,因此我们可以在Apache Karaf或JBoss Fuse实例上直接使用它。
以下说明已在JBoss Fuse 6.2.1上得到验证:
# 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
这就是我们所需的全部准备工作,现在我们只需要在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>
直接将该blueprint.xml
复制到deploy/
文件夹中,然后您可以从Karaf shell中检查那些内联脚本的动态调用实际上已经发生了!
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
当您寻找一种快速的方法来创建动态配置时,这在某些情况下可能会很有用。
如果您可能有兴趣实施自定义评估程序,则需要提供以下接口:
这是您需要公开的服务示例,以便能够在您的<property-placeholder>
节点中进行引用:
<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
jboss fuse 教程