Skip to content

Commit ad6996f

Browse files
authored
单元测试:解决高并发时设置 timeout 可能导致写入多次,然后返回 JSON 不合法
1 parent e7eecbd commit ad6996f

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

src/main/java/apijson/framework/APIJSONController.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,18 @@ public JSONObject listMethod(String request) {
247247
public void invokeMethod(String request, HttpServletRequest servletRequest) {
248248
AsyncContext asyncContext = servletRequest.startAsync();
249249

250+
final boolean[] called = new boolean[] { false };
250251
MethodUtil.Listener<JSONObject> listener = new MethodUtil.Listener<JSONObject>() {
251252

252253
@Override
253254
public void complete(JSONObject data, Method method, InterfaceProxy proxy, Object... extras) throws Exception {
254-
ServletResponse servletResponse = asyncContext.getResponse();
255-
if (servletResponse.isCommitted()) {
256-
Log.w(TAG, "invokeMethod listener.complete servletResponse.isCommitted() >> return;");
257-
return;
255+
256+
ServletResponse servletResponse = called[0] ? null : asyncContext.getResponse();
257+
if (servletResponse == null || servletResponse.isCommitted()) { // isCommitted 在高并发时可能不准,导致写入多次
258+
Log.w(TAG, "invokeMethod listener.complete servletResponse == null || servletResponse.isCommitted() >> return;");
259+
return;
258260
}
261+
called[0] = true;
259262

260263
servletResponse.setCharacterEncoding(servletRequest.getCharacterEncoding());
261264
servletResponse.setContentType(servletRequest.getContentType());

0 commit comments

Comments
 (0)