日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在JBoss Fuse / Fabric8 / Karaf中使用Byteman

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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

而對于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 / Fabric8 / Karaf中使用Byteman的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。