在JBoss Fuse / Fabric8 / Karaf中使用Byteman

您是否曾经尝试过了解一些非常简单的方法不起作用的过程?

您正在任何众所周知的上下文中编写代码,无论出于何种原因它都无法正常工作。 而且您信任您的平台,因此您认真阅读了所有日志。
而且,您仍然不知道为什么某些行为不符合预期。

通常,如果我有幸从事开放源代码项目,那么接下来要做的就是开始阅读代码 。 多次工作; 但是几乎总是没有编写该代码。 而且您不太了解该产品。 所以,是的,您可以看到上下文中有哪个变量。 您不知道它们可能的值 ,更糟糕的是,您不知道这些值在何处创建甚至何时创建。

此时,我通常要做的是与调试器连接。 我永远不会记住Java进程需要允许调试的JVM参数,但是我知道我已经在某个地方编写了这些参数。 而且现代IDE可以向我建议这些,因此远程连接到复杂的应用程序服务器并不是什么大麻烦。

好的,我们已连接。 我们可以在离我们认为重要的部分不远的地方放置一个断点,并逐步遍历代码。 最终增加了更多的优势。 IDE 变量视图使我们可以在上下文中查看变量的值。 我们甚至可以浏览整个对象树并调用代码片段,以防对象的普通内存状态无法真正提供所需的准确信息(假设您要格式化Date或过滤集合)。

我们拥有所有工具,但是……这是一个缓慢的过程 。 每次我在特定的断点处停止时,都必须手动浏览变量。 我知道,我们可以通过监视变量来改善这种情况,这些变量始终位于概述窗口的顶部,并让您快速查看已确定的重要内容。 但是我个人发现, 只有在变量很少的情况下 ,监视才有意义 :由于它们都共享相同的名称空间,因此当您不在一个范围内时,会看到许多未设置的值,这只会分散您的视线变量。

我最近学到了一种技巧,可以改善与您共享的这些工作流程,以防您不了解:

IntelliJ ,甚至是Eclipse ,都具有巧妙的技巧,使您可以在通过断点时添加打印语句 。 如果将其与防止断点暂停结合起来,则有一种不错的方法,可以通过日志调用来扩展正在调试的代码。

对于IntelliJ,请在此处检查:http://www.jetbrains.com/idea/webhelp/enabling-disabling-and-removing-breakpoints.html

breakpointDisable1

而对于Eclipse而言,请检查以下技巧:http://moi.vonos.net/2013/10/adhoc-logging/或让我知道是否有更清洁或更新颖的方法来达到相同的结果。

上面的技巧有效。 但是它的主要缺点是您正在向工作空间添加本地配置 。 您不能轻易与他人分享此内容。 您可能希望将工作空间重新用于其他会话,并且看到所有这些日志条目或断点会分散您的注意力

因此,在寻求IDE的外部支持时,我决定尝试Byteman 。

Byteman实际上提供的功能远远超出我这次所需的功能,这可能是我决定了解是否可以在Fabric8中使用它的主要原因。

快速回顾一下Byteman的工作,直接摘自其文档:

Byteman是一个字节码操作工具,它使在加载时或应用程序运行时更改Java应用程序的操作变得简单。
它可以工作,而无需重写或重新编译原始程序。

提供:

  • 跟踪特定代码路径的执行并显示应用程序或JVM状态
  • 通过更改状态,进行计划外的方法调用或强制意外返回或抛出来破坏正常执行
  • 安排由独立应用程序线程执行的活动的时间安排
  • 监视和收集汇总应用程序和JVM操作的统计信息

在我的特定情况下,我将使用列出的行为中的第一个,但是您可以很容易地猜到所有其他方面可能会在某个时候变得很方便:

  • 添加一些逻辑来防止NullPointerException
  • 短路一些逻辑,因为您遇到的错误不在代码库中,但您仍然想看看如果不存在该错误会发生什么
  • 可以想象的其他任何事情……

开始使用Byteman通常特别容易 。 您甚至没有被迫使用特定的指令来启动您的jvm。 您可以只附加到已经运行的进程! 这在大多数情况下都有效,但是不幸的是,由于OSGi的影响,在默认配置下不适用于Karaf。 但不用担心,该功能仅是简单的配置编辑

您必须编辑文件:

$KARAF_HOME/etc/config.properties

并添加此2包到proprerty org.osgi.framework.bootdelegation

org.jboss.byteman.rule,org.jboss.byteman.rule.exception

该属性用于指示osgi框架从父Classloader的那些包中提供类。 参见http://felix.apache.org/site/apache-felix-framework-configuration-properties.html

这样,您将避免在触发Byteman规则时引发ClassCastException

这几乎是我们在Fuse上使用Byteman所需的所有额外工作。

这是我与平台互动的实际示例

