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