diff --git a/dami/src/main/java/org/noear/dami/bus/impl/RoutingTag.java b/dami/src/main/java/org/noear/dami/bus/impl/RoutingTag.java index 0b566ac7f5079abb32e973c519c6193007cadfe6..c4c2b44bd5e8a1404ac9900ec80e748541596818 100644 --- a/dami/src/main/java/org/noear/dami/bus/impl/RoutingTag.java +++ b/dami/src/main/java/org/noear/dami/bus/impl/RoutingTag.java @@ -4,6 +4,7 @@ import org.noear.dami.bus.Payload; import org.noear.dami.bus.TopicListener; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * 监听路由记录(tag 模式) @@ -48,36 +49,26 @@ public class RoutingTag extends Routing { boolean topicMatch = exprList.get(0).equals(this.topic); - boolean hasTags = tags.isEmpty() || sendTags.isEmpty(); - //发送和监听一方有tags则需要匹配 - boolean tagMatch = hasTags || sendTags.stream().anyMatch(this.tags::contains); + boolean notHasTags = tags.isEmpty() || sendTags.isEmpty(); + //发送和监听双方都有tags则需要匹配 + boolean tagMatch = notHasTags || sendTags.stream().anyMatch(this.tags::contains); return topicMatch && tagMatch; } static class TopicTags { - private static Map> cached = new HashMap<>(); + private static final Map> cached = new ConcurrentHashMap<>(); /** * 获取 TopicTags */ public static List get(String expr) { - List tmp = cached.get(expr); - if (tmp == null) { - synchronized (TopicTags.class) { - tmp = cached.get(expr); - if (tmp == null) { - tmp = parse(expr); - cached.put(expr, tmp); - } - } - } - - return tmp; + return cached.computeIfAbsent(expr, TopicTags::parse); } /** * 解析表达式 + * @return List 第一个元素为topic,剩下的为tag */ private static List parse(String expr) { List parseList = new ArrayList<>(); @@ -88,6 +79,7 @@ public class RoutingTag extends Routing { return parseList; } + //topic:tag1,tag2,tag3 以 : 切割为两部分 String[] topicSplit = expr.split(":", 2); parseList.add(topicSplit[0]); @@ -95,7 +87,7 @@ public class RoutingTag extends Routing { if (topicSplit[1].isEmpty()) { return parseList; } - + //tag1,tag2,tag3 以 , 切割数组作为tags String[] tagSplit = topicSplit[1].split(","); parseList.addAll(Arrays.asList(tagSplit)); diff --git a/dami/src/test/java/features/demo15_patterned/Demo15_tag.java b/dami/src/test/java/features/demo15_patterned/Demo15_tag.java index 83ecb7a32dc577d0bcd1b72d6cd08ff70f66ce8b..fc4c331e76930d25d1c0f30d6a22f607677dcb5c 100644 --- a/dami/src/test/java/features/demo15_patterned/Demo15_tag.java +++ b/dami/src/test/java/features/demo15_patterned/Demo15_tag.java @@ -17,6 +17,9 @@ public class Demo15_tag { AtomicInteger testObserver = new AtomicInteger(); + //":"前为主题,后按 "," 号分割作为tag + //发送事件的tag只要有一个存在于监听的tag里面则会匹配 (多对多) + //拦截1 busStr.listen("demo:a,b", (payload) -> { System.err.println(payload); @@ -29,7 +32,8 @@ public class Demo15_tag { }); //发送事件 - //发送的事件的tag只有有一个存在于监听的tag里面则会匹配 + + //发送和监听双方一方没有tags则无需匹配 //2 busStr.send("demo", "world"); //1