我们最终采用的解决方案实际上并未使用 Jolokia 或 Hawt.io。
我们最终使用了Jconsole。
在查看ActiveMQ队列时,如果您在队列中使用了 java 序列化对象,则数据的可读性不会很高,但如果将对象序列化为 json,则很容易看到队列中的内容。
不过,仔细阅读这些说明非常重要。
这些说明讨论了SSH 隧道,很容易搞砸一些事情,并且当出现问题时没有很好的日志消息。
远程调试
出于安全原因,我们已经关闭了远程虚拟机上所有打开的调试端口。
为了让远程调试工作,我们需要使用SSH 隧道来访问远程虚拟机调试端口。
远程应用程序设置
您要远程调试的应用程序必须启用 JPDA 传输连接器。
在 Java 1.4 之后,要启用 JPDA Transport,请在启动 java 虚拟机时添加以下 vm 参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<remote_port_number>
上面的属性很难描述,但上面介绍的效果很好。有关上述属性的更多信息,请参见“连接和调用详细信息”页面。
本地 IDE 设置
在 Intellij 中连接远程 java 虚拟机,打开“Run/Debug Configurations”窗口。
然后选择一个新的“远程”配置。
输入以下值:
调试器模式 |
附加到远程 JVM |
主持人 |
本地主机 |
港口 |
<本地端口号>* |
使用模块类路径 |
<local_package>** |
- <port_number> 应该是您将要启动的 ssh 隧道会话的本地端口号。建议 <remote_port_number> 和 <local_port_number> 是相同的值。
** 此值应该是您本地项目的名称。
SSH 隧道
要真正连接到远程调试端口,我们需要使用 SSH 隧道。
通过终端命令行运行以下命令:
$ ssh -L <local_port_number>:localhost:<remote_port_number> -f <username>@<remote_server_name> -N
例子:
$ ssh -L 10001:localhost:10001 -f <your_username>@<your.server.com> -N
该命令执行以下操作:
- 使用 <remote_server_name> 启动 ssh 会话。
- 将您的 <local_port_number> 连接到远程计算机本地主机的 <remote_port_number>。在这种情况下,我们说连接到 <your.server.com> 机器的 localhost:10001。
在 Intellij IDE 中启动远程调试,然后您应该连接到远程 java 虚拟机。
资源
Intellij IDEA远程调试java控制台程序
使用 SSH 隧道远程调试 Java 应用程序(不打开服务器端口)
远程 JMX
我们使用 JMX 来查看 Spring Integration Kaha DB Queues。
远程应用程序设置添加以下 vm 参数:
-Dcom.sun.management.jmxremote.port=64250
-Dcom.sun.management.jmxremote.rmi.port=64250
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=127.0.0.1
jmxremote.port 和 jmxremote.rmi.port 可以是任意数字,并且它们可以是不同的值,如果它们在下面进行 ssh 隧道时它们是相同的值会很有帮助。
SSH 隧道
$ ssh -L 64250:localhost:64250 -f <your_username>@<your.server.com> -N
JConsole 设置
这是在一个新的终端窗口中完成的。
$ jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=64250 service:jmx:rmi:///jndi/rmi://127.0.0.1:64250/jmxrmi
资源
为什么 Java 在配置 JMX 时会打开 3 个端口?
清理
要关闭上面的 ssh 进程:
$ lsof -i tcp | grep ^ssh
然后对进程ID执行kill。
使用 jps 和 jstack 帮助调试
列出机器上运行的所有 java 进程:
$ sudo jps
列出正在运行的应用程序的线程:
$ sudo -u <process_owner> jstack <process_id>
例子:
$ sudo -u tomcat jstack <pid>