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

jboss fuse 教程

TL; DR

  1. 将Java静态调用公开为Karaf Shell本机命令
  2. 在部署时覆盖OSGi标头
  3. 在使用OSGi片段部署时间后覆盖OSGi标头

将Java静态调用公开为Karaf Shell本机命令

作为必须与支持人员和客户进行协作的软件工程师的一部分,我经常发现自己需要从无法访问的系统中提取其他信息。 通常适用于所有软件的方法通常是提取日志,调用交互式命令以获得特定输出,或者在最复杂的情​​况下,部署一些PoC单元来验证特定行为。

JBoss Fuse和Karaf所基于的平台在公开所有这些数据方面做得非常好。

你有:

  • 大量日志并与Log4j集成
  • jmx操作的详尽列表(您最终可以使用jolokia通过http调用)
  • 大量的Shell命令

但是有时候这还不够。 如果您看过我以前有关如何在JBoss Fuse上使用Byteman的文章,则可以想象所有其他情况:

  1. 您需要打印代码中未记录或未返回的
  2. 您可能需要短路一些逻辑才能命中代码的特定执行分支
  3. 您想注入根本不存在的代码行

Byteman仍然是一个很好的选择,但是Karaf具有我们可以用来运行自定义代码的功能

Karaf,允许您直接在其shell中编写代码; 并允许您将这些代码位记录为可以重新调用的宏。 这个宏看起来像一个原生的Karaf shell命令!

让我们看一个我必须实现的真实示例:

验证运行我的JBoss Fuse实例的jvm是否正在按预期解析特定的DNS。

标准JDK具有可用来解析dns名称的方法: InetAddress.gettAllByName(String)

由于该命令非常简单,这意味着它不需要复杂或结构化的输入,我想我可以将其变成易于重用的命令:

# add all public static methods on a java class as commands  to the namespace "my_context": 
# bundle 0 is because system libs are served by that bundle classloader
addcommand my_context (($.context bundle 0) loadClass java.net.InetAddress)

该时髦的行用以下方式解释:

  • addcommand是接受新命令的karaf shell功能
  • my_context是您要附加命令的名称空间/前缀。 就我而言,“ dns”将成为一个好的名称空间。 ($.context bundle 0)调用Java代码。 特别是,我们正在调用$.context实例,该实例是Karaf shell公开的内置实例,用于暴露OSGi框架,该框架的类型为org.apache.felix.framework.BundleContextImpl ,并且正在调用其方法,称为bundle传递它的参数0表示负责加载JDK类的OSGi类加载器的ID。 该调用返回org.apache.felix.framework.Felix的实例,可用于加载所需的特定类定义,即java.net.InetAddress

正如内联注释所说, addcommand的调用公开了该类上的所有公共静态方法 。 因此,现在允许我们调用这些方法,尤其是可以解析dns条目的方法:

JBossFuse:karaf@root> my_context:getAllByName "www.google.com"
www.google.com/74.125.232.146
www.google.com/74.125.232.145
www.google.com/74.125.232.148
www.google.com/74.125.232.144
www.google.com/74.125.232.147
www.google.com/2a00:1450:4002:804:0:0:0:1014

此功能在Karaf文档页面上进行了描述。

在部署时覆盖OSGi标头

如果您与Karaf合作,那么您正在与OSGi合作,喜欢或讨厌它 。 每个OSGi工作流程中的典型步骤是使用OSGi标头 (或与之战斗)。 如果您完全控制项目,则这可能会或多或少容易,具体取决于部署单元之间的关系。 请参阅Christian Posta的帖子 ,以瞥见一些不明显的例子。

在这些情况下,一种非常典型的情况是必须使用捆绑包,您自己的捆绑包或他人的捆绑包 ,并且捆绑包头不正确 。 最终要做的通常是重新打包该捆绑包,以便您可以更改其MANIFEST的内容 ,以添加所需的OSGi标头。

Karaf在这方面具有一种设施,称为wrap协议。 您可能已经知道,这是在Karaf上部署非捆绑jar的快捷方式,但实际上不仅限于此
顾名思义,它真正要做的就是包装。 但是它可以包裹非捆绑包和捆绑包! 这意味着我们还可以使用它来更改我们将要安装的已打包捆绑包的元数据。

让我们举个例子,再次从现实生活中获得经验。 Apache HttpClient并非完全OSGi友好。 我们可以使用wrap:协议将其安装在Karaf上,并导出所有软件包

