jboss eclipse_调试生产服务器– Eclipse和JBoss展示

jboss eclipse

您是否编写有错误的代码? 不,当然不是。 对于我们其余的人,他们确实会编写带有bug的代码,我想解决一个非常敏感的问题:调试在生产服务器上运行的应用程序。

因此,您的应用程序已准备好进行部署。 单元测试全部成功, 测试人员发现了一些立即修复的小错误,与其他部门的模块进行的集成测试非常顺利, QA部门没有任何投诉,而UAT则以鲜艳的色彩通过了。 因此,您的出色代码现在已启动并在生产服务器上运行。

当不可思议的事情发生时。 您的客户注意到该应用程序上的一些错误行为,并且他的一些客户已经开始抱怨。 似乎有些讨厌的小bug设法通过了所有测试过程,并投入到了实际系统中。 客户的用户向客户施加压力,客户经理向您的经理施加压力,并且,您的经理开始向您施加压力。

您启动测试服务器并尝试重现该错误 。 ,所有内容都可以在测试服务器上正常运行,因此这可能是一个奇怪的配置问题,或者是导致问题行为的边缘情况。 最重要的是,您无法使用测试床来跟踪错误。

一个贫穷的开发商应该怎么做? 调试在生产服务器上运行的应用程序。 请注意,当所有其他发现该错误的尝试均失败时,这应被视为最后的手段。 确保在生产服务器(为大量用户提供服务)上进行任何细微的错误举动都会严重影响应用程序,并导致更大的问题或整个服务中断。

因此,如果您决定走高风险之路,请继续阅读该如何做。 开始之前的一些基本准则。 首先,让您的客户知道您将连接到生产系统并“执行一些检查”。 您不必具体说明将要做什么,但是在没有通知客户的情况下当然也不会做任何事情。 其次,选择实际流量尽可能低的时间。 这是不费吹灰之力的事情,您希望受影响的用户越少越好,而且您不希望服务器在高负载下运行。 第三,要小心,不要仓促行事。 可能会有压力,但是要花点时间,这将更容易找出问题所在。

我将使用JBoss AS和Eclipse,以提供有关如何执行调试的动手示例。 我们将通过在JBoss上部署简单的代码并执行特定的方法来模拟正在运行的应用程序。 在大多数基于Java的应用程序服务器中,启动启用了远程调试的JVM只是配置问题。 然后,使用您喜欢的IDE(在我的情况下为Eclipse)在服务器端口上附加调试器并开始调试。 请注意,启用远程调试对性能的影响很小,但是我通常更喜欢启用调试选项,以便可以随意连接到服务器。 在另一种情况下,为了应用新设置,需要重新启动JVM,从而重新启动服务器。

首先,让我们创建执行调试的代码。 我们将使用Java MBean ,该Java MBean部署在JBoss上并具有预定义的生命周期。 MBean是托管Bean,代表要管理的资源的Java对象。 JBoss实际上提供了MBean Server的实现,因此可以在其上部署MBean。

最简单的方法是扩展ServiceMBeanSupport抽象类并实现符合ServiceMBean接口的服务 。 首先,我们创建一个名为“ SimpleMBeanProject”的Eclipse项目。 然后我们创建一个接口,我们的服务将必须实现该接口。 源代码是:

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);}

然后,我们创建适当的实现类:

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);}}

该代码确实很简单,但是具有足够的功能来进行演示。 “执行”方法是为了模拟正在运行的应用程序而将被调用的方法。

部署MBean的一种方法是将两个类捆绑到Service Archive(SAR)文件中。 该文件是一个压缩文件,其中包括MBean类和相应的部署描述符,在这种情况下,该文件是名为“ jboss-service.xml”的文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?><service><mbean code="com.javacodegeeks.jboss.SimpleService"name="javacodegeeks:name=SimpleService"></mbean></service>

“ jboss-service.xml”文件必须位于SAR捆绑包内名为“ META-INF”的文件夹内。 然后,必须将归档文件放在<jboss-base-dir> / server / default / deploy目录中,以便部署MBean。 存档可以手动创建,毕竟它只是一个压缩文件,但是更优雅的方法是创建一个ANT脚本来自动执行该过程。

<?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将出现在服务器的JMX控制台上。 这是一个Web界面,可以通过以下URL访问(相应地替换主机):

http://主机:8080 / jmx-console

向下滚动,直到找到“ name = SimpleService”条目,然后单击链接。 Mbean的属性以及操作列表将显示在此处。

您可以使用String参数手动调用“ execute”方法,相应的输入将被写入标准输出。

好了,在部署SAR之后,就该开始调试了。 第一步是使JBoss的JVM在启用远程套接字调试的情况下启动。 当然,这是通过JVM的参数完成的,并且要配置它,您必须执行以下操作:

Linux平台:打开文件/bin/run.conf并取消注释读取的行(删除“#”)
JAVA_OPTS =” $ JAVA_OPTS -Xrunjdwp:transport = dt_socket,address = 8787,server = y,suspend = n”

Windows平台:打开文件/bin/run.bat并取消注释该行(删除“ rem”关键字) 设置JAVA_OPTS = -Xdebug -Xrunjdwp:transport = dt_socket,地址= 8787,服务器= y,暂挂= n%JAVA_OPTS%

将使用的端口是8787。请确保将“ suspend”参数设置为“ n”(禁用),或者在另一种情况下,当服务器首次启动时,它将暂停并等待远程调试器执行在继续操作之前先附加。

之后,正常启动服务器。 现在是时候通过Eclipse连接到服务器了。 转到“运行? 调试配置…”,然后双击“远程Java应用程序”选项。 在“连接”选项卡上,确保已选择“ SimpleMBeanProject”,提供远程“主机” IP地址或主机名(在我的情况下为“ localhost”)和服务器侦听传入的调试会话的“端口”(8787)按照之前的配置)。 最后,请确保未选择“允许终止远程VM”,因为如果选择了“终止远程VM”,则服务器的JVM将在您断开调试时关闭。 生产服务器确实不是一件好事。 好的,点击“调试”按钮继续。

如果未启用远程调试,或者存在连接问题(也许是防火墙问题),您将看到以下图像:

但是,如果一切正常,Eclipse调试器会将其自身附加到服务器,您应该能够看到类似以下内容:

如您所见,受监视的线程显示在“调试”视图中。 如果未显示该视图,请转到“窗口? 显示视图? 其他…”,然后在“调试”类别下进行搜索。

现在,假设“ SimpleService”类的“ execute”方法模拟了在每个传入请求下在生产服务器上执行的代码。 如果要在测试服务器上执行调试,那么您要做的就是在方法内部添加一个断点,触发请求并继续进行调试。 但是,类似的东西绝对不能在生产服务器上运行。 切换断点时,所有请求将暂停并等待您的操作(如果执行路径当然是通过该方法传递的)。 这将停止请求的执行,并且很可能会引起用户的注意。 此外,您将不得不同时监控的请求数量使您不知所措。

您要做的是添加一个条件断点,该断点仅在提供特定输入(即您提供的输入)时停止。 因此,断开与远程服务器的连接,然后在“ execute”方法内添加一个断点(在第23行)。 然后,右键单击断点,然后从出现的菜单中选择“断点属性”(最后一个)。

出现属性菜单。 选中“启用条件”复选框,然后在文本区域内输入条件。 断点将是有效的,并且仅在该条件为真时才挂起执行。 请注意,您实际上是在文本区域内编写Java代码,并且可以为此使用熟悉的代码帮助(使用Ctrl + Space)。 Eclipse是一个不可思议的工具吗? 我们希望仅在方法的参数为“ myinput”时才插入断点。

再次启动远程调试,现在您可以确定在提供您自己的输入时将暂停执行。 为了演示这一点,请返回JMX控制台和“ SimpleService” MBean视图。 在“执行”方法中,使用随机参数:

点击“调用”按钮,注意Eclipse并没有暂停执行。 现在,使用“ myinput”作为输入值,单击“ Invoke”,然后注意Eclipse捕获了执行。

现在,您可以继续使用众所周知的调试选项(进入方法,观察变量值等),而不必担心系统用户会受到影响。

您可以在此处下载Eclipse项目。

快乐寻找虫子!

相关文章 :
  • 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

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

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

相关文章

Chrome 控制台不完全指南

Chrome的开发者工具已经强大到没朋友的地步了&#xff0c;特别是其功能丰富界面友好的console&#xff0c;使用得当可以有如下功效&#xff1a; 更高「逼格」更快「开发调试」更强「进阶级的Frontender」Bug无处遁形「Console大法好」console.log 大家都会用log&#xff0c;但鲜…

datanucleus_DataNucleus 3.0与Hibernate 3.5

datanucleus如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规…

Android学习笔记——Menu(二)

知识点&#xff1a;这次将继续上一篇文章没有讲完的Menu的学习&#xff0c;上下文菜单(Context menu)和弹出菜单(Popup menu)。 上下文菜单上下文菜单提供对UI界面上的特定项或上下文框架的操作&#xff0c;就如同Windows中右键菜单一样。 在Android中&#xff0c;有两种提供上…

eclipse卡慢解决办法

1.设置JVM运行内存 1.1编辑eclipse.ini 1.2 编辑eclipse.ini,设置jvm运行内存参数&#xff0c;最小内存&#xff1a;物理内存*0.2&#xff0c; 最大内存&#xff1a; 物理内存*0.6&#xff1b; 其中-vmargs为必须添加参数&#xff08;-vmargs的意思是设置JVM参数&#xff09;,…

QQ游戏百万人同时在线服务器架构实现

