В этой статье я покажу, как добавить немного встроенных сценариев в ваши 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 bundleinstall -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
|
<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/ folder, и вы можете проверить из оболочки Karaf, что динамический вызов этих встроенных скриптов действительно произошел!
|
1
2
|
JBossFuse:karaf@root> ls (id blueprint.xml) | grep osgi.jndi.service.nameosgi.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 . |