JBossFuse:karaf@root> install -s 'mvn:org.apache.httpcomponents/httpclient/4.2.5'
Bundle ID: 257
JBossFuse:karaf@root> exports | grep -i 257257 No active exported packages. This command only works on started bundles, use osgi:headers instead
JBossFuse:karaf@root> install -s 'wrap:mvn:org.apache.httpcomponents/httpclient/\ 4.2.5$Export-Package=*; version=4.2.5'
Bundle ID: 259
JBossFuse:karaf@root> exports | grep -i 259259 org.apache.http.client.entity; version=4.2.5259 org.apache.http.conn.scheme; version=4.2.5259 org.apache.http.conn.params; version=4.2.5259 org.apache.http.cookie.params; version=4.2.5
...

我们可以看到它也适用于普通捆绑包

JBossFuse:karaf@root> la -l | grep -i camel-core
[ 142] [Active     ] [            ] [       ] [   50] mvn:org.apache.camel/camel-core/2.12.0.redhat-610379
JBossFuse:karaf@root> install -s 'wrap:mvn:org.apache.camel/camel-core/2.12.0.redhat-610379\
$overwrite=merge&Bundle-SymbolicName=paolo-s-hack&Export-Package=*; version=1.0.1'
Bundle ID: 269JBossFuse:karaf@root> headers 269camel-core (269)
----------------
...Bundle-Vendor = Red Hat, Inc.
Bundle-Activator = org.apache.camel.impl.osgi.Activator
Bundle-Name = camel-core
Bundle-DocURL = http://redhat.com
Bundle-Description = The Core Camel Java DSL based routerBundle-SymbolicName = paolo-s-hackBundle-Version = 2.12.0.redhat-610379
Bundle-License = http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion = 2...Export-Package = org.apache.camel.fabric;uses:="org.apache.camel.util,org.apache.camel.model,org.apache.camel,org.apache.camel.processor,org.apache.camel.api.management,org.apache.camel.support,org.apache.camel.spi";version=1.0.1,...

在哪里可以看到Bundle-SymbolicName导出的软件包版本带有我设置的值。

再次,该功能在Karaf文档中进行了描述,您可能会发现包装协议参考非常有用。

在使用OSGi片段部署时间后覆盖OSGi标头

最后一个技巧很强大,但是如果您不想冒险让一个类加载器暴露一半的类,而让另一个类加载器暴露剩余的类(那些您可能已经在重写的Export添加的包),则可能需要您删除原始包。之一。

实际上,有一种更好的方法来覆盖OSGi标头,它直接来自OSGi标准功能: OSGi Fragments

如果您不熟悉此概念,则直接取自OSGi Wiki的定义是:

捆绑包片段,或简称为片段,是一个捆绑包,其内容可用于另一个捆绑包(片段主机)。 重要的是,片段共享其父捆绑的类加载器。

该页面还提供了有关我将要描述的内容的进一步提示:

有时,片段用于“修补”现有的捆绑包。

我们可以使用此策略来:

  • 目标包的类路径注入.jars
  • 更改目标包的标题

我用第一种情况来修复配置错误的捆绑包,该捆绑包正在寻找一个不包含它的xml配置描述符,并且我提供了部署包含此内容的轻型Fragment Bundle。

但是我想在这里向您展示的用例是对在JBoss Fuse / Karaf上部署Byteman的方式的一种改进

如果你还记得我以前的帖子 ,因为Byteman类需要可从所有其他部署包,并可能需要提供访问每一个类,我们不得不Byteman包添加到org.osgi.framework.bootdelegation属性,指示OSGi框架通过虚拟系统捆绑包(id = 0)公开列出的软件包

您可以使用headers 0来验证当前正在使用的内容,因为它是jdk扩展和框架类的一长串,所以这里不包括输出。

如果添加我的包org.jboss.byteman.rule,org.jboss.byteman.rule.exception ,即使这些包也会在该命令的输出中列出。

该解决方案的问题在于这是引导时间属性 。 如果要使用Byteman操作已经运行的实例的字节码,则必须在编辑此属性后重新启动它。

OSGi片段可以在这里提供帮助,并避免在引导时进行预配置。

我们可以构建一个没有实际内容的自定义空捆绑包,该捆绑包将附加到系统捆绑包并扩展其服务的包列表。

<Export-Package>org.jboss.byteman.rule,org.jboss.byteman.rule.exception
</Export-Package>
<Fragment-Host>system.bundle; extension:=framework
</Fragment-Host>

这是maven-bundle-plugin插件配置的摘录,有关完整的Maven项目 ,请参见此处,尽管该项目实际上只是pom.xml 30行:

JBossFuse:karaf@root> install -s mvn:test/byteman-fragment/1.0-SNAPSHOT

一旦有了该配置,就可以使用Byteman,例如,在java.lang.String默认构造函数中插入一行。