转载自&#xff1a;http://morton5555.blog.163.com/blog/static/976407162012013112545710/# QQ游戏于前几日终于突破了百万人同时在线的关口&#xff0c;向着更为远大的目标迈进&#xff0c;这让其它众多传统的棋牌休闲游戏平台黯然失色&#xff0c;相比之下&#xff0c;联众…

ruby和python_Ruby,Python和Java中的Web服务

ruby和python今天&#xff0c;我不得不准备一些示例来说明Web服务是可互操作的。 因此&#xff0c;我已经使用Metro使用Java创建了一个简单的Web服务&#xff0c;并在Tomcat上启动了它。 然后尝试使用Python和Ruby消耗它们。 这是全部完成的过程… Java中的Web服务 我从Java中…

USB描述符【整理】

USB描述符 USB描述符信息存储在USB设备中&#xff0c;在枚举过程中&#xff0c;USB主机会向USB设备发送GetDescriptor请求&#xff0c;USB设备在收到这个请求之后&#xff0c;会将USB描述符信息返回给USB主机&#xff0c;USB主机分析返回来的数据&#xff0c;判断出该设备是哪一…

什么是垃圾回收?

以下是我们的垃圾收集手册中的一个示例&#xff0c;该手册将在接下来的几周内发布。 同时&#xff0c;花点时间熟悉垃圾收集的基础知识-这将是本书的第一章。 乍一看&#xff0c;垃圾收集应该处理顾名思义的问题-查找并丢弃垃圾。 实际上&#xff0c;它所做的恰恰相反。 垃圾收…

Extjs弹窗-简单文本编辑框-Ext.Msg.show

var datavalue测试202109;//文本传入数据 Ext.Msg.show({ title:标题, msg:说明, width:600, height:500, prompt:true, multiline:200, closable:true, …

word模板插入文本域并调整表格某一个行的列宽度

一、插入文本域 操作步骤&#xff1a;插入&#xff08;菜单&#xff09;->文档部件&#xff08;菜单&#xff09;->域&#xff08;菜单&#xff09;->邮件合并->输入名称->确认 二、调整word表格某个单元格宽度 选中某行&#xff0c;按住ctrl键的同时&#xf…

java泛型视频教程_Java泛型快速教程

java泛型视频教程泛型是Java SE 5.0引入的一种Java功能&#xff0c;在其发布几年后&#xff0c;我发誓那里的每个Java程序员不仅会听说过&#xff0c;而且已经使用过。 关于Java泛型&#xff0c;有很多免费和商业资源&#xff0c;而我使用的最佳资源是&#xff1a; Java教程 …

Windows上的Oracle Java

我最近为基于Windows 7的笔记本电脑下载了JDK 9的早期访问版本 &#xff08;内部版本68 &#xff09;。 由于这是早期版本&#xff0c;因此当自动安装在笔记本电脑上安装主要Java Runtime Environment&#xff08;JRE&#xff09;引入了一些不太理想的问题时&#xff0c;我并不…

extjs弹出窗口查看文本内容-new Ext.Window

代码样例&#xff1a; function processscan(){ var text时间 用户 操作<br> 时间 用户 操作<br> 时间 用户 操作; var win new Ext.Window({ layout: fit, width: 700, height: 600, closeAction: hide, dra…

Ioc Autofac心得

对于这个容器注入&#xff0c;个人也不是很熟悉&#xff0c;很多还不懂&#xff0c;只会基本的操作&#xff0c;几天把它记录下来&#xff0c;说不定以后帮助就大了呢&#xff0c;这方面跟安卓差距还是挺大的 下面记录下应用的流程 步骤&#xff1a; 1.添加应用 2.重写工厂&…

深入学习Web Service系列----异步开发模式

概述 在本篇随笔中&#xff0c;通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式&#xff0c;同步调用和异步调用。同步调用是程序继续执行前等候调用的完成&#xff0c;而异步调用在后台继续时&#xff0c;程序也继续执行&#xff0c;不…

navicate导出导入表数据问题

1.导出导入json&#xff0c;如下图&#xff0c;右击表点击导出向导&#xff0c;选择json导出类型&#xff0c;根据提示导出即可。 导入时&#xff0c;右击接收的表&#xff0c;点击导入向导&#xff0c;根据提示即可快速导入&#xff08;注&#xff1a;不同系统之间导出导入易…

tongweb通过控制台简单设置确认相关常用参数

1.环境版本 jdk&#xff0c;tongweb版本确认是否正确 2.检查tongweb的 license是不是永久版本&#xff0c;试用期版本到期会停止服务。 3 JVM运行编码配置-根据系统需要配置 3.1-Dfile.encodingUTF-8 编码根据系统需要配置 4. tongweb运行内存大小--根据系统需要配置 4.1一般 …

编译原理--LL(1)分析法实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试LL&#xff08;1&#xff09;分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL&#xff08;1&#xff09;分析法的理解。 2.实验要求 对下列文法&#xff0c;用LL&#xff08;…

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…