jboss eclipse_调试生产服务器– Eclipse和JBoss展示
jboss eclipse
您是否編寫(xiě)有錯(cuò)誤的代碼? 不,當(dāng)然不是。 對(duì)于我們其余的人,他們確實(shí)會(huì)編寫(xiě)帶有bug的代碼,我想解決一個(gè)非常敏感的問(wèn)題:調(diào)試在生產(chǎn)服務(wù)器上運(yùn)行的應(yīng)用程序。
因此,您的應(yīng)用程序已準(zhǔn)備好進(jìn)行部署。 單元測(cè)試全部成功, 測(cè)試人員發(fā)現(xiàn)了一些立即修復(fù)的小錯(cuò)誤,與其他部門(mén)的模塊進(jìn)行的集成測(cè)試非常順利, QA部門(mén)沒(méi)有任何投訴,而UAT則以鮮艷的色彩通過(guò)了。 因此,您的出色代碼現(xiàn)在已啟動(dòng)并在生產(chǎn)服務(wù)器上運(yùn)行。
當(dāng)不可思議的事情發(fā)生時(shí)。 您的客戶(hù)注意到該應(yīng)用程序上的一些錯(cuò)誤行為,并且他的一些客戶(hù)已經(jīng)開(kāi)始抱怨。 似乎有些討厭的小bug設(shè)法通過(guò)了所有測(cè)試過(guò)程,并投入到了實(shí)際系統(tǒng)中。 客戶(hù)的用戶(hù)向客戶(hù)施加壓力,客戶(hù)經(jīng)理向您的經(jīng)理施加壓力,并且,您的經(jīng)理開(kāi)始向您施加壓力。
您啟動(dòng)測(cè)試服務(wù)器并嘗試重現(xiàn)該錯(cuò)誤 。 ,所有內(nèi)容都可以在測(cè)試服務(wù)器上正常運(yùn)行,因此這可能是一個(gè)奇怪的配置問(wèn)題,或者是導(dǎo)致問(wèn)題行為的邊緣情況。 最重要的是,您無(wú)法使用測(cè)試床來(lái)跟蹤錯(cuò)誤。
一個(gè)貧窮的開(kāi)發(fā)商應(yīng)該怎么做? 調(diào)試在生產(chǎn)服務(wù)器上運(yùn)行的應(yīng)用程序。 請(qǐng)注意,當(dāng)所有其他發(fā)現(xiàn)該錯(cuò)誤的嘗試均失敗時(shí),這應(yīng)被視為最后的手段。 確保在生產(chǎn)服務(wù)器(為大量用戶(hù)提供服務(wù))上進(jìn)行任何細(xì)微的錯(cuò)誤舉動(dòng)都會(huì)嚴(yán)重影響應(yīng)用程序,并導(dǎo)致更大的問(wèn)題或整個(gè)服務(wù)中斷。
因此,如果您決定走高風(fēng)險(xiǎn)之路,請(qǐng)繼續(xù)閱讀該如何做。 開(kāi)始之前的一些基本準(zhǔn)則。 首先,讓您的客戶(hù)知道您將連接到生產(chǎn)系統(tǒng)并“執(zhí)行一些檢查”。 您不必具體說(shuō)明將要做什么,但是在沒(méi)有通知客戶(hù)的情況下當(dāng)然也不會(huì)做任何事情。 其次,選擇實(shí)際流量盡可能低的時(shí)間。 這是不費(fèi)吹灰之力的事情,您希望受影響的用戶(hù)越少越好,而且您不希望服務(wù)器在高負(fù)載下運(yùn)行。 第三,要小心,不要倉(cāng)促行事。 可能會(huì)有壓力,但是要花點(diǎn)時(shí)間,這將更容易找出問(wèn)題所在。
我將使用JBoss AS和Eclipse,以提供有關(guān)如何執(zhí)行調(diào)試的動(dòng)手示例。 我們將通過(guò)在JBoss上部署簡(jiǎn)單的代碼并執(zhí)行特定的方法來(lái)模擬正在運(yùn)行的應(yīng)用程序。 在大多數(shù)基于Java的應(yīng)用程序服務(wù)器中,啟動(dòng)啟用了遠(yuǎn)程調(diào)試的JVM只是配置問(wèn)題。 然后,使用您喜歡的IDE(在我的情況下為Eclipse)在服務(wù)器端口上附加調(diào)試器并開(kāi)始調(diào)試。 請(qǐng)注意,啟用遠(yuǎn)程調(diào)試對(duì)性能的影響很小,但是我通常更喜歡啟用調(diào)試選項(xiàng),以便可以隨意連接到服務(wù)器。 在另一種情況下,為了應(yīng)用新設(shè)置,需要重新啟動(dòng)JVM,從而重新啟動(dòng)服務(wù)器。
首先,讓我們創(chuàng)建執(zhí)行調(diào)試的代碼。 我們將使用Java MBean ,該Java MBean部署在JBoss上并具有預(yù)定義的生命周期。 MBean是托管Bean,代表要管理的資源的Java對(duì)象。 JBoss實(shí)際上提供了MBean Server的實(shí)現(xiàn),因此可以在其上部署MBean。
最簡(jiǎn)單的方法是擴(kuò)展ServiceMBeanSupport抽象類(lèi)并實(shí)現(xiàn)符合ServiceMBean接口的服務(wù) 。 首先,我們創(chuàng)建一個(gè)名為“ SimpleMBeanProject”的Eclipse項(xiàng)目。 然后我們創(chuàng)建一個(gè)接口,我們的服務(wù)將必須實(shí)現(xiàn)該接口。 源代碼是:
package com.javacodegeeks.jboss;import org.jboss.system.ServiceMBean;public interface SimpleServiceMBean extends ServiceMBean {void start() throws Exception;void stop();String getName();void execute(String input);}然后,我們創(chuàng)建適當(dāng)?shù)膶?shí)現(xiàn)類(lèi):
package com.javacodegeeks.jboss;import org.jboss.system.ServiceMBeanSupport;public class SimpleService extends ServiceMBeanSupport implements SimpleServiceMBean { @Overridepublic void start() throws Exception {System.out.println("Starting SimpleService MBean");}@Overridepublic void stop() {System.out.println("Stopping SimpleService MBean");}@Overridepublic String getName() {return SimpleService.class.getCanonicalName();}public void execute(String input) {System.out.println("Executing with input " + input);}}該代碼確實(shí)很簡(jiǎn)單,但是具有足夠的功能來(lái)進(jìn)行演示。 “執(zhí)行”方法是為了模擬正在運(yùn)行的應(yīng)用程序而將被調(diào)用的方法。
部署MBean的一種方法是將兩個(gè)類(lèi)捆綁到Service Archive(SAR)文件中。 該文件是一個(gè)壓縮文件,其中包括MBean類(lèi)和相應(yīng)的部署描述符,在這種情況下,該文件是名為“ jboss-service.xml”的文件,其內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?><service><mbean code="com.javacodegeeks.jboss.SimpleService"name="javacodegeeks:name=SimpleService"></mbean></service>“ jboss-service.xml”文件必須位于SAR捆綁包內(nèi)名為“ META-INF”的文件夾內(nèi)。 然后,必須將歸檔文件放在<jboss-base-dir> / server / default / deploy目錄中,以便部署MBean。 存檔可以手動(dòng)創(chuàng)建,畢竟它只是一個(gè)壓縮文件,但是更優(yōu)雅的方法是創(chuàng)建一個(gè)ANT腳本來(lái)自動(dòng)執(zhí)行該過(guò)程。
<?xml version="1.0" encoding="UTF-8"?><project name="SimpleService Project Build" default="build-sar"><target name="init"><property name="base.dir" value="."/><property name="lib.dir" value="${base.dir}/lib"/><property name="bin.dir" value="${base.dir}/bin"/><property name="src.dir" value="${base.dir}/src" /><property name="dist.dir" value="${base.dir}/dist" /><delete dir="${dist.dir}"/><mkdir dir="${dist.dir}"/></target><target name="compile" depends="init"><echo message="Compiling source files..." /><javac destdir="${bin.dir}" debug="on"><src path="${src.dir}" /><classpath><fileset dir="${lib.dir}"><include name="**/*.jar" /></fileset></classpath><include name="**/*.java" /></javac></target><target name="build-sar" depends="compile"><jar destfile="dist/SimpleService.sar"><zipfileset dir="bin"><include name="com/javacodegeeks/**/*.class" /></zipfileset><zipfileset dir="resources" prefix="META-INF"><include name="jboss-service.xml" /></zipfileset></jar></target></project>部署SAR后,“ SimpleService” MBean將出現(xiàn)在服務(wù)器的JMX控制臺(tái)上。 這是一個(gè)Web界面,可以通過(guò)以下URL訪問(wèn)(相應(yīng)地替換主機(jī)):
http://主機(jī):8080 / jmx-console
向下滾動(dòng),直到找到“ name = SimpleService”條目,然后單擊鏈接。 Mbean的屬性以及操作列表將顯示在此處。
您可以使用String參數(shù)手動(dòng)調(diào)用“ execute”方法,相應(yīng)的輸入將被寫(xiě)入標(biāo)準(zhǔn)輸出。
好了,在部署SAR之后,就該開(kāi)始調(diào)試了。 第一步是使JBoss的JVM在啟用遠(yuǎn)程套接字調(diào)試的情況下啟動(dòng)。 當(dāng)然,這是通過(guò)JVM的參數(shù)完成的,并且要配置它,您必須執(zhí)行以下操作:
Linux平臺(tái):打開(kāi)文件/bin/run.conf并取消注釋讀取的行(刪除“#”)
JAVA_OPTS =” $ JAVA_OPTS -Xrunjdwp:transport = dt_socket,address = 8787,server = y,suspend = n”
Windows平臺(tái):打開(kāi)文件/bin/run.bat并取消注釋該行(刪除“ rem”關(guān)鍵字) 設(shè)置JAVA_OPTS = -Xdebug -Xrunjdwp:transport = dt_socket,地址= 8787,服務(wù)器= y,暫掛= n%JAVA_OPTS%
將使用的端口是8787。請(qǐng)確保將“ suspend”參數(shù)設(shè)置為“ n”(禁用),或者在另一種情況下,當(dāng)服務(wù)器首次啟動(dòng)時(shí),它將暫停并等待遠(yuǎn)程調(diào)試器執(zhí)行在繼續(xù)操作之前先附加。
之后,正常啟動(dòng)服務(wù)器。 現(xiàn)在是時(shí)候通過(guò)Eclipse連接到服務(wù)器了。 轉(zhuǎn)到“運(yùn)行? 調(diào)試配置…”,然后雙擊“遠(yuǎn)程Java應(yīng)用程序”選項(xiàng)。 在“連接”選項(xiàng)卡上,確保已選擇“ SimpleMBeanProject”,提供遠(yuǎn)程“主機(jī)” IP地址或主機(jī)名(在我的情況下為“ localhost”)和服務(wù)器偵聽(tīng)傳入的調(diào)試會(huì)話的“端口”(8787)按照之前的配置)。 最后,請(qǐng)確保未選擇“允許終止遠(yuǎn)程VM”,因?yàn)槿绻x擇了“終止遠(yuǎn)程VM”,則服務(wù)器的JVM將在您斷開(kāi)調(diào)試時(shí)關(guān)閉。 生產(chǎn)服務(wù)器確實(shí)不是一件好事。 好的,點(diǎn)擊“調(diào)試”按鈕繼續(xù)。
如果未啟用遠(yuǎn)程調(diào)試,或者存在連接問(wèn)題(也許是防火墻問(wèn)題),您將看到以下圖像:
但是,如果一切正常,Eclipse調(diào)試器會(huì)將其自身附加到服務(wù)器,您應(yīng)該能夠看到類(lèi)似以下內(nèi)容:
如您所見(jiàn),受監(jiān)視的線程顯示在“調(diào)試”視圖中。 如果未顯示該視圖,請(qǐng)轉(zhuǎn)到“窗口? 顯示視圖? 其他…”,然后在“調(diào)試”類(lèi)別下進(jìn)行搜索。
現(xiàn)在,假設(shè)“ SimpleService”類(lèi)的“ execute”方法模擬了在每個(gè)傳入請(qǐng)求下在生產(chǎn)服務(wù)器上執(zhí)行的代碼。 如果要在測(cè)試服務(wù)器上執(zhí)行調(diào)試,那么您要做的就是在方法內(nèi)部添加一個(gè)斷點(diǎn),觸發(fā)請(qǐng)求并繼續(xù)進(jìn)行調(diào)試。 但是,類(lèi)似的東西絕對(duì)不能在生產(chǎn)服務(wù)器上運(yùn)行。 切換斷點(diǎn)時(shí),所有請(qǐng)求將暫停并等待您的操作(如果執(zhí)行路徑當(dāng)然是通過(guò)該方法傳遞的)。 這將停止請(qǐng)求的執(zhí)行,并且很可能會(huì)引起用戶(hù)的注意。 此外,您將不得不同時(shí)監(jiān)控的請(qǐng)求數(shù)量使您不知所措。
您要做的是添加一個(gè)條件斷點(diǎn),該斷點(diǎn)僅在提供特定輸入(即您提供的輸入)時(shí)停止。 因此,斷開(kāi)與遠(yuǎn)程服務(wù)器的連接,然后在“ execute”方法內(nèi)添加一個(gè)斷點(diǎn)(在第23行)。 然后,右鍵單擊斷點(diǎn),然后從出現(xiàn)的菜單中選擇“斷點(diǎn)屬性”(最后一個(gè))。
出現(xiàn)屬性菜單。 選中“啟用條件”復(fù)選框,然后在文本區(qū)域內(nèi)輸入條件。 斷點(diǎn)將是有效的,并且僅在該條件為真時(shí)才掛起執(zhí)行。 請(qǐng)注意,您實(shí)際上是在文本區(qū)域內(nèi)編寫(xiě)Java代碼,并且可以為此使用熟悉的代碼幫助(使用Ctrl + Space)。 Eclipse是一個(gè)不可思議的工具嗎? 我們希望僅在方法的參數(shù)為“ myinput”時(shí)才插入斷點(diǎn)。
再次啟動(dòng)遠(yuǎn)程調(diào)試,現(xiàn)在您可以確定在提供您自己的輸入時(shí)將暫停執(zhí)行。 為了演示這一點(diǎn),請(qǐng)返回JMX控制臺(tái)和“ SimpleService” MBean視圖。 在“執(zhí)行”方法中,使用隨機(jī)參數(shù):
點(diǎn)擊“調(diào)用”按鈕,注意Eclipse并沒(méi)有暫停執(zhí)行。 現(xiàn)在,使用“ myinput”作為輸入值,單擊“ Invoke”,然后注意Eclipse捕獲了執(zhí)行。
現(xiàn)在,您可以繼續(xù)使用眾所周知的調(diào)試選項(xiàng)(進(jìn)入方法,觀察變量值等),而不必?fù)?dān)心系統(tǒng)用戶(hù)會(huì)受到影響。
您可以在此處下載Eclipse項(xiàng)目。
快樂(lè)尋找蟲(chóng)子!
相關(guān)文章 :- JBoss 4.2.x Spring 3 JPA Hibernate教程
- GWT EJB3 Maven JBoss 5.1集成教程
- JBoss Portal上的“ Hello World” portlet
翻譯自: https://www.javacodegeeks.com/2010/06/debug-production-server-eclipse.html
jboss eclipse
總結(jié)
以上是生活随笔為你收集整理的jboss eclipse_调试生产服务器– Eclipse和JBoss展示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最值得看的十部历史剧顺序(推荐五部值得一
- 下一篇: cad锁定外部参照快捷键(cad外部参照