# find your Fuse process id
PROCESS_ID=$(ps aux | grep karaf | grep -v grep | cut -d ' ' -f2)# navigate to the folder where you have extracted Byteman
cd /data/software/redhat/utils/byteman/byteman-download-2.2.0.1/# export Byteman env variable:
export BYTEMAN_HOME=$(pwd)
cd bin/# attach Byteman to Fabric8 process, no output expected unless you enable those verbose flags
sh bminstall.sh -b -Dorg.jboss.byteman.transform.all $PROCESS_ID 
# add these flags if you have any kind of problem and what to see what's going on: -Dorg.jboss.byteman.debug -Dorg.jboss.byteman.verbose# install our Byteman custom rule, we are passing it directly inline with some bash trick
sh bmsubmit.sh /dev/stdin <<OPTS# smoke test rule that uses also a custom output file
RULE DNS StringSmokeTest
CLASS java.lang.String
METHOD <init>()
AT ENTRY
IF TRUE
DO traceln(" works: " );
traceOpen("PAOLO", "/tmp/byteman.txt");
traceln("PAOLO", " works in files too " );
traceClose("PAOLO");
ENDRULEOPTS

现在,要验证Byteman是否正常工作,我们只需在Karaf shell中调用java.lang.String构造函数即可:

JBossFuse:karaf@root> new java.lang.Stringworks:

按照我们的规则,您还将在/tmp/byteman.txt看到内容

第三个技巧的灵感来自OSGi Wiki和Spring的这个有趣的页面 。

翻译自: https://www.javacodegeeks.com/2015/02/jboss-fuse-less-known-trick.html

jboss fuse 教程

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

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

相关文章

8条嵌入式C语言编程小知识总结

1. 流水线被指令填满时才能发挥最大效能&#xff0c;即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转&#xff0c;流水线会被清空&#xff0c;这将需要几个时钟才能使流水线再次填满。因此&#xff0c;尽量少的使用跳转指令可以提高程序执行效率&#xff0c…

c语言函数的三种调用方式是什么?

函数的三种调用方式&#xff1a;1、函数作为表达式中的一项出现在表达式中&#xff0c;例“zmax(x,y)”&#xff1b;2、函数作为一个单独的语句&#xff0c;例“printf("%d",a)”&#xff1b;3、函数作为调用另一个函数时的实参&#xff0c;例“printf("%d"…

CF1913D. Array Collapse [dp+单调栈+前缀和]

传送门 [前题提要]:感觉dp还是很显然的,感觉单调栈也不是很难想,但是VP的时候脑子比较乱,dp方程想偏了,没写出来… 看完题目,不难发现应该存在一种递推关系.因为会发现最后剩下来的必然是原序列的一种子序列,然后这种子序列计数的问题.应该想到使用dp计数. 刚开始我的想法是使…

弱口令扫描工具mysql ftp_基于端口的弱口令检测工具--iscan

iscan: 基于端口的弱口令检测工具亲手打造了一款基于端口的弱口令检测工具&#xff0c;使用python进行编写&#xff0c;主要可以用于渗透测试中常见服务端口弱口令的检测。目前支持以下服务&#xff1a;系统弱口令&#xff1a;ftp、ssh、telnet、ipc$数据库弱口令&#xff1a;m…

javafx 剪切板_JavaFX技巧18:路径剪切

javafx 剪切板我最近注意到&#xff0c;我致力于ControlsFX项目的PopOver控件无法正确剪切其内容。 当我为FlexCalendarFX框架开发手风琴弹出窗口时&#xff0c;这一点变得显而易见。 每当最后一个标题窗格扩展时&#xff0c;其底角不再是圆角而是正方形。 在标题窗格中放置一个…

用于单片机的几种C语言算法

单片机主要作用是控制外围的器件&#xff0c;并实现一定的通信和数据处理。虽然单片机不擅长实现算法和进行复杂的运算&#xff0c;但在某些特定场合&#xff0c;不可避免地要用到数学运算。比如&#xff1a;在单片机进行数据采集时&#xff0c;会遇到数据的随机误差&#xff0…

jmh 基准测试_JMH:如何设置和运行JMH基准

jmh 基准测试健康警告&#xff01; 这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知&#xff0c;微基准测试很难正确设置&#xff0c;即使您确实正确设置了&#xff08;通过使用JMH之类的工具&#xff09;&#xff0c;它们仍然会产生误导。 仅仅因为您的代码在极端孤…

java super是什么意思_java中Super到底是什么意思?必须举例说明!

[学习笔记]3."超"关键字(super keyword)Super是一个参考(或说指针)指向他紧邻的父类(见下面的例子)。用super可以指向被隐藏的父类的同名成员。3.1 super指向父类的成员注意&#xff1a; 下例中&#xff1a;子类和父类都有i&#xff0c;我们一共有两个i&#xff0c;用…

嵌入式开发中C语言编程要点简述!

在嵌入式Linux的C语言开发中&#xff0c;C语言的基本编程依然是最重要的内容。除此之外&#xff0c;与一般的C语言编程相比&#xff0c;嵌入式Linux的C语言编程有以下一些要点&#xff1a;1、库函数与系统调用在进行C语言编程的时候&#xff0c;使用库函数是不可避免的。关于使…

java编译源文件_在java编程中用什么命令来编译java源文件 可以将源文件编译成字节码文件,求答案 。...

展开全部答案如下&#xff1a;1 、javac 选 A2、 int 选 D int 为关键字3、 4 选 B4、 15 选C5 、界面类型 选D6 、age[0] 选B7、 class 选A8 、java B9、 abstract 选B10 、false 选D1、 错&#xff0c;区分大小写2、 对3 、错e68a843231313335323631343130323136353331333365…

jdk8分组统计字段和_JDK 8流和分组

jdk8分组统计字段和我在JDK 8中的Stream-Powered Collections Functionality中介绍了将JDK 8的Streams与Java集合一起使用的强大功能。 我没有在那篇文章中讨论groupingBy Collector 减少操作的使用&#xff0c;因此在这篇文章中解决了分组问题。 本文中的示例将演示如何将集合…

C语言中,break和continue都是跳出循环,有啥区别?

首先说明&#xff1a;continue 只能用于循环语句中&#xff0c;而break可用于循环和 switch 语句&#xff0c;两者都是辅助循环&#xff1b;尽管如此&#xff0c;如果 switch 语句在一个循环中&#xff0c;continue便可作为 switch 语句的一部分&#xff1b;这种情况下&#xf…

java隐藏与覆盖_java中方法的隐藏和覆盖问题?

ok()方法在继承时候发生覆盖(重写)了吗&#xff1f;发生了。在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature)&#xff0c;所以在这里发生了重写。调用B类对象的ok()方法会print "b"&#xff0c;父类方法被覆盖。如果是重写了&#xff0c;那定义一…

junit junit_使用junit做其他事情

junit junitjunit&#xff01;单元测试 Junit是Java单元测试框架。 通常&#xff0c;我们将它用于单元测试&#xff0c;但是很多时候我们也使用它来执行集成测试。 主要区别在于&#xff0c;单元测试测试单个单元&#xff0c;而集成测试则测试不同类如何协同工作。 这样&#x…

C 的 3种内存顺序,你都知道吗?

1、std::memory_order_relaxed “自由”内存顺序在原子类型上的操作以自由序列执行&#xff0c;没有任何同步关系&#xff0c;仅对此操作要求原子性。例如&#xff0c;在某一线程中&#xff0c;先写入A&#xff0c;再写入B。但是在多核处理器中观测到的顺序可能是先写入B&#…

java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总

在Java面试中常遇到的技术问题汇总 如果你正准备参加Java开发岗位面试,那么你会遇到很多有关多线程的面试问题。为什么呢?因为多线程和并发问题已经成为Java面试中必不可少的一部分。大多数企业在面试的时候都喜欢用棘手的Java线程面试题来考察面试者,他们希望确保面试者对J…

在邮件标头中找到无效的字符_在实践中重试HTTP标头

在邮件标头中找到无效的字符Retry-After是鲜为人知的HTTP响应标头。 让我引用RFC 2616&#xff08;HTTP 1.1规范&#xff09;的相关部分&#xff1a; 14.37重试后 Retry-After响应标头字段可与503 &#xff08; 服务不可用 &#xff09;响应一起使用&#xff0c;以指示请求客…

C 常见的面试知识点(上)

const 作用1&#xff0c;修饰变量&#xff0c;说明该变量不可以被改变2&#xff0c;修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&#xff09;3&#xff0c;修饰引用&…

brew下载的mysql卸载_Mac中mongoDB的安装与卸载步骤详解

前言MongoDB 是一个基于分布式文件存储的数据库&#xff0c;旨在为 web 应用提供可扩展的高性能数据存储解决方案。本文主要介绍的是关于在mac中安装卸载mongoDB数据库的方法&#xff0c;更多关于mongoDB的使用大家可以参考这篇文章&#xff1a;https://www.jb51.net/article/7…

java 指令重拍_我发现我的Java重拍了!

java 指令重拍在一月份&#xff0c;我写了一篇文章&#xff0c;介绍了一些我希望在Java语言中看到的变化&#xff0c;这些变化会让我更加喜欢它&#xff08;并使它变得更现代&#xff09;。 很多人建议使用许多JVM语言&#xff0c;但我很大程度上不予理会&#xff0c;因为这不是…