spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题,应用启动的时候阻塞卡住。

spring.cloud 版本如下

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2020.0.4</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

java启动代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

##追溯源码发现 boundedElastic-1线程阻塞在getSingleton方法synchronized (this.singletonObjects)锁上

那这时候主线程是否启动应用完成了呢?答案是没有,主线程也在实例化单例bean路上。追溯源码。主线程也在getSingleton方法synchronized (this.singletonObjects)锁上获取bean,boundedElastic-1线程正是主线程发起的,主线程在这里等待返回。boundedElastic-1线程在等待synchronized (this.singletonObjects)锁释放,主线程在getSingleton方法等待boundedElastic-1线程返回结果, 由此死锁产生了。应用启动阻塞卡住了。

##boundedElastic-1线程产生过程,贴几个重要方法

spring event 事件 onApplicationEvent(ApplicationEvent event) 

routeLocator.ifAvailable(locator -> locator.getRoutes().blockLast()); blockLast方法是阻塞的。导致此bug主要原因。

##线程名字

##工厂生产线程

##该死锁问题如何解决呢?查看

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
      <version>2.2.0.RELEASE</version>
    </dependency>

源码,

该方法使用的是非阻塞方式。

routeLocator.ifAvailable(locator -> locator.getRoutes().subscribe());
 

相关推荐

  1. 的定义以及产生的必要条件,处理

    2024-04-12 00:06:02       45 阅读
  2. 产生的原因和预防

    2024-04-12 00:06:02       57 阅读
  3. 解决Oracle问题

    2024-04-12 00:06:02       35 阅读
  4. 问题,4个必要条件+避免

    2024-04-12 00:06:02       65 阅读
  5. 产生预防处理解

    2024-04-12 00:06:02       26 阅读
  6. 举一个产生Redis分布式的场景。

    2024-04-12 00:06:02       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 00:06:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 00:06:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 00:06:02       87 阅读
  4. Python语言-面向对象

    2024-04-12 00:06:02       96 阅读

热门阅读

  1. C# AOP最经典实现

    2024-04-12 00:06:02       25 阅读
  2. Terraform 通过 Provisioner 配置服务器

    2024-04-12 00:06:02       40 阅读
  3. 并发编程中常见的设计模式

    2024-04-12 00:06:02       44 阅读
  4. 比武中的一段PHP代码

    2024-04-12 00:06:02       38 阅读
  5. Vue3+elementPlus组件递归

    2024-04-12 00:06:02       34 阅读
  6. Vue 3 组合式 API:优化代码的利器

    2024-04-12 00:06:02       33 阅读
  7. JQuery

    2024-04-12 00:06:02       32 阅读
  8. ubuntu下使用ndk编译libevnet

    2024-04-12 00:06:02       32 阅读
  9. 算法刷题记录 Day37

    2024-04-12 00:06:02       34 阅读
  10. 代码随想录训练营16day:二叉树5

    2024-04-12 00:06:02       33 阅读
  11. 21. 面试指导-高频面试题详解

    2024-04-12 00:06:02       34 阅读
  12. Frp多端口映射

    2024-04-12 00:06:02       31 阅读