Spring Boot HealthIndicator线程安全吗?

y0u0uwnf  于 2023-02-12  发布在  Spring
关注(0)|答案(1)|浏览(144)

我是否必须使check()方法成为线程安全的?

@Component
public class MyHealthIndicator implements HealthIndicator {

    @Autowired
    private MyComponent myComponent;

    @Override
    public Health health() {
        int errorCode = myComponent.check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}

对相应执行器端点的请求是否在单独的线程中执行?应用逻辑本身只有一个线程。

tktrz96b

tktrz96b1#

直接回答你的问题...
我必须使方法check()成为线程安全的吗?
您不必 * 使它成为线程安全的,但是如果您的应用程序要求myComponent.check()一次只能由单个线程执行,那么是的,您需要将它标记为synchronized
为了回答更普遍的问题
HealthIndicator线程安全吗?
默认情况下,启动的每个健康检查(通常由HTTP调用启动,可能是对/actuator/health)将在单个线程上运行,并检查顺序注册HealthIndicator的每个组件的健康,因此单个请求是单线程的。
然而...没有什么可以阻止多个客户端同时向/actuator/health发出请求,因此 * 可能 * 同时进行多个健康检查,每个检查将在不同的线程上执行。
因此,如果有一些原因使得myComponent.check()不应该被多个线程并发执行,那么您需要将其标记为synchronized,或者添加一些其他的并发限制机制(例如java.util.concurrent.Semaphore)。

相关问题