apache / apache/servicecomb-java-chassis

addLocalContext(parentContext.getLocalContext());多线程问题Concurrentmodificationexception Bug

Đang mở
#3,323 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
1.9k
Fork
814
Merge trung bình
8 ngày 23 giờ
Pull request đã merge (30 ngày)
1

Mô tả

这个类有构造这个代码:
org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation
public SwaggerInvocation() {
parentContext = ContextUtils.getInvocationContext();
if (parentContext != null) {
addContext(parentContext.getContext());
addLocalContext(parentContext.getLocalContext());
}
}

其中addLocalContext(parentContext.getLocalContext()); 里面调用了localContext.putAll(otherContext);
这个在多线程环境,业务代码自己开多线程调用下游服务传递上下文会有多线程问题,报Concurrentmodificationexception异常
建议使用public void setLocalContext(Map localContext)直接设置上下文

或者将
protected Map context = new HashMap<>();

protected Map localContext = new HashMap<>();

都换成ConcurrentMap

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu từ org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation và kiểm tra addLocalContext, đặc biệt là lệnh gọi localContext.putAll được mô tả trong issue. So sánh các phương án xử lý context được đề xuất và xác minh rằng các lệnh gọi downstream đồng thời không gây ra ConcurrentModificationException khi truyền context cục bộ.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java
Lĩnh vực
backend
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
40/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.