本人开发机是Windows操作系统,程序依赖ActiveMQ服务,今天早上发现程序跑不起来,一番检查发现本机的ActiveMQ服务停止了,但启动不起来,查看ActiveMQ日志“wrapper.log”发现一下错误:

INFO   | jvm 1    | 2021/10/13 09:47:35 |  INFO | Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-CUQU48I-54039-1634089655438-0:1) is starting
INFO   | jvm 1    | 2021/10/13 09:47:35 | ERROR | Failed to start Apache ActiveMQ (localhost, ID:DESKTOP-CUQU48I-54039-1634089655438-0:1)
INFO   | jvm 1    | 2021/10/13 09:47:35 | java.io.IOException: Transport Connector could not be registered in JMX: java.io.IOException: Failed to bind to server socket: tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600 due to: java.net.BindException: Address already in use: JVM_Bind

     就是说,“无法绑定本机的61616端口,因为这个端口已经被占用”

     61616端口,是在ActiveMQ的配置文件“activemq.xml”中配置的,openwire这个就是配置的61616端口。

<transportConnectors>
      <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
      <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
      <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
      <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
      <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
      <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

     既然提示端口被占用,那就使用命令“netstat -ano | findstr 61616 ”来查看一下究竟是否有端口被占用。

C:\Users\yangyang>netstat -ano | findstr 61616
  协议   本地地址                   外部地址                状态           PID
  TCP    192.168.6.200:53843    192.168.1.6:61616      ESTABLISHED     22036
  TCP    192.168.6.200:53844    192.168.1.5:61616      ESTABLISHED     22036

     可以看到,上面是我本机有一个程序访问了部两台机器的61616端口,本机并没有任何61616端口被占用,那为什么提示这个端口被占用呢(如果被占用可以根据PID去资源管理器里面查看是什么程序,或者使用 则使用 taskkill /f /pid 直接关闭该进程)?

     经过一顿搜索,发现在Windows的服务中有个名为“Internet Connection Sharing (ICS)”的服务。

     把这个服务,重新启动一下,就好了。重启完成之后,再次使用"netstat -ano | findstr 61616" 命令查看,可以看到ActiveMQ启动之后,61616端口被正常监听了。

C:\Users\yangyang>netstat -ano | findstr 61616
  协议   本地地址                   外部地址                状态           PID
  TCP    0.0.0.0:61616          0.0.0.0:0              LISTENING       22380
  TCP    [::]:61616             [::]:0                 LISTENING       22380

     22380就是ActiveMQ使用的java进程。

参考: