Skip to content

Commit c6f5cc7

Browse files
Timmyclaude
andcommitted
refactor(context): replace DistributedContext with type-safe TarsContext
Replace the stringly-typed DistributedContext (String key + Object value) with TarsContext using typed Key<T> keys, eliminating unchecked casts at call sites. Remove dead code (DistributedContextCodec, CodecException) that was never invoked. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9cd2c9c commit c6f5cc7

11 files changed

Lines changed: 108 additions & 379 deletions

File tree

core/src/main/java/com/qq/tars/client/rpc/tars/TarsInvoker.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
import com.qq.tars.common.FilterKind;
2929
import com.qq.tars.common.util.Constants;
3030
import com.qq.tars.common.util.DyeingSwitch;
31-
import com.qq.tars.context.DistributedContext;
32-
import com.qq.tars.context.DistributedContextManager;
31+
import com.qq.tars.context.TarsContext;
3332
import com.qq.tars.protocol.tars.support.TarsMethodInfo;
3433
import com.qq.tars.protocol.util.TarsHelper;
3534
import com.qq.tars.rpc.common.Url;
@@ -119,13 +118,13 @@ private TarsServantResponse invokeWithSync(Method method, Object args[], Map<Str
119118
request.setMethodParameters(args);
120119
request.setContext(context);
121120
request.setInvokeStatus(Request.InvokeStatus.SYNC_CALL);
122-
DistributedContext distributedContext = DistributedContextManager.getDistributedContext();
123-
Boolean bDyeing = distributedContext.get(DyeingSwitch.BDYEING);
121+
TarsContext ctx = TarsContext.current();
122+
Boolean bDyeing = ctx.get(TarsContext.DYEING);
124123
if (bDyeing != null && bDyeing == true) {
125124
request.setMessageType(request.getMessageType() | TarsHelper.MESSAGETYPEDYED);
126125
HashMap<String, String> status = new HashMap<>();
127-
String routeKey = distributedContext.get(DyeingSwitch.DYEINGKEY);
128-
String fileName = distributedContext.get(DyeingSwitch.FILENAME);
126+
String routeKey = ctx.get(TarsContext.DYEING_KEY);
127+
String fileName = ctx.get(TarsContext.DYEING_FILENAME);
129128
status.put(DyeingSwitch.STATUS_DYED_KEY, routeKey == null ? "" : routeKey);
130129
status.put(DyeingSwitch.STATUS_DYED_FILENAME, fileName == null ? "" : fileName);
131130
request.setStatus(status);
@@ -156,13 +155,13 @@ private <V> CompletableFuture<V> invokeWithPromiseFuture(Method method, Object a
156155
request.setApi(super.getApi());
157156
request.setMethodInfo(methodInfo);
158157

159-
DistributedContext distributedContext = DistributedContextManager.getDistributedContext();
160-
Boolean bDyeing = distributedContext.get(DyeingSwitch.BDYEING);
158+
TarsContext ctx = TarsContext.current();
159+
Boolean bDyeing = ctx.get(TarsContext.DYEING);
161160
if (bDyeing != null && bDyeing == true) {
162161
request.setMessageType(request.getMessageType() | TarsHelper.MESSAGETYPEDYED);
163162
HashMap<String, String> status = new HashMap<>();
164-
String routeKey = distributedContext.get(DyeingSwitch.DYEINGKEY);
165-
String fileName = distributedContext.get(DyeingSwitch.FILENAME);
163+
String routeKey = ctx.get(TarsContext.DYEING_KEY);
164+
String fileName = ctx.get(TarsContext.DYEING_FILENAME);
166165
status.put(DyeingSwitch.STATUS_DYED_KEY, routeKey == null ? "" : routeKey);
167166
status.put(DyeingSwitch.STATUS_DYED_FILENAME, fileName == null ? "" : fileName);
168167
request.setStatus(status);

core/src/main/java/com/qq/tars/common/util/DyeingSwitch.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,33 @@
1515
*/
1616
package com.qq.tars.common.util;
1717

18-
import com.qq.tars.context.DistributedContext;
19-
import com.qq.tars.context.DistributedContextManager;
18+
import com.qq.tars.context.TarsContext;
2019

2120

2221
public class DyeingSwitch {
23-
24-
public static final String BDYEING = "bDyeing";
25-
public static final String DYEINGKEY = "dyeingKey";
26-
public static final String SERVANT = "servantName";
27-
public static final String FILENAME = "dyeFileName";
28-
public static final String REQ = "request";
29-
public static final String RES = "response";
22+
3023
public static final String STATUS_DYED_KEY = "STATUS_DYED_KEY";
3124
public static final String STATUS_DYED_FILENAME = "STATUS_DYED_FILENAME";
32-
25+
3326
public static void enableActiveDyeing(final String servant) {
34-
DistributedContext context = DistributedContextManager.getDistributedContext();
35-
context.put(BDYEING, true);
36-
context.put(DYEINGKEY, null);
37-
context.put(FILENAME, servant == null ? "default" : servant);
27+
TarsContext ctx = TarsContext.current();
28+
ctx.set(TarsContext.DYEING, true);
29+
ctx.set(TarsContext.DYEING_KEY, null);
30+
ctx.set(TarsContext.DYEING_FILENAME, servant == null ? "default" : servant);
3831
}
39-
32+
4033
public static void enableUnactiveDyeing(final String sDyeingKey, final String servant) {
41-
DistributedContext context = DistributedContextManager.getDistributedContext();
42-
context.put(BDYEING, true);
43-
context.put(DYEINGKEY, sDyeingKey);
44-
context.put(FILENAME, servant);
34+
TarsContext ctx = TarsContext.current();
35+
ctx.set(TarsContext.DYEING, true);
36+
ctx.set(TarsContext.DYEING_KEY, sDyeingKey);
37+
ctx.set(TarsContext.DYEING_FILENAME, servant);
4538
}
46-
39+
4740
public static void closeActiveDyeing() {
48-
DistributedContext context = DistributedContextManager.getDistributedContext();
49-
context.put(BDYEING, false);
50-
context.put(DYEINGKEY, null);
51-
context.put(FILENAME, null);
41+
TarsContext ctx = TarsContext.current();
42+
ctx.set(TarsContext.DYEING, false);
43+
ctx.set(TarsContext.DYEING_KEY, null);
44+
ctx.set(TarsContext.DYEING_FILENAME, null);
5245
}
5346

5447
}

core/src/main/java/com/qq/tars/context/DistributedContext.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

core/src/main/java/com/qq/tars/context/DistributedContextCodec.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

core/src/main/java/com/qq/tars/context/DistributedContextManager.java

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/**
2+
* Tencent is pleased to support the open source community by making Tars available.
3+
*
4+
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
5+
*
6+
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
7+
* in compliance with the License. You may obtain a copy of the License at
8+
*
9+
* https://opensource.org/licenses/BSD-3-Clause
10+
*
11+
* Unless required by applicable law or agreed to in writing, software distributed
12+
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
13+
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
14+
* specific language governing permissions and limitations under the License.
15+
*/
16+
package com.qq.tars.context;
17+
18+
import com.qq.tars.client.rpc.Request;
19+
import com.qq.tars.client.rpc.Response;
20+
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
public final class TarsContext {
25+
26+
public static final class Key<T> {
27+
private final String name;
28+
29+
private Key(String name) {
30+
this.name = name;
31+
}
32+
33+
public static <T> Key<T> named(String name) {
34+
return new Key<>(name);
35+
}
36+
37+
@Override
38+
public String toString() {
39+
return name;
40+
}
41+
}
42+
43+
// Dyeing keys
44+
public static final Key<Boolean> DYEING = Key.named("dyeing");
45+
public static final Key<String> DYEING_KEY = Key.named("dyeingKey");
46+
public static final Key<String> DYEING_FILENAME = Key.named("dyeFileName");
47+
48+
// Request processing keys
49+
public static final Key<Request> REQUEST = Key.named("request");
50+
public static final Key<Response> RESPONSE = Key.named("response");
51+
public static final Key<String> SERVANT_NAME = Key.named("servantName");
52+
53+
private static final ThreadLocal<TarsContext> CURRENT = ThreadLocal.withInitial(TarsContext::new);
54+
55+
private final Map<Key<?>, Object> values = new HashMap<>();
56+
57+
public static TarsContext current() {
58+
return CURRENT.get();
59+
}
60+
61+
public static void release() {
62+
CURRENT.remove();
63+
}
64+
65+
@SuppressWarnings("unchecked")
66+
public <T> T get(Key<T> key) {
67+
return (T) values.get(key);
68+
}
69+
70+
public <T> void set(Key<T> key, T value) {
71+
values.put(key, value);
72+
}
73+
}

core/src/main/java/com/qq/tars/context/exc/CodecException.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)