2

尽管浏览了几个网站并在此处出现堆栈溢出,但似乎有一种方法可以使用 Jolokia 和 Hawt.io 查看 Activemq 队列中的消息,但到目前为止我还没有成功。

我们在 Spring Webapp 的嵌入式服务中运行我们的 Activemq(版本 5.12.0),并暴露了 Jolokia Web 服务,如本网页所述: https ://jolokia.org/reference/html/agents.html#agent-war -程序化

通过 Hawt.io 查看 Jolokia Web 服务时,我无法弄清楚如何实际查看队列中的消息。

这是显示队列大小的屏幕截图:

在此处输入图像描述

那么,如何使用 Jolokia 和 Hawt.io 查看 Activemq 队列中的消息?

4

1 回答 1

0

我们最终采用的解决方案实际上并未使用 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>
于 2021-10-05T17:50:43.723 回答