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

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 教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql客户库_你应该知道的10个MySQL客户启动选项

大部分服务器管理员知道MySQL数据库管理系统(RDBMS)是高度灵活的软件块&#xff0c;带有范围广阔的启动选项&#xff0c;可以用来修改相关行为。然而&#xff0c;大部分人却不清楚&#xff0c;标准MySQL客户端带有同等大量的启动选项&#xff0c;其中一些在日常MySQL交互作用中…

java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)

java实现ldap服务器本教程将向您展示如何编写Java代码以与LDAP交互。 但是在执行此操作之前&#xff0c;我们需要在计算机上设置LDAP服务器和客户端。 如果此时您不确定到底是什么LDAP&#xff0c;建议您使用这篇文章&#xff0c;其中提供了一个很好的定义示例。 &#xff08;…

java 程序增加 防盗_防盗Java EE –保护Java EE企业应用程序的安全

java 程序增加 防盗redev离我们仅有几天的路程&#xff0c;我受邀作了两次演讲。 其中之一是关于我最喜欢的主题&#xff1a;安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需…

php对mysql基础操作_php+mysql的基础操作

标签&#xff1a;PHP可以说是当下很火的一门后端语言了,它小巧玲珑,和html等前端语言配合的可以说是天衣无缝,加之xampp,wampp等工具的出现,更是前端开发者的福音,作为一名前端ER,如果不熟悉一门后端语言的话,那简直都不好意思说自己要加薪,那么我们对于php这门语言学习时,如果…

js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

js内存泄露 垃圾回收Java内存架构&#xff08;Java内存模型&#xff09; 上面是堆的Java内存模型以及Java虚拟机&#xff08;JVM&#xff09;中运行的任何Java应用程序的PermGen。 还提供了比率&#xff0c;以使您更好地了解如何在每种生成类型之间分配允许的内存。 以上所有内…

qlineedit文本改变时_PyQt5 QLineEdit(单行编辑器) 学习

QLineEdit is a widget that allows to enter and edit a single line of plain text. There are undo and redo, cut and paste, and drag & drop functions available for the widget.代码&#xff1a;# codingutf-8from PyQt5.QtWidgets import QApplication, QWidget,\…

jboss7.0.2_红帽JBoss企业应用平台7.0 ALPHA发布了!

jboss7.0.2红帽JBoss企业应用程序平台7&#xff08;JBoss EAP 7&#xff09;是基于开放标准构建并符合Java Enterprise Edition 7规范的中间件平台。 它将WildFly Application Server 10与高可用性群集&#xff0c;消息传递&#xff0c;分布式缓存和其他技术集成在一起。 现在可…

java数组和list_Java中的数组和List

一.数组Array1.数组在内存中是连续存储的&#xff0c;所以它的索引速度是非常的快&#xff0c;而且赋值与修改元素也很简单2.声明数组的时候&#xff0c;必须同时指明数组的长度&#xff0c;数组的长度过长&#xff0c;会造成内存浪费&#xff0c;数组和长度过短&#xff0c;会…

sts集成jboss_与JBoss BPM Travel Agency更新了Modern BPM数据集成

sts集成jboss不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍…

java规则表达式_Java基础--正则表达式的规则

注意&#xff1a;正则表达式只关注格式是否正确&#xff0c;不关注内容是否有效。一、字符集合&#xff0c; []表示一个字符。1、[abc] :指a,b,c中的任意一个字符。2、[^abc]:指除了a,b,c外的任意字符。3、[a-z]&#xff1a;表示a到z间的任意一个字符。4、[a-zA-Z0-9]:表示a到z…

获取http请求标头_HTTP请求和标头参数的CDI拦截器–简单示例

获取http请求标头在使用Java EE开发和发展REST API的过程中&#xff0c;有些情况下您希望以更精细的方式&#xff08;视情况&#xff09;对传入的HTTP请求&#xff08;特别是标头参数&#xff09;进行“观察” Servlet过滤器或更具体的ContainerRequestFilters 。 我发现在某些…

java多线程区别_Java中实现多线程的两种方式之间的区别

Java提供了线程类Thread来创建多线程的程序。其实&#xff0c;创建线程与创建普通的类的对象的操作是一样的&#xff0c;而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程&#xff0c;有两种方法&#xff1a;◆需要从Java.lang.Thre…

詹金斯搭建_与詹金斯一起将GitLab中的Gradle项目发布到Artifactory

詹金斯搭建我将详细展示如何定期构建您的项目&#xff0c;然后如何进行发布。 它涉及许多工具的协作&#xff0c;我发现很难正确设置这些工具&#xff0c;这就是我编写此代码的原因。 目标 我将向您展示如何实现以下两种方案。 第一个是如何进行常规开发的非发行版&#xff1a…

java socket优化_Java Socket编程代码优化

1.问题&#xff1a;在学习Java的Socket编程&#xff0c;写了一些代码练习&#xff0c;但是又不知道是否规范&#xff0c;是否有优化的空间&#xff1f;2.代码&#xff1a;package com.nekolr.socket;import com.google.common.util.concurrent.ThreadFactoryBuilder;import jav…

java 函数式编程_Java函数式编程:Javaslang入门

java 函数式编程Java是一门古老的语言&#xff0c;并且该领域中有很多新手在他们自己的领域&#xff08;JVM&#xff09;上挑战Java。 但是Java 8到来并带来了一些有趣的功能。 这些有趣的功能使编写新的惊人框架&#xff08;例如Spark Web框架或Javaslang&#xff09;成为可能…

java 线程组作用_Java线程组(ThreadGroup)使用

JDK 对线程组类注释&#xff1a;A thread group represents a set of threads. In addition, a thread group can also include other thread groups. The thread groups form a tree in which every thread group except the initial thread group has a parent.A thread is a…

web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件

web.xml.jsf让我们直接跳到很酷的东西上&#xff0c;说在JSF 2.0中&#xff0c;通过在Facelet标记库&#xff08; *taglib.xml &#xff09;中对其进行配置&#xff0c;使页面作者可以使用自定义组件。 此外&#xff0c;当将组件映射到JAR中时&#xff0c;需要在web.xml一个特殊…

java左上角图标太小_Eclipse在高分屏下图标过小的解决方法

自己败了一台Surface Pro 4&#xff0c;打算用来看PDF、练代码。安装了Eclipse并且打开之后&#xff0c;发现图标显示极其细小&#xff0c;肉眼几乎无法看清了。这是由于Eclipse对高分屏没有作适配导致的。Windows 10本身对于高分屏的支持已是相当不错&#xff0c;苏菲4的屏幕分…

java胜任理由_Java在几乎所有方面均能胜任本机响应

java胜任理由我与一位同事讨论了Java与JavaScript的话题&#xff0c;这是一个有问题的话题。 然后他提到React Native多么出色&#xff0c;我决定我必须研究一下&#xff0c;也许要为Codename One掌握一些想法…… 那里有一些不错的主意&#xff0c;但是它们都不是革命性的或例…

java发送文件_java 模拟http发送文件和参数

一、maven&#xff1a;org.apache.httpcomponentshttpmime4.5.3二、工具类&#xff1a;import java.io.File;import java.util.Map;import java.util.Map.Entry;import org.apache.http.*;import org.apache.http.client.HttpClient;import org.apache.http.client.config.Requ…