jboss fuse 教程

最近,我重新发现了我已经忘记的JBoss Fuse功能,并且我认为其他人可能会从此提醒中受益

这篇文章将重点放在JBoss Fuse和Fabric8上,所有正在寻找最小侵入性方法来为其静态配置文件添加一定程度的动态支持的开发人员也可能会感兴趣。

在OSGi和Fabric8中进行动态配置的想法

OSGi框架因其类加载行为而经常被人们记住。 但其中一部分还定义了框架必须实现的其他概念和功能。 其中之一是ConfigAdmin

ConfigAdmin是一项服务,用于定义逻辑上绑定到部署单元的一组外部化的属性文件。

此外部属性文件的生命周期与OSGi捆绑软件生命周期链接: 如果您修改外部属性文件,则将通知您的捆绑软件 。 根据您对捆绑软件进行编码的方式,您可以决定对通知做出React,并以编程方式或通过不同的帮助程序框架(例如,蓝图) 来调用使用新配置的代码。

这种机制既方便又强大,并且所有使用OSGi的开发人员都熟悉它。

Fabric8以ConfigAdmin的思想为基础,并对其进行了扩展

Fabric8通过其配置功能定义了概要文件的概念,该概要文件封装了部署单元和配置。 它在普通OSGi的基础上增加了一层功能,并且允许管理任何种类的部署单元,不仅包括OSGi捆绑软件,还包括任何种类的配置或静态文件。

如果查看官方文档,则会找到Fabric8层提供的“扩展”列表,并且您会发现它们主要分为两类: Url Handlers和Property Resolvers 。

我建议对本技术感兴趣的每个人都仔细阅读本文档。 但是要提供一个简短的摘要和一个简短的示例,请假设您的Fabric概要文件具有使用特定占位符在运行时解析某些值的功能。 例如

# sample url handler usage, ResourceName is a filename relative to the namespace of the containing Profile:
profile:ResourceName# sample property handler, the value is read at deploy time, from the Apache Zookeeper distributed registry that is published when you run JBoss Fuse
${zk:/fabric/registry/containers/config/ContainerName/Property}

开箱即用有多个处理程序,涵盖了开发人员认为最常见的用例:Zookeeper,配置文件,蓝图,Spring,系统属性,受管端口等。

而且,您可能还想扩展定义自己的扩展的机制:例如,您可能想对存储在某个系统上的性能指标作出React,您可以编写一个扩展,并使用其语法约定从系统中注入值。

所有这些功能的限制:静态配置文件

我上面介绍的功能令人兴奋且强大,但是它们有一个隐含的限制它们仅适用于.properties文件或Fabric可以识别的文件

这意味着,如果您必须管理Fabric Profile,OSGi属性或与之交互的其他特定技术(例如Camel),则这些功能可用,但是对于Fabric-Unaware而言它们未启用任何功能

假设您有读取.xml配置文件的自定义代码。 并想象您的代码没有引用任何Fabric对象或服务。

您的代码将按原样处理该.xml文件。 标记或路径不会有任何魔术替代,因为尽管您在Fabric内部运行,但您并未使用任何直接支持的技术,也未在通知Fabric时可能需要其服务。

解决此问题,您有3种选择

  1. 您为Fabric 编写了扩展 ,以处理和识别您的静态资源,并将动态替换委派给框架代码。
  2. 您可以更改部署单元中包含的代码 ,而不是直接消耗静态资源,而是要求Fabric服务为您内插它们
  3. *您使用mvel:网址处理程序(并避免触摸任何其他代码!)

什么是MVEL?

MVEL实际上是一种编程语言 : https : //en.wikipedia.org/wiki/MVEL 。 特别是,它也是脚本语言 ,您可以从源代码直接运行而跳过编译步骤。

实际上,它具有多个特定的特性,可能使其很有趣地嵌入到另一个应用程序中,并在运行时用于定义新的行为。 例如,由于所有这些原因,它也是JBoss Drools项目支持的语言之一,可与您可能希望在运行时定义或修改的业务规则一起使用。

为什么对我们有用? 主要有两个原因:

  1. 它可以很好地用作模板语言
  2. Fabric8已经有一个mvel: url处理程序,它隐式地还充当资源处理程序!

模板语言

模板语言是那些语言家族(通常是领域特定语言),您可以在其中更改按原样阅读的文本的静态部分和将在解析时处理的动态指令 。 我可能以更复杂的方式说出了我上面已经介绍过的相同想法:您可以在文本中包含标记,这些标记将按照特定的约定进行翻译。

这听起来完全像我们上面介绍的处理程序所提供的功能。 有一个重要的区别:尽管那些是上下文特定的处理程序,但MVEL是一种通用技术。 因此,不要指望它对Zookeeper或Fabric概要文件有任何了解,而是希望它能够支持通用编程语言概念,例如循环,代码调用,反射等。

面料支持它!

可以在以下位置找到对Fabric中支持的参考: http : //fabric8.io/gitbook/urlHandlers.html

但是,让我添加一个实现该功能的原始代码的一段,因为即使在JBoss Fuse的上下文之外,这也是您可能会发现这种方法很有趣的部分: https : //github.com/fabric8io/fabric8/blob/1 .x / fabric / fabric-core / src / main / java / io / fabric8 / service / MvelUrlHandler.java#L115-L126

public InputStream getInputStream() throws IOException {assertValid();String path = url.getPath();URL url = new URL(path);CompiledTemplate compiledTemplate = TemplateCompiler.compileTemplate(url.openStream());Map<String, Object> data = new HashMap<String, Object>();Profile overlayProfile = fabricService.get().getCurrentContainer().getOverlayProfile();data.put(“profile”, Profiles.getEffectiveProfile(fabricService.get(), overlayProfile));data.put(“runtime”, runtimeProperties.get());String content = TemplateRuntime.execute(compiledTemplate, data).toString();return new ByteArrayInputStream(content.getBytes());
}

这里发生了什么事?

首先,由于未在代码段中显示,因此请记住这是一个网址处理程序。 这意味着针对通过特定uri引用的文件触发了行为获取。 在这种情况下,它就是mvel: 例如,有效路径可能是mvel:jetty.xml

另一个有趣且相对简单的注意事项是与MVEL解释器的交互。 像大多数模板技术一样,即使是您可以自己实现的最简单的技术,也通常具有:

  • 引擎/编译器,这里是TemplateCompiler
  • 包含模板的变量,这里是url
  • 代表上下文的变量,即您要向引擎公开的一组变量,此处为data

将它们放在一起,要求引擎完成它的工作,在这里使用TemplateRuntime.execute(...) ,您在输出中得到的是一个静态String。 不再使用模板指令,而是应用了模板定义的所有逻辑,并最终从上下文中获取了一些附加的输入值。

一个例子

我希望我的解释足够简单,但是可能有一个例子是表达这一概念的最佳方法。

让我们使用JBoss Fuse default.profile包含的jetty.xml ,它是JBoss Fuse不会作为任何特殊文件处理的静态资源,因此它不提供任何替代功能。

我将在这里展示MVEL集成的两个方面:从上下文变量中读取一些值,并展示如何使用编程逻辑(这里只是2个整数的和):

<Property name="jetty.port" default="@{  Integer.valueOf( profile.configurations['org.ops4j.pax.web']['org.osgi.service.http.port'] ) + 10  }"/>

我们正在修改Jetty端口的默认值,其初始值来自“配置文件”上下文变量,该变量是可识别结构的对象,可以访问其余配置:

profile.configurations['org.ops4j.pax.web']['org.osgi.service.http.port']

我们将其从String显式转换为Integer:

Integer.valueOf( ... )

并将静态值10添加到返回值中:

.. + 10

让我们保存文件,停止我们的fuse实例。 重新启动它并重新创建测试结构:

# in Fuse CLI shell
shutdown -f# in bash shell
rm -rf data instancesbin/fuse# in Fuse CLI shell
fabric:create --wait-for-provisioning

只需等待并监视日志,然后…… 呃。 一个错误! 发生了什么?

这是错误:

2015-10-05 12:00:10,005 | ERROR | pool-7-thread-1  | Activator                        | 102 - org.ops4j.pax.web.pax-web-runtime - 3.2.5 | Unable to start pax web server: Exception while starting Jetty
java.lang.RuntimeException: Exception while starting Jetty
at org.ops4j.pax.web.service.jetty.internal.JettyServerImpl.start(JettyServerImpl.java:143)[103:org.ops4j.pax.web.pax-web-jetty:3.2.5]
…
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)[:1.7.0_76]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)[:1.7.0_76]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)[:1.7.0_76]
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)[:1.7.0_76]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:572)[96:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:396)[96:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
…
Caused by: java.lang.NumberFormatException: For input string: “@{profile.configurations[’org.ops4j.pax.web'][‘org.osgi.service.http.port’] + 1}”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)[:1.7.0_76]
at java.lang.Integer.parseInt(Integer.java:492)[:1.7.0_76]
at java.lang.Integer.<init>(Integer.java:677)[:1.7.0_76]
… 29 more

如果您注意到此错误消息,则说明我们的模板片段无法转换为Number

为什么我们的模板代码片段会在第一个实例中显示? 模板引擎应该完成其工作的一部分,并给我们返回一个静态String,而无需任何对模板指令的引用!

我已经故意向您显示此错误,以坚持我上面描述的概念,但是在初审中可能不会被理解。

Fabric中对MVEL的支持是作为url处理程序实现的。

到目前为止, 我们只是修改了静态资源文件的内容,但没有向Fabric提供任何暗示,我们希望将该文件作为mvel模板进行处理。

怎么做?

只是使用正确的uri引用同一文件即可。

因此,修改文件default.profile/org.ops4j.pax.web.properties ,该文件位于默认Fabric Profile中,您可以在其中定义哪个静态文件包含Jetty配置:

# change it from org.ops4j.pax.web.config.url=profile:jetty.xml to
org.ops4j.pax.web.config.url=mvel:profile:jetty.xml

现在,再次停止实例,删除Fabric配置文件,重新创建Fabric,并注意您的Jetty实例如何正确运行。

我们可以通过以下方式进行检查:

JBossFuse:karaf@root> config:list | grep org.osgi.service.http.portorg.osgi.service.http.port = 8181

从浏览器中,您可以验证是否可以通过端口8191访问部署在Jetty顶部的JBoss Fuse Web控制台Hawtio: http:// localhost:8191 / hawtio

翻译自: https://www.javacodegeeks.com/2015/10/jboss-fuse-turn-your-static-config-into-dynamic-templates-with-mvel.html

jboss fuse 教程

jboss fuse 教程_JBoss Fuse –使用MVEL将您的静态配置转换为动态模板相关推荐

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

    jboss fuse 教程 在本文中,我将展示如何在Apache Aries Blueprint xml文件中添加一些内联脚本. 我不一定会称其为最佳实践,但我一直有这样的想法:这种能力可能有用. 可 ...

  2. jboss fuse 教程_JBoss Fuse –一些鲜为人知的技巧

    jboss fuse 教程 TL; DR 将Java静态调用公开为Karaf Shell本机命令 在部署时覆盖OSGi标头 在使用OSGi片段部署时间后覆盖OSGi标头 将Java静态调用公开为Kar ...

  3. jboss fuse 教程_使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

    jboss fuse 教程 红帽公司最近发布了一个微服务集成工具包,用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务. 为了帮助人们更好地理解这一点,我将Rid ...

  4. jboss fuse 教程_IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)

    jboss fuse 教程 这只是一篇博客文章,具有更多的商业性质,但是您不能一无所有. 实际上,这也是使Apache Camel保持活力并保持良好状态的原因,这还归功于其商业上的成功. 希望从JBo ...

  5. jboss fuse 教程_在JBoss Fuse / Fabric8 / Karaf中使用Byteman

    jboss fuse 教程 您是否曾经尝试了解一些简单的东西不起作用的过程? 您正在任何众所周知的上下文中编写代码,无论出于何种原因它都无法正常工作. 而且您信任您的平台,因此您认真阅读了所有日志. ...

  6. mysql data文件夹恢复_【专注】Zabbix源码安装教程—步骤详解(2)安装并配置mysql...

    四.安装并配置mysql(1) 解压mysql-5.7.26.tar.gz与boost_1_59_0.tar.gz #tar -xvf mysql-5.7.26.tar.gz #tar -xvf bo ...

  7. QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文步骤

    引用:https://www.cnblogs.com/chenmingjun/p/8392713.html QT5.10.0安装教程图文教程以及安装成功QT5.10.0后环境配置图文教程 文章目录 Q ...

  8. Anaconda使用教程(一)——下载、安装及环境配置

    Windows系统Anaconda使用教程(一)--下载.安装及环境配置 文章目录 Windows系统Anaconda使用教程(一)--下载.安装及环境配置 1. 下载网址 方法1 方法2 2. 安装 ...

  9. 尚硅谷Docker实战教程-笔记02【安装docker、镜像加速器配置】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表[课程资料下载] 视频地址:尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01[理念简介 ...

最新文章

  1. Nacos系列:Nacos的三种部署模式
  2. Python脚本完美解决Linux环境解压.zip文件乱码问题
  3. sqlserver 日常检查脚本
  4. 暴雪还不赶快?劳拉与光之守护者PC平台登陆
  5. Gridcontrol新增行选中有关问题
  6. JAVA学习博客---2015.5
  7. Hadoop Hive概念学习系列之hive的正则表达式初步(六)
  8. 数据结构与算法2——线性顺序存储
  9. java时间转化类,一小时前,刚刚一个月前
  10. c ++结构体构造函数_C ++中的构造函数
  11. MyBatis 别名标签 sql的复用
  12. php Excel报表,Excel报表生成的方案 PHPExcel
  13. 淘宝客高手必备的14大WordPress插件
  14. 电脑翻页时钟屏保Fliqlo
  15. 选择华为帐号作为第三方登录的三个理由!
  16. 金士顿8GU盘量产实录
  17. win2003 序列号
  18. android中base64编码解码,Andorid自带的Base64编解码表
  19. mysql复杂查询的书_mysql 复杂查询
  20. 华为荣耀20青春版能升级鸿蒙吗,荣耀20 Pro系统要不要升级?

热门文章

  1. P4764-[CERC2014]Pork barrel【主席树,LCT,最小生成树】
  2. codeforces1467 E. Distinctive Roots in a Tree(树上差分)
  3. codeforces1457 C. Bouncing Ball
  4. Codeforces Round #658 (Div. 2)
  5. 邓公数据结构C++语言版学习笔记1
  6. 【栈】【字符】匹配(jzoj 1612)
  7. Java 并发总结——进程与线程
  8. 如何快速开发一个 Dubbo 应用
  9. LinkedList 的实现原理浅析
  10. MybatisPlus学习(四)条件构造器Wrapper方法详解