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