无法访问JMS服务器时,注册表中未定义Spring Boot Micro服务

时间:2020-07-27 09:11:02

标签: spring-boot spring-jms spring-boot-actuator

我遇到一个奇怪的问题,我花了好几天才缩小范围。基本上,我有一个基于Spring引导版本2.1.10.RELEASE的Jhipster项目,其中包含4个微服务。我们对其中的两个感兴趣:Gateway和Corehub。 在网关中,我有一个有角度的应用程序,该应用程序执行到/ services / corehub / api / someendpoint的POST程序,该程序曾经可以正常运行,但现在由于出现不同的错误消息而失败了,但是我经常看到的是

{
  "type": "https://www.jhipster.tech/problem/problem-with-message",
  "title": "Method Not Allowed",
  "status": 405,
  "detail": "Request method 'POST' not supported",
  "path": "/services/ambientcorehub/api/trips",
  "message": "error.http.405"
}

我最终查看了跟踪内部服务微服务的注册表的痕迹,发现发生此错误时,我再也找不到痕迹中的corehub了。因此看来corehub微服务尚未注册。

此服务的另一个GIT分支没有此问题,因此我在这两个分支之间进行了比较,并删除了更改,直到可以缩小问题的范围。 因此,在corehub中,我有一个基于此mq-jms-spring实现的JMS侦听器。 Maven依赖关系如下:

        <dependency>
            <groupId>com.ibm.mq</groupId>
            <artifactId>mq-jms-spring-boot-starter</artifactId>
            <version>2.2.7</version>
        </dependency>

我注释掉了我的JmsListener类及其关联的JmsContext(以获取对主题的访问),并仅保留定义对服务器的访问的配置属性以及端口,通道,主题名称等。

如果我评论以上Maven依赖项,则我的服务将再次起作用。 如果我保持maven依赖关系(仅使用配置),则我的corehub微服务未在注册表中注册,并且无法再从网关(因此也无法从Angular UI)访问。

需要注意的重要一点是,我目前遇到一些网络问题,使我无法访问JMS服务器。 因此,我相信由于无法访问JMS服务器而导致的此IBM库引发的异常将使微服务的注册向Spring Boot注册表中断。

以下是在corehub控制台中反复出现的痕迹:

2020-07-22 08:21:45.316  WARN 7964 --- [nfoReplicator-0] o.s.boot.actuate.jms.JmsHealthIndicator  : JMS health check failed

com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to connect to queue manager '' with connection mode 'Client' and host name '172.31.14.1(9010)'.
    at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:489)
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:448)
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
    at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7815)
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:303)
    at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236)
    at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6005)
    at com.ibm.mq.jms.MQConnectionFactory.createConnection(MQConnectionFactory.java:6030)
    at org.springframework.jms.connection.SingleConnectionFactory.doCreateConnection(SingleConnectionFactory.java:409)
    at org.springframework.jms.connection.SingleConnectionFactory.initConnection(SingleConnectionFactory.java:349)
    at org.springframework.jms.connection.SingleConnectionFactory.getConnection(SingleConnectionFactory.java:327)
    at org.springframework.jms.connection.SingleConnectionFactory.createConnection(SingleConnectionFactory.java:242)
    at org.springframework.boot.actuate.jms.JmsHealthIndicator.doHealthCheck(JmsHealthIndicator.java:52)
    at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:82)
    at org.springframework.boot.actuate.health.CompositeHealthIndicator.health(CompositeHealthIndicator.java:95)
    at org.springframework.cloud.netflix.eureka.EurekaHealthCheckHandler.getHealthStatus(EurekaHealthCheckHandler.java:110)
    at org.springframework.cloud.netflix.eureka.EurekaHealthCheckHandler.getStatus(EurekaHealthCheckHandler.java:106)
    at com.netflix.discovery.DiscoveryClient.refreshInstanceInfo(DiscoveryClient.java:1406)
    at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:117)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2538' ('MQRC_HOST_NOT_AVAILABLE').
    at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
    ... 24 common frames omitted
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host '172.31.14.1(9010)' rejected. [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2538;AMQ9204: Connection to host '/172.31.14.1:9010' rejected. [1=java.net.ConnectException[Connection timed out: connect],3=/172.31.14.1:9010,4=TCP,5=Socket.connect]],3=172.31.14.1(9010),5=RemoteTCPConnection.bindAndConnectSocket]
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13558)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1426)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP.jmqiConnect(RemoteFAP.java:1385)
    at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.jmqiConnect(InterceptedJmqiImpl.java:377)
    at com.ibm.mq.ese.jmqi.ESEJMQI.jmqiConnect(ESEJMQI.java:562)
    at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:381)
    ... 23 common frames omitted
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2538;AMQ9204: Connection to host '/172.31.14.1:9010' rejected. [1=java.net.ConnectException[Connection timed out: connect],3=/172.31.14.1:9010,4=TCP,5=Socket.connect]
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.bindAndConnectSocket(RemoteTCPConnection.java:901)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.protocolConnect(RemoteTCPConnection.java:1381)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnection.connect(RemoteConnection.java:976)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getNewConnection(RemoteConnectionSpecification.java:553)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSessionFromNewConnection(RemoteConnectionSpecification.java:233)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionSpecification.getSession(RemoteConnectionSpecification.java:141)
    at com.ibm.mq.jmqi.remote.impl.RemoteConnectionPool.getSession(RemoteConnectionPool.java:127)
    at com.ibm.mq.jmqi.remote.api.RemoteFAP$Connector.jmqiConnect(RemoteFAP.java:13302)
    ... 28 common frames omitted
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.base/java.net.PlainSocketImpl.connect0(Native Method)
    at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:609)
    at java.base/java.net.Socket.connect(Socket.java:558)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$4.run(RemoteTCPConnection.java:1022)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection$4.run(RemoteTCPConnection.java:1014)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.connectSocket(RemoteTCPConnection.java:1014)
    at com.ibm.mq.jmqi.remote.impl.RemoteTCPConnection.bindAndConnectSocket(RemoteTCPConnection.java:805)
    ... 35 common frames omitted

以下是一些版本号:

  • jhipster-dependencies.version:3.0.7
  • 春季启动版本:2.1.10.RELEASE
  • 受此问题影响的
  • ibmmq-jms-spring版本:版本2.2.7
  • Java版本(包括供应商和平台):采用OpenJDK \ jdk-11.0.6.10-hotspot
  • 一个演示该问题的小代码示例。

这是我在application.yml中的配置:

spring:
  jms:
    # Used for JMS Message reception.
    isPubSubDomain: false

application:
  oag:
    # This can be a queue or a topic (if subdomain is defined)
    # In case of a topic, sub domain must be set to public.
    queueName: "BRIDGE.XXX.TO.YYY.TST"
    isTopic: false

ibm:
  mq:
    queueManager:
    channel: XXX_GWT11.BT1
    connName: 172.31.14.1(9010)
    user: xxxx
    password:

是否有可能捕获此异常,以避免破坏常规的Spring Boot注册机制? 由于无法访问JMS服务器,我无法承受关闭群集的费用。

此外,我在IBM MQ端here上打开了此消息,有人建议我停止JMS运行状况指示器。因此,我将以下属性设置为无效:

management:
  endpoint:
    jms:
      # Prevent Unreachable JMS Server from unregistering corehub from the registry, leading to unreachable microservice from the Gateway
      enabled: false

相应的文档为here

任何帮助将不胜感激。 谢谢 克里斯托夫(Christophe)

1 个答案:

答案 0 :(得分:2)

如果您不希望在JMS关闭时将应用程序视为不正常,建议您禁用JMS运行状况指示器。由于您使用过management.endpoint.jms.enabled,因此它对您不起作用。正确使用的属性是management.health.jms.enabled

management:
  health:
    jms:
      enabled: false