В этой статье я покажу, как добавить немного встроенных сценариев в ваши 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
|
< 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.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 . |