当前位置: 首页 > 工具软件 > JBoss Fuse > 使用案例 >

jboss fuse 教程_JBoss Fuse:使用JEXL的动态蓝图文件

松英叡
2023-12-01

jboss fuse 教程

在本文中,我将展示如何在Apache Aries Blueprint xml文件中添加一些内联脚本。

我不一定会称其为最佳实践,但我一直有这样的想法:这种能力可能有用。 可能当我被迫使用xml来模拟命令式编程结构(例如使用Apache Ant时)时,我开始想要这个。

而且我发现这个想法在诸如GradleVagrant之类的项目中得到了验证,在该项目中一种完整的编程语言实际上是在变相中隐藏着,假装是特定领域的语言或令人惊讶的灵活配置语法。

在展示如何在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 KarafJBoss 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 教程

 类似资料: