RabbitMQ 连接异常导致容器中的SpringBoot 项目退出问题分析
1、首先描述一下问题:
今日在开发环境提测时,发现了部署在容器中的后台服务一直在重新启动,导致无法提供服务。
2、项目背景
采用了 Springboot+nacos,消息中心使用mq,使用依赖
// rabbitmqimplementation 'org.springframework.boot:spring-boot-starter-amqp:2.1.7.RELEASE'
3、分析定位问题
1)步骤重现,无特定步骤使用平台几分钟后便无法提供访问。
2)查看k8s Pod 详情,使用kubectl describe pod ,发现pod 健康状态为Unhealthy,导致无法对外提供服务。
3)查看deployment的健康检查机制
livenessProbe:httpGet:scheme: HTTPpath: /actuator/healthport: 20016initialDelaySeconds: 120periodSeconds: 15
使用了springboot 框架的actuator 健康检查
4)再查看pod的日志信息
2020-11-19 20:23:12 | INFO | grpc-default-executor-7 | org.springframework.amqp.rabbit.connection.CachingConnectionFactory | Attempting to connect to: [192.168.**.***]
2020-11-19 20:23:12 | ERROR | grpc-default-executor-7 | com.***i.mq.impl.PlatformMqServiceImpl | 发送消息失败,Exception:
org.springframework.amqp.AmqpIOException: java.io.IOExceptionat org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:71)at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:530)at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:702)at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:214)at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2076)at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2050)at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2030)at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:403)
...at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:172)at org.apache.skywalking.apm.plugin.grpc.v1.CallServerInterceptor$ServerCallListener.onHalfClose(CallServerInterceptor.java:144)at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:331)at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:817)at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: nullat com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:126)at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:122)at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:373)at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1104)at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1054)at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:484)... 50 common frames omitted
Caused by: com.rabbitmq.client.ShutdownSignalException: connection errorat com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:494)at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:315)... 53 common frames omitted
Caused by: java.io.EOFException: nullat java.io.DataInputStream.readUnsignedByte(DataInputStream.java:290)at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:596)... 1 common frames omitted2020-11-19 20:23:12 | INFO | XNIO-1 task-7 | org.springframework.amqp.rabbit.connection.CachingConnectionFactory | Attempting to connect to: [192.168.17.193]
2020-11-19 20:23:12 | WARN | AMQP Connection 192.168.17.193:5672 | com.rabbitmq.client.impl.ForgivingExceptionHandler | An unexpected connection driver error occured (Exception message: Connection reset)
2020-11-19 20:23:12 | WARN | XNIO-1 task-7 | org.springframework.boot.actuate.amqp.RabbitHealthIndicator | Rabbit health check failed
org.springframework.amqp.AmqpIOException: java.io.IOExceptionat org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:71)at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:530)at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:702)at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:214)at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2076)at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2050)at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2030)at org.springframework.boot.actuate.amqp.RabbitHealthIndicator.getVersion(RabbitHealthIndicator.java:49)at org.springframework.boot.actuate.amqp.RabbitHealthIndicator.doHealthCheck(RabbitHealthIndicator.java:44)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.boot.actuate.health.HealthEndpoint.health(HealthEndpoint.java:50)at org.springframework.boot.actuate.health.HealthEndpointWebExtension.health(HealthEndpointWebExtension.java:53)at sun.reflect.GeneratedMethodAccessor233.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)at org.springframework.boot.actuate.endpoint.invoke.reflect.ReflectiveOperationInvoker.invoke(ReflectiveOperationInvoker.java:76)at org.springframework.boot.actuate.endpoint.annotation.AbstractDiscoveredOperation.invoke(AbstractDiscoveredOperation.java:60)at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$ServletWebOperationAdapter.handle(AbstractWebMvcEndpointHandlerMapping.java:278)at org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(AbstractWebMvcEndpointHandlerMapping.java:334)at sun.reflect.GeneratedMethodAccessor232.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)at org.apache.skywalking.apm.plugin.undertow.v2x.SWRunnable.run(SWRunnable.java:48)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: nullat com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:126)at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:122)at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:373)at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1104)at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1054)at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:484)... 95 common frames omitted
Caused by: com.rabbitmq.client.ShutdownSignalException: connection errorat com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:494)at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:315)... 98 common frames omitted
Caused by: java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStream.java:210)at java.net.SocketInputStream.read(SocketInputStream.java:141)at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)at java.io.BufferedInputStream.read(BufferedInputStream.java:265)at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:596)... 1 common frames omitted
2020-11-19 20:23:12 | INFO | Thread-10 | com.alibaba.cloud.nacos.registry.NacosServiceRegistry | De-registering from Nacos Server now...
2020-11-19 20:23:12 | INFO | Thread-10 | com.alibaba.cloud.nacos.registry.NacosServiceRegistry | De-registration finished.
2020-11-19 20:23:12 | INFO | Thread-10 | org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor | Shutting down ExecutorService 'applicationTaskExecutor'
2020-11-19 20:23:12 | INFO | Thread-10 | com.alibaba.druid.pool.DruidDataSource | {dataSource-1} closing ...
2020-11-19 20:23:12 | INFO | Thread-10 | com.alibaba.druid.pool.DruidDataSource | {dataSource-1} closed
2020-11-19 20:23:12 | INFO | Thread-10 | io.undertow.servlet | Destroying Spring FrameworkServlet 'dispatcherServlet'
查到报错:Rabbit health check failed, mq的健康检查未通过,导致容器/actuator/health 健康检查时显
{"status": "DOWN"
}
由于spring-boot-actuator 不太了解,查阅资料后得知,当项目中使用了mq 时,spring boot 自动生成mq的健康检查。mq无法连接时,导致整体的项目健康检查未通过,pod 重启
从前往后追从/actuator/health开始
package org.springframework.boot.actuate.health;
import ...@Endpoint(id = "health")
public class HealthEndpoint {private final HealthIndicator healthIndicator;/*** Create a new {@link HealthEndpoint} instance that will use the given* {@code healthIndicator} to generate its response.* @param healthIndicator the health indicator*/public HealthEndpoint(HealthIndicator healthIndicator) {Assert.notNull(healthIndicator, "HealthIndicator must not be null");this.healthIndicator = healthIndicator;}@ReadOperationpublic Health health() {return this.healthIndicator.health();}...
}
由端点来提供接口并返回数据最终调用HealthIndicator .health()方法。
package org.springframework.boot.actuate.autoconfigure.health;import ...@Configuration
@ConditionalOnSingleCandidate(HealthIndicatorRegistry.class)
@ConditionalOnEnabledEndpoint(endpoint = HealthEndpoint.class)
class HealthEndpointConfiguration {@Bean@ConditionalOnMissingBeanpublic HealthEndpoint healthEndpoint(HealthAggregator healthAggregator, HealthIndicatorRegistry registry) {return new HealthEndpoint(new CompositeHealthIndicator(healthAggregator, registry));}}
由自动转装配的bean 对象实现了构造方法,查看一下CompositeHealthIndicator.health()实现
package org.springframework.boot.actuate.health;import ...
public class CompositeHealthIndicator implements HealthIndicator {
...@Overridepublic Health health() {Map<String, Health> healths = new LinkedHashMap<>();for (Map.Entry<String, HealthIndicator> entry : this.registry.getAll().entrySet()) {healths.put(entry.getKey(), entry.getValue().health());}return this.aggregator.aggregate(healths);}}
遍历registry 中所有 对象获取health().HealthIndicatorRegistry 由下述方法实现
package org.springframework.boot.actuate.autoconfigure.health;import ...
@Configuration
@EnableConfigurationProperties({ HealthIndicatorProperties.class })
public class HealthIndicatorAutoConfiguration {...@Bean@ConditionalOnMissingBean(HealthIndicatorRegistry.class)public HealthIndicatorRegistry healthIndicatorRegistry(ApplicationContext applicationContext) {return HealthIndicatorRegistryBeans.get(applicationContext);}
...}
get方法如下
package org.springframework.boot.actuate.autoconfigure.health;import ...final class HealthIndicatorRegistryBeans {private HealthIndicatorRegistryBeans() {}public static HealthIndicatorRegistry get(ApplicationContext applicationContext) {Map<String, HealthIndicator> indicators = new LinkedHashMap<>();indicators.putAll(applicationContext.getBeansOfType(HealthIndicator.class));if (ClassUtils.isPresent("reactor.core.publisher.Flux", null)) {new ReactiveHealthIndicators().get(applicationContext).forEach(indicators::putIfAbsent);}HealthIndicatorRegistryFactory factory = new HealthIndicatorRegistryFactory();return factory.createHealthIndicatorRegistry(indicators);}
...
}
从applicationContext中获取所有HealthIndicator对象。打断点后发现确实存在RabbitHealthIndicator 的bean 对象。
RabbitHealthIndicator.health()实现如下
package org.springframework.boot.actuate.amqp;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.util.Assert;/*** Simple implementation of a {@link HealthIndicator} returning status information for the* RabbitMQ messaging system.** @author Christian Dupuis* @since 1.1.0*/
public class RabbitHealthIndicator extends AbstractHealthIndicator {private final RabbitTemplate rabbitTemplate;public RabbitHealthIndicator(RabbitTemplate rabbitTemplate) {super("Rabbit health check failed");Assert.notNull(rabbitTemplate, "RabbitTemplate must not be null");this.rabbitTemplate = rabbitTemplate;}@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {builder.up().withDetail("version", getVersion());}private String getVersion() {return this.rabbitTemplate.execute((channel) -> channel.getConnection().getServerProperties().get("version").toString());}/****此方法由父类AbstractHealthIndicator 实现******/@Overridepublic final Health health() {Health.Builder builder = new Health.Builder();try {doHealthCheck(builder);}catch (Exception ex) {if (this.logger.isWarnEnabled()) {String message = this.healthCheckFailedMessage.apply(ex);this.logger.warn(StringUtils.hasText(message) ? message : DEFAULT_MESSAGE, ex);}builder.down(ex);}return builder.build();} }
可以看到当mq的健康检查未通过时,会有报错信息Rabbit health check failed,至此问题定位完毕。
4、解决问题
如果mq 对项目影响较大,则由此健康检查保证项目对外服务时,是可用状态。
如果mq的影响不大,健康检查可有可无,则可以通过配置来忽略mq的健康检查。
management.health.rabbit.enabled=false
此配置如何生效 可以查看参考文章《SpringBoot健康检查实现原理》,这里就不在赘述。
5、反思
平时还需多查看源码,多积累,方能快速的定位问题。
参考文章:
Spring boot 2.0 Actuator 的健康检查
spring-boot-actuator中health的工作原理解析
SpringBoot健康检查实现原理
RabbitMQ 连接异常导致容器中的SpringBoot 项目退出问题分析相关推荐
- Eclipse中创建SpringBoot项目流程,及报错解决方案
Eclipse中创建SpringBoot项目流程,及报错解决方案 参考文章: (1)Eclipse中创建SpringBoot项目流程,及报错解决方案 (2)https://www.cnblogs.co ...
- IDEA中启动SpringBoot项目时提示:“Error java:程序包xxx不存在”,但实际上是存在的
场景 在IDEA中启动SpringBoot项目时提示: Error java: 程序包xxx不存在" 但是实际上这个包是存在的. 这个包是自己写的websocket的服务端和客户端的包,是存 ...
- Docker基础学习笔记( 搭建web漏洞检测环境和容器中运行Django项目)
目录 一.Docker技术的学习 1.1.docker安装(ubuntu16.04) 1.1.1.apt-get换国内清华源 1.1.2.安装最新版本的Docker 1.2.docker容器与镜像使用 ...
- 小灰灰的springboot的学习之路(一):在MyEclipse中创建SpringBoot项目
在MyEclipse中创建SpringBoot项目 因为不经常新建项目,这新创建项目的步骤都忘球了,所以我写篇文章做一下记录! 第一步:创建项目 右键–>New–>Other- 选择 Ma ...
- 阿里云服务器的Linux系统中搭建springboot项目
文章目录 一.云服务器 1.云服务器 弹性伸缩 2.官网免费注册 3.购买云服务器 购买学生机注意事项!!!!! 4.设置实例密码的启动实例 通过下图描述客户端是如何访问阿里云服务器的实例 实例密码设 ...
- IDEA中新建SpringBoot项目时提示:Artifact contains illegal characters
场景 一步一步教你在IEDA中快速搭建SpringBoot项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87688277 ...
- Eclipse中新建SpringBoot项目并输出HelloWorld
场景 在Eclipse中安装spring-tool-suite插件,新建SpringBoot项目更方便. https://blog.csdn.net/BADAO_LIUMANG_QIZHI/artic ...
- maven怎么和ecli_Maven的配置和Eclipse中导入SpringBoot项目一些注意点
1.Maven环境的配置: 1.1:在下载,安装好Maven后,首先对其conf目录下的settings.xml文件做修改: (如下所示:设置本地仓库的地址--->地址可自愿选择) 1 E:/S ...
- idea中,springboot项目部署到docker
一.首先在linux下面安装docker 安装方法:https://blog.csdn.net/qq_35990967/article/details/118667939?spm=1001.2014. ...
最新文章
- 并发编程之Synchronized
- VS 2012 找回消失的“创建单元测试”
- 自定义http报头_http协议报头详解HTTP协议结构
- 机器学习第2课:单变量线性回归(Linear Regression with One Variable)
- PSVR透露下一步计划,不做内容改做声控
- C语言入门基础知识笔记
- 171-辽宁移动魔百盒CM211-1-YS-S905L3B-RTL8822C线刷包
- 空间句法软件Axwoman6.3 安装及ArcGIS 工具加载
- aven 项目 pom.xml 第一行报错 Unknow。。。。。。。解决办法
- 如何通过电影学英语 English through Movies
- sourcetree教程(去掉注册账号)
- python批量telnet检测IP地址的端口是否开放
- 深度学习与人类语言处理学习笔记(二)—— 变声(理论篇)
- 台式计算机键盘进水了还能用,电脑键盘进水的解决方法
- 小程序中css实现镜像功能
- Window脚本学习笔记之定时关闭进程
- 这些SEO搜索技巧你会不会用?
- Tomcat 输入http://localhost:8080网页打不开
- 【项目】健康项目day5总结
- [iTerm] 终端 iTerm2 的简单使用
热门文章
- AISAS模型拆解营销,抓住用户决策的每一步
- 企业如何部署开源邮箱系统?
- 【错误信息】Type interface com.chang.dao.UserinfoMapper is not known
- 全球第一经典语录,被500万人疯狂转载!!!
- 程序员数学(21)–一元二次方程
- 《漫游》之《苍之涛》
- CSS笔记11 2D与3D转换
- 万维网和互联网有什么不同
- java版本匠魂下载教程_匠魂工具怎么升级?这篇超详细教程攻略请收下
- 一区希尔盖服务器找不到,开服新增20组服务器,《魔兽世界》怀旧服简直太火爆了!...