# assume you have modified Fabric8's config.properties and started it and that you are using fabric8-karaf-1.2.0-SNAPSHOT# find your Fabric8 process id
$ ps aux | grep karaf | grep -v grep | cut -d ' ' -f3
5200# 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 5200 # add this 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 rules
$ sh bmsubmit.sh ~/Desktop/RBAC_Logging.btm
install rule RBAC HanldeInvoke
install rule RBAC RequiredRoles
install rule RBAC CanBypass
install rule RBAC UserHasRole
# invoke some operation on Fabric8 to trigger our rules:
$ curl -u admin:admin 'http://localhost:8181/jolokia/exec/io.fabric8:type=Fabric/containersForVersion(java.lang.String)/1.0' 
{"timestamp":1412689553,"status":200,"request":{"operation...... very long response}# and now check your Fabric8 shell:OBJECT: io.fabric8:type=FabricMETHOD: containersForVersionARGS: [1.0]CANBYPASS: falseREQUIRED ROLES: [viewer, admin]CURRENT_USER_HAS_ROLE(viewer): true

我的Byteman规则如下:

RULE RBAC HanldeInvoke
CLASS org.apache.karaf.management.KarafMBeanServerGuard
METHOD handleInvoke(ObjectName, String, Object[], String[]) 
AT ENTRY
IF TRUE
DO traceln(" OBJECT: " + $objectName + "METHOD: " + $operationName + "ARGS: " + java.util.Arrays.toString($params) );
ENDRULERULE RBAC RequiredRoles
CLASS org.apache.karaf.management.KarafMBeanServerGuard
METHOD getRequiredRoles(ObjectName, String, Object[], String[])
AT EXIT
IF TRUE
DO traceln(" REQUIRED ROLES: " + $! );
ENDRULERULE RBAC CanBypass
CLASS org.apache.karaf.management.KarafMBeanServerGuard
METHOD canBypassRBAC(ObjectName) 
AT EXIT
IF TRUE
DO traceln(" CANBYPASS: " + $! );
ENDRULERULE RBAC UserHasRole
CLASS org.apache.karaf.management.KarafMBeanServerGuard
METHOD currentUserHasRole(String)
AT EXIT
IF TRUE
DO traceln(" CURRENT_USER_HAS_ROLE(" + $requestedRole + "): " + $! );
ENDRULE

显然,这只是Byteman可以为您提供服务的简短示例。 我邀请您阅读项目文档,因为您可能会发现不错的结构 ,这些结构可以使您编写更简单的规则或对其进行完善以仅在与您相关的情况下才真正触发(如果在我的示例中,您在输出中看到一些噪音,您可能会打开一个正在执行轮询的Hawtio实例,从而触发了一些已安装的规则)。

特别感谢Andrew Dinn向我解释了Byteman的工作方式和最初失败的原因。

由于我的错误,截屏视频不是最佳选择,但是由于我有一个Hawt.io实例调用受保护的JMX操作,因此您清楚地看到了增加的噪音!

翻译自: https://www.javacodegeeks.com/2014/10/use-byteman-in-jboss-fuse-fabric8-karaf.html

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

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

相关文章

个人作业——Alpha项目测试

一、 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/3338 团队名称 西柚皇家编程团队:https://www.cnblogs.com/TakeRa…

Windows7下Docker的安装

转自 https://blog.csdn.net/xiangxiezhuren/article/details/79698913 无法打开图3,打开属性。给其添加git路径 无法使用图2下载 https://www.cnblogs.com/huang-yc/p/10350408.html 转载于:https://www.cnblogs.com/shufeiyang/p/11016177.html

简而言之,JUnit:单元测试断言

简而言之,本章涵盖了各种单元测试断言技术。 它详细说明了内置机制, Hamcrest匹配器和AssertJ断言的优缺点 。 正在进行的示例扩大了该主题,并说明了如何创建和使用自定义匹配器/断言。 单元测试断言 信任但要验证 罗纳德里根(R…

vue 安装使用mockjs

使用 mockjs 的案例过程&#xff1a; 1. 安装 npm install axios -S npm install mockjs --save-dev npm install --save 、--save-dev 、-D、-S 的区别与NODE_ENV的配置_jwl_willon的博客-CSDN博客_npm save备注&#xff1a;<> 意为等价于&#xff1b;1、npm install …

大数据学习——SparkStreaming整合Kafka完成网站点击流实时统计

1.安装并配置zk 2.安装并配置Kafka 3.启动zk 4.启动Kafka 5.创建topic [rootmini3 kafka]# bin/kafka-console-producer.sh --broker-list mini1:9092 --topic cyf-test 程序代码 package org.apache.sparkimport java.net.InetSocketAddressimport org.apache.spark.HashParti…

日期/时间格式/解析,Java 8样式

自Java 几乎 开始以来&#xff0c;Java开发人员就通过java.util.Date类&#xff08;自JDK 1.0起&#xff09;和java.util.Calendar类&#xff08;自JDK 1.1起 &#xff09;来处理日期和时间。 在这段时间内&#xff0c;成千上万&#xff08;甚至可能数百万&#xff09;的Java开…

无废话WPF系列5:控件派生图

1. WPF类控件的派生关系图&#xff0c;紫色的部分开始才算是进入WPF的框架里。 2. WPF控件图 WPF的UI控件主要有以下类型&#xff0c;ContentControl, HeaderedContentControl, ItemsControl, HeaderedItemsControl, Panel, Adorner(文字点缀元素), Flow Text(流式文本元素), T…

安装ipython和jupyter

本节内容&#xff1b; 安装ipython安装jupyterPycharm介绍 Python软件包管理一、安装ipython 1. python的交互式环境2. 安装ipython 可以使用pip命令安装。如果你是用pyenv安装的python的话&#xff0c;pip命令已经有了。 当需要安装包的时候&#xff0c;最好进入虚拟环境&…

vue 图片资源应该如何存放并引入(public、assets)?

全局cli配置&#xff1a;vue.config.js 之前写项目就想着怎么简单怎么来&#xff0c;图片要用了&#xff0c;就直接在要用图片的页面&#xff0c;新建一个跟页面同等级的 imgs 文件夹&#xff0c;然后在页面中直接 “./imgs/图片.png”&#xff0c;不得不说这样写很方便。 但是…

layui 树形组件下拉框

采用 layui 树形组件&#xff0c;版本&#xff1a;V2.6.8。只需要更新layui版本&#xff0c;不需要下载tableSelect。 原作者博客&#xff1a;https://blog.csdn.net/m0_67402588/article/details/123526860。 从 官网 更新日志可以看到&#xff0c;树形组件在2.5.7版本还在更新…

layui table表格的复选框checkbox设置部分为不可选

需求&#xff1a;如上图&#xff0c;某些数据禁用删除功能&#xff0c;那么全选时&#xff0c;这些数据前面的复选框也不能选。 实现&#xff1a;在layui数据表格中设置了字段为 type:checkbox 但是想要实现部分不显示&#xff0c;不可选的功能。layui内置没有该功能&#xff…

layui upload阻止文件上传问题,及多选文件上传

1、效果展示&#xff1a; 2、需求&#xff1a; 下拉框及月份都为不空&#xff0c;且有文件数据才能提交上传。 3、环境&#xff1a; 目前项目中引用的 layui 版本是 2.4.5。在 before 中进行判断&#xff0c;使用 return false 想要阻止文件上传没反应&#xff0c;文件仍然会…

2019.06.17课件:[洛谷P1310]表达式的值 题解

P1310 表达式的值 题目描述 给你一个带括号的布尔表达式&#xff0c;其中表示或操作|&#xff0c;*表示与操作&&#xff0c;先算*再算。但是待操作的数字&#xff08;布尔值&#xff09;不输入。 求能使最终整个式子的值为0的方案数。 题外话 不久之前我在codewars上做过一…

vue+element 封装日期范围组件(双向绑定)

像这样的日期组件&#xff0c;在后台管理项目中是比较多的&#xff0c;而且加了快捷选项&#xff0c;代码量较多&#xff0c;因此封装成组件。 封装这一类型的组组件&#xff0c;主要是了解输入框双向绑定 v-model 的过程。 1、了解输入框双向绑定的过程&#xff1a; 官网&am…

用Hystrix保护您的应用程序

在之前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中&#xff0c;我们讨论了微服务以及如何使用&#xff08;RxJava&#xff09;的Reactive Extensions编排微服务。 但是&#xff0c;如果一项或多项服务由于已被暂停或引发异常而…

若依 从下载到成功运行及打包

官网&#xff1a;http://www.ruoyi.vip/ 目录 一、下载并运行项目 二、关于 若依 接口地址配置 2.1 若依的跨域代理介绍 2.2 配置跨域代理&#xff0c;调用后台接口 2.2.1 配置 后台 ip 地址 2.2.2 页面报“系统接口404”错误 三、打包配置 3.1 打包之后静态资源404…

uniAPP小程序 子组件使用watch不生效,H5正常,小程序不正常(其实是子组件model选项的问题)

第一次用 uniapp 写小程序&#xff0c;还是遇到挺多问题的。写了一个下拉多选组件&#xff0c;发现同样的代码&#xff0c;在H5上运行效果正常&#xff0c;在小程序上压根不走 watch 。 uniapp官网&#xff1a;【全局配置 | uni-app官网】 看文档 watch 是支持H5、小程序的&…

jQuery EasyUI/TopJUI创建日期时间输入框

jQuery EasyUI/TopJUI创建日期时间输入框 日期时间输入框组件 HTML 和日期输入框类似&#xff0c;日期时间输入框允许用户选择日期和指定的时间并按照指定的输出格式显示。相比日期输入框&#xff0c;它在下拉面板中添加了一个时间微调器。 <div class"topjui-containe…

table 设置边框

本文引自&#xff1a;https://www.cnblogs.com/leona-d/p/6125896.html 示例代码&#xff1a; <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width…

uniapp小程序 设置自定义导航栏

如下截图&#xff0c;通过 wx.getSystemInfoSync 计算得到的整个导航栏高度&#xff0c;其实是有3个部分的&#xff1a; 黄色&#xff1a;状态栏高度&#xff0c;uniapp文档中有给出&#xff1b;红色&#xff1a;胶囊高度&#xff0c;可以计算得出&#xff1b;绿色&#xff1a;…