服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java扩展Nginx之四:远程调试

Java扩展Nginx之四:远程调试

2023-09-02 01:20未知服务器之家 Java教程

广大java程序员日常开发和定位问题时常用的远程调试功能,nginx-clojure也支持,来体验吧 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Java扩展Nginx》系列的第四

Java扩展Nginx之四:远程调试 广大java程序员日常开发和定位问题时常用的远程调试功能,nginx-clojure也支持,来体验吧

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《Java扩展Nginx》系列的第四篇,一起来体验个实用的功能,此能力定会让爱学习的您大呼过瘾,它就是广大java程序员在日常开发和定位问题过程中常用的神技:远程调试;
  • 看变量、看堆栈,不论阅读代码还是定位问题,打断点都是我们最值得信赖的手段,当您的代码运行在nginx-clojure模块中的时候,如果能像tomcat那样远程打断点,单步调试,会大幅度提高工作效率
  • 远程断点的效果如下图所示,通过IDEA的Remote JVM Debug功能远程连接到nginx-clojure监听的远程debug端口,当浏览器请求触发了java代码的执行时,就会进入断点状态,停留在断点位置,可以看到堆栈和内存中的变量情况,以及单步执行:
    Java扩展Nginx之四:远程调试

关于工具

  • 本篇使用的编码工具是IntelliJ IDEA 2021.3.2 (Ultimate Edition)

关于代码

  • 本篇直接使用《Java扩展Nginx之一:你好,nginx-clojure》中的工程和代码,这里简单回顾如下,只有一个类:
package com.bolingcavalry.simplehello;

import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.NginxJavaRingHandler;
import java.time.LocalDateTime;
import java.util.Map;
import static nginx.clojure.MiniConstants.CONTENT_TYPE;
import static nginx.clojure.MiniConstants.NGX_HTTP_OK;

public class HelloHandler implements NginxJavaRingHandler {

    @Override
    public Object[] invoke(Map<String, Object> request) {
        return new Object[] {
                NGX_HTTP_OK, //http status 200
                ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
                "Hello, Nginx clojure! " + LocalDateTime.now()  //response body can be string, File or Array/Collection of them
        };
    }
}
  • 在nginx.conf中,配置了一个location,path是/java
location /java {
	content_handler_type 'java';
	content_handler_name 'com.bolingcavalry.simplehello.HelloHandler';
}
  • 以上就是今天要打断点调试的代码和配置了

nginx-clojure的远程调试配置

  • 打开nginx.conf文件,在http的配置中增加以下两行,即可开启nginx-clojure的远程调试:
jvm_options "-Xdebug";
jvm_options "-Xrunjdwp:server=y,transport=dt_socket,address=840#{pno},suspend=n";
  • 上述配置中,address=840#{pno}的含义要注意:
  1. 如果worker_processes配置的值等于1,address=840#{pno}表示远程调试的端口是8401
  2. 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是address=840#{pno}表示远程调试的端口是840184028403
  • 要注意的是,请确保这些端口没有被占用
  • 今天的实战为了简单省事儿,worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是8401
  • 配置完成后,启动nginx
  • 用postman访问/java,确认可以响应成功,证明nginx和nginx-clojure是正常的:
    Java扩展Nginx之四:远程调试

IDEA上的远程调试操作

  • 用IDEA打开工程,点击下图红框中的按钮:
    Java扩展Nginx之四:远程调试
  • 操作如下图,新增一个Remote JVM Debug配置:
    Java扩展Nginx之四:远程调试
  • Remote JVM Debug的设置如下,红框1是nginx的ip地址,我这里IDEA和nginx在同一台电脑上,所以用localhost即可,红框2是端口号,对应nginx配置的jvm_options中的address=840#{pno}
    Java扩展Nginx之四:远程调试
  • 配置完成后,按照下图红框数字的顺序操作,先在代码上打断点,然后执行远程连接,顺利的话会看到红框3中的连接成功提示:
    Java扩展Nginx之四:远程调试
  • 至此,远程调试功能已经准备好,可以使用了

验证

  • 在postman上再发一次请求,IDEA上立即进入断点状态,如下图:
    Java扩展Nginx之四:远程调试
  • 如果想看堆栈中的代码,可以操作如下图:
    Java扩展Nginx之四:远程调试
  • 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了:
    Java扩展Nginx之四:远程调试
  • 至此,nginx-clojure的远程调试功能演示完毕,各位java同僚们,如虎添翼的感觉有没有?学习和使用nginx-clojure的信心是否更强了呢?

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

延伸 · 阅读

精彩推荐
  • Java教程老生常谈Java动态编译(必看篇)

    老生常谈Java动态编译(必看篇)

    下面小编就为大家带来一篇老生常谈Java动态编译(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    脚本之家3792020-10-30
  • Java教程Java经典面试题汇总:Spring MVC

    Java经典面试题汇总:Spring MVC

    本篇总结的是Spring MVC框架相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多...

    让程序飞11622021-10-18
  • Java教程使用SpringCloudApiGateway之支持Cors跨域请求

    使用SpringCloudApiGateway之支持Cors跨域请求

    这篇文章主要介绍了使用SpringCloudApiGateway之支持Cors跨域请求的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐...

    Moshow郑锴11482021-10-13
  • Java教程用Eclipse生成JPA元模型的方法

    用Eclipse生成JPA元模型的方法

    下面小编就为大家带来一篇用Eclipse生成JPA元模型的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网4182020-12-10
  • Java教程详谈Java静态动态的问题

    详谈Java静态动态的问题

    下面小编就为大家带来一篇详谈Java静态动态的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    anqiang19958122021-01-04
  • Java教程Java中Collections.emptyList()的注意事项

    Java中Collections.emptyList()的注意事项

    这篇文章主要给大家介绍了关于Java中Collections.emptyList()的注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    黄智霖-blog9612021-08-30
  • Java教程Spring Boot2解决idea console 控制台输出乱码的问题

    Spring Boot2解决idea console 控制台输出乱码的问题

    这篇文章主要介绍了Spring Boot2解决idea console 控制台输出乱码的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐...

    Java技术干货6952021-10-14
  • Java教程详解mybatis通过mapper接口加载映射文件

    详解mybatis通过mapper接口加载映射文件

    本篇文章主要介绍了mybatis通过mapper接口加载映射文件 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    YSOcean5432020-12-13