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

jboss fuse 教程

您是否曾经尝试了解一些简单的东西不起作用的过程?

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

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

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

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

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

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

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

jboss fuse 教程

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

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

相关文章

前端用sql 还是mysql_前端小白安装MySQL的踩坑路

1、首先进入官网下载MySQL然鹅当我进入官网,是这样的!这是看不起我大学英语六级水平么,这个下载也太奇怪了。点进去也找不到在哪里。(可能是我太傻,勿喷哈)最后我找到了这个下载链接,奶思开始下载!我下载的…

C语言项目:绽放的玫瑰花

剁手节已经过去几天了,当天成交量达到了恐怖的2000多亿,不知道大家贡献了多少呢?然而大家还有多少人记得双十一是光棍节呢?广大单身汪同胞还在苦苦挣扎,“大!家!不!要!慌…

java.lang.Record:规范草案

建议的Java记录的工作仍在继续。 Brian Goetz 昨天在OpenJDK amber-spec-experts邮件列表上启动了三个新线程,其中两个专注于Java Records。 这两个面向记录的线程之一讨论了Java记录是否应支持varargs 。 另一个线程为提议的类java.lang.Record提供了初始草案规范&…

mysql batch 失败_mysql突然挂掉,重启失败,求助

错误日志如下:2018-07-17T08:36:53.397517Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).2018-07-17T08:36:53.399199Z 0 [Note] /usr/s…

C语言项目:黑客帝国之数字雨

编辑相信大家看过许许多多的关于计算机黑客、骇客、人工智能、AI方面的电影,每当黑客入侵某个五角大楼,某个网站时,都会出现这样一幅画面:编辑然后就轻而易举的成功入侵夺取管理员权限了,这时候的我们,心情…

idea样式报错_来自强迫症患者的IDEA设置

IDEA的功能强大毋庸置疑,配置选项也是多到让人眼花缭乱。然而不是所有的配置都是用户需要的,特别是强迫症患者更是难伺候。今天和大家分享下个人的配置和。持续更新中,也欢迎大家补充。Duplicated code取消重复代码提示Settings -> Editor…

hystrix合并请求_Hystrix中的批处理(折叠)请求

hystrix合并请求Hystrix具有折叠(或批处理)请求的高级功能。 如果两个或多个命令同时运行相似的请求,Hystrix可以将它们组合在一起,运行一个批处理的请求,并将拆分结果分派回所有命令。 首先让我们看看Hystrix如何工作…

C语言项目:扫雷大战精简版

一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮…

mysql ignore 1 lines_MYSQL使用笔记(1)

创建用户 用户名 dnsexpuser 密码:dnsexp1347insert into mysql.user(Host,User,Password) values (localhost,dnsexpuser,password(dnsexp1347)) ;创建数据库分配数据库权限create database wap_tagdb ;grant all privileges on wap_tagdb.*to waptaglocalhost ide…

Valhalla LW2的进展–内联类型

过去几周(2019年6月/ 2019年7月), 瓦尔哈拉计划的LW2阶段/原型最初于2018年10月提出,在面向公众的方面取得了重大进展。 在这篇文章中,我简要总结了最近发布的一些消息,文档和Valhalla Early Access Build。…

mysql密码高级_mysql高级操作

连接数据库# mysql -uroot -p -h10.18.44.209 -p3306授权GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION;FLUSH PRIVILEGES;修改数据库密码# vim /etc/my.cnf 追加validate_passwordoff# systemctl restart mysqld方法一:mysql > SET PASSWORD FOR use…

javafx 和swing_Swing和JavaFX:使用JFXPanel

javafx 和swing我很快将不得不在基于Swing的胖客户端中处理JavaFX –哦,对不起,我的意思是“多层富客户端”! 因此,这使我来看看JFXPanel 。 JFXPanel是一个javax.swing.JComponent,用于将JavaFX内容嵌入到Swing-UI中…

C语言十大经典例题:附答案

1、/*输出9*9口诀。共9行9列&#xff0c;i控制行&#xff0c;j控制列。*/#include <stdio.h>int main(){ int i,j,result;for (i1;i<10;i){ for(j1;j<10;j){resulti*j;printf("%d*%d%-3d",i,j,result);/*-3d表示左对齐&#xff0c;占3位*/}printf(&qu…

java正则表达式判断_Java正则表达式判断

/* 判断是否为数字 */ public static boolean isNumeric(String str) { if(str null || str.isEmpty()){ return false; } Pattern pattern Pattern.compile("[0-9]*"); Matcher isNum pattern.matcher(str); if…

C语言项目:图形马赛克处理技术

每个人都有讨厌的人&#xff0c;例如我就比较讨厌三个姓马的人&#xff0c;马云、马化腾和马赛克。马云骗女人的钱&#xff0c;马化腾骗孩子的钱&#xff0c;马赛克阻挡了人们的分享和交流 。那么大家是不是知道我们今天要分享的项目是什么啦&#xff1f;马赛克处理技术莫非就是…

在生产中配置和使用AWS EKS

到现在&#xff0c;我们已经完成了向Amazon EKS &#xff08; 工作地点&#xff09;的迁移&#xff0c;并且集群已经投入生产。 过去&#xff0c;我已经写了一些要点的简短摘要&#xff0c;您可以在这里找到。 当系统正在为实际流量提供服务时&#xff0c;我有了一些额外的信心…

java 监听 变量_[Java学习小记]使用PropertyChangeSupport来监听变量的变化

今天要处理的问题是&#xff1a;监听一个变量&#xff0c;当该变量的值出现变化时能够获知&#xff0c;并进行相应处理。使用java.bean.PropertyChangeSupport类。看如下的构造方法&#xff0c;其实就是将你要控制的对象绑定到该工具中。PropertyChangeSupport changes new Pr…

处理异常功能样式

Java从一开始就支持检查异常。 在Java 8中&#xff0c;语言元素lambda和支持流操作的RT库修改将功能编程风格引入了该语言。 函数样式和异常并不是真正的好朋友。 在本文中&#xff0c;我将描述一个简单的库&#xff0c;该库在某种程度上类似于使用Optional处理null方式处理异常…

C语言项目:灰度处理技术

Hello&#xff0c;今天给大家带来的是一个比较简单的图形处理技术-灰度处理技术。那么到底什么是灰度处理技术呢&#xff1f;简单来说&#xff0c;所谓的灰度处理技术就是把一张彩色的图片变成一张灰色的图片。如下图所示&#xff0c;左边是原图&#xff0c;右边则是已经被处理…

java 设置文本颜色_在Java中更改文本的颜色

添加到我的评论&#xff1a;1)您不应该通过调用paintComponent(..)方法的super.XXX实现来尊重paint链,它应该是覆盖方法中的第一个调用,否则可能发生异常&#xff1a;Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);Font font new Font("S…