Статьи

JBoss Fuse: динамические файлы Blueprint с JEXL

В этой статье я покажу, как добавить немного встроенных сценариев в ваши XML-файлы Apache Aries Blueprint .

Я бы не назвал это обязательно лучшей практикой, но у меня всегда была мысль, что эта возможность может быть полезной; вероятно, я начал хотеть этого, когда мне пришлось использовать xml для имитации структур императивного программирования, как при использовании Apache Ant .

И я нашел эту идею обоснованной в таких проектах, как Gradle или Vagrant, где полный язык программирования фактически скрыт , притворяясь языком, специфичным для предметной области, или удивительно гибким синтаксисом конфигурации.

В прошлом я говорил о чем-то похожем, когда показывал, как использовать MVEL в JBoss Fuse .
На этот раз я ограничусь тем, что покажу, как использовать небольшие фрагменты кода, которые могут быть встроены в ваши статические XML-файлы, — трюк, который может оказаться полезным в случае, если вам нужно выполнить простые операции, такие как замена строк, арифметика или что-то еще, кроме вас. хочу избежать написания Java-класса для этого.

Позвольте мне сказать, что я не изобретаю здесь ничего нового. Я просто показываю, как использовать функциональность, которая была предоставлена ​​непосредственно проектом Apache Aries, но которую я не часто использовал там.

Цель состоит в том, чтобы позволить вам написать фрагмент так:

1
2
3
4
5
...
 <bean id="accountFactory" class="org.apache.aries.simple.AccountFactory"
     <argument value="$[karaf.home.replaceAll("\\\\", "/")]"> 
</argument></bean>
...

Вы можете видеть, что мы java.lang.String.replaceAll() метод java.lang.String.replaceAll() для значения переменной среды.

Мы можем сделать это благодаря Apache Aries Bluerpint JEXL Evaluator, расширению Apache Aries Blueprint , который реализует собственный токен-процессор, который «расширяет» базовую функциональность Aries Blueprint.

В этом конкретном случае он делает это, делегируя токен интерполяции проекту Apache JEXL .

JEXL, Java Expression Language, это просто библиотека, которая предоставляет возможности сценариев для Java-платформы. Он не уникален в том, что он делает, поскольку вы можете достичь того же самого с помощью встроенной поддержки Javascript или, например, Groovy. Но мы собираемся использовать его, так как интеграция с Blueprint уже написана, поэтому мы можем сразу использовать его на нашем экземпляре Apache Karaf или JBoss Fuse .

Следующие инструкции были проверены на JBoss Fuse 6.2.1:

1
2
3
4
# 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

Это была вся подготовка, в которой мы нуждались, теперь нам просто нужно использовать правильную версию XSD 1.2.0 в нашем файле Bluerpint:

Сделав это, мы можем использовать функциональность следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
  
    <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/ folder, и вы можете проверить из оболочки Karaf, что динамический вызов этих встроенных скриптов действительно произошел!

1
2
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> :

1
2
3
4
5
6
7
<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>
Ссылка: JBoss Fuse: динамические файлы Blueprint с JEXL от нашего партнера JCG Паоло Антинори в блоге Someday Never Comes .