在JBoss Fuse / Fabric8 / Karaf中使用Byteman
您是否曾經(jīng)嘗試過了解一些非常簡(jiǎn)單的方法不起作用的過程?
您正在任何眾所周知的上下文中編寫代碼,無論出于何種原因它都無法正常工作。 而且您信任您的平臺(tái),因此您認(rèn)真閱讀了所有日志。
而且,您仍然不知道為什么某些行為不符合預(yù)期。
通常,如果我有幸從事開放源代碼項(xiàng)目,那么接下來要做的就是開始閱讀代碼 。 多次工作; 但是幾乎總是沒有編寫該代碼。 而且您不太了解該產(chǎn)品。 所以,是的,您可以看到上下文中有哪個(gè)變量。 您不知道它們可能的值 ,更糟糕的是,您不知道這些值在何處創(chuàng)建甚至何時(shí)創(chuàng)建。
此時(shí),我通常要做的是與調(diào)試器連接。 我永遠(yuǎn)不會(huì)記住Java進(jìn)程需要允許調(diào)試的JVM參數(shù),但是我知道我已經(jīng)在某個(gè)地方編寫了這些參數(shù)。 而且現(xiàn)代IDE可以向我建議這些,因此遠(yuǎn)程連接到復(fù)雜的應(yīng)用程序服務(wù)器并不是什么大麻煩。
好的,我們已連接。 我們可以在離我們認(rèn)為重要的部分不遠(yuǎn)的地方放置一個(gè)斷點(diǎn),并逐步遍歷代碼。 最終增加了更多的優(yōu)勢(shì)。 IDE 變量視圖使我們可以在上下文中查看變量的值。 我們甚至可以瀏覽整個(gè)對(duì)象樹并調(diào)用代碼片段,以防對(duì)象的普通內(nèi)存狀態(tài)無法真正提供所需的準(zhǔn)確信息(假設(shè)您要格式化Date或過濾集合)。
我們擁有所有工具,但是……這是一個(gè)緩慢的過程 。 每次我在特定的斷點(diǎn)處停止時(shí),都必須手動(dòng)瀏覽變量。 我知道,我們可以通過監(jiān)視變量來改善這種情況,這些變量始終位于概述窗口的頂部,并讓您快速查看已確定的重要內(nèi)容。 但是我個(gè)人發(fā)現(xiàn), 只有在變量很少的情況下 ,監(jiān)視才有意義 :由于它們都共享相同的名稱空間,因此當(dāng)您不在一個(gè)范圍內(nèi)時(shí),會(huì)看到許多未設(shè)置的值,這只會(huì)分散您的視線變量。
我最近學(xué)到了一種技巧,可以改善與您共享的這些工作流程,以防您不了解:
IntelliJ ,甚至是Eclipse ,都具有巧妙的技巧,使您可以在通過斷點(diǎn)時(shí)添加打印語(yǔ)句 。 如果將其與防止斷點(diǎn)暫停結(jié)合起來,則有一種不錯(cuò)的方法,可以通過日志調(diào)用來擴(kuò)展正在調(diào)試的代碼。
對(duì)于IntelliJ,請(qǐng)?jiān)诖颂帣z查:http://www.jetbrains.com/idea/webhelp/enabling-disabling-and-removing-breakpoints.html
而對(duì)于Eclipse而言,請(qǐng)檢查以下技巧:http://moi.vonos.net/2013/10/adhoc-logging/或讓我知道是否有更清潔或更新穎的方法來達(dá)到相同的結(jié)果。
上面的技巧有效。 但是它的主要缺點(diǎn)是您正在向工作空間添加本地配置 。 您不能輕易與他人分享此內(nèi)容。 您可能希望將工作空間重新用于其他會(huì)話,并且看到所有這些日志條目或斷點(diǎn)會(huì)分散您的注意力 。
因此,在尋求IDE的外部支持時(shí),我決定嘗試Byteman 。
Byteman實(shí)際上提供的功能遠(yuǎn)遠(yuǎn)超出我這次所需的功能,這可能是我決定了解是否可以在Fabric8中使用它的主要原因。
快速回顧一下Byteman的工作,直接摘自其文檔:
Byteman是一個(gè)字節(jié)碼操作工具,它使在加載時(shí)或應(yīng)用程序運(yùn)行時(shí)更改Java應(yīng)用程序的操作變得簡(jiǎn)單。
它可以工作,而無需重寫或重新編譯原始程序。
提供:
- 跟蹤特定代碼路徑的執(zhí)行并顯示應(yīng)用程序或JVM狀態(tài)
- 通過更改狀態(tài),進(jìn)行計(jì)劃外的方法調(diào)用或強(qiáng)制意外返回或拋出來破壞正常執(zhí)行
- 安排由獨(dú)立應(yīng)用程序線程執(zhí)行的活動(dòng)的時(shí)間安排
- 監(jiān)視和收集匯總應(yīng)用程序和JVM操作的統(tǒng)計(jì)信息
在我的特定情況下,我將使用列出的行為中的第一個(gè),但是您可以很容易地猜到所有其他方面可能會(huì)在某個(gè)時(shí)候變得很方便:
- 添加一些邏輯來防止NullPointerException
- 短路一些邏輯,因?yàn)槟龅降腻e(cuò)誤不在代碼庫(kù)中,但您仍然想看看如果不存在該錯(cuò)誤會(huì)發(fā)生什么
- 您可以想象的其他任何事情……
開始使用Byteman通常特別容易 。 您甚至沒有被迫使用特定的指令來啟動(dòng)您的jvm。 您可以只附加到已經(jīng)運(yùn)行的進(jìn)程! 這在大多數(shù)情況下都有效,但是不幸的是,由于OSGi的影響,在默認(rèn)配置下不適用于Karaf。 但不用擔(dān)心,該功能僅是簡(jiǎn)單的配置編輯 。
您必須編輯文件:
$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
這樣,您將避免在觸發(fā)Byteman規(guī)則時(shí)引發(fā)ClassCastException 。
這幾乎是我們?cè)贔use上使用Byteman所需的所有額外工作。
這是我與平臺(tái)互動(dòng)的實(shí)際示例 :
# 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規(guī)則如下:
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可以為您提供服務(wù)的簡(jiǎn)短示例。 我邀請(qǐng)您閱讀項(xiàng)目文檔,因?yàn)槟赡軙?huì)發(fā)現(xiàn)不錯(cuò)的結(jié)構(gòu) ,這些結(jié)構(gòu)可以使您編寫更簡(jiǎn)單的規(guī)則或?qū)ζ溥M(jìn)行完善以僅在與您相關(guān)的情況下才真正觸發(fā)(如果在我的示例中,您在輸出中看到一些噪音,您可能會(huì)打開一個(gè)正在執(zhí)行輪詢的Hawtio實(shí)例,從而觸發(fā)了一些已安裝的規(guī)則)。
特別感謝Andrew Dinn向我解釋了Byteman的工作方式和最初失敗的原因。
由于我的錯(cuò)誤,截屏視頻不是最佳選擇,但是由于我有一個(gè)Hawt.io實(shí)例調(diào)用受保護(hù)的JMX操作,因此您清楚地看到了增加的噪音!
翻譯自: https://www.javacodegeeks.com/2014/10/use-byteman-in-jboss-fuse-fabric8-karaf.html
總結(jié)
以上是生活随笔為你收集整理的在JBoss Fuse / Fabric8 / Karaf中使用Byteman的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果4s越狱教程(苹果4s完美越狱教程)
- 下一篇: HttpURLConnection的警告