diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index eb9061646..54f44b1bc 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -65,6 +65,7 @@ MQ管理接口配置 不同MQ节点所配置的MQ集群不能重复。 name: 服务的名称,用于监控识别,多个mq节点时只能有一个name为空的节点,mq.name不能重复,命名规则: 字母、数字、下划线 + names: 服务的扩展名称,用于监控识别,一个mq可以使用多个资源名称,多个名称用分号;隔开, 且name需要全局唯一 value: 实现类名,必须是org.redkale.mq.MessageAgent的子类 MQ节点下的子节点配置没有固定格式, 根据MessageAgent实现方的定义来配置 --> diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java index ce8af7a16..91b1496b7 100644 --- a/src/org/redkale/boot/Application.java +++ b/src/org/redkale/boot/Application.java @@ -357,6 +357,15 @@ public final class Application { AnyValue mqConf = mqConfs[0]; String mqname = mqConf.getValue("name", ""); if (mqnames.contains(mqname)) throw new RuntimeException("mq.name(" + mqname + ") is repeat"); + mqnames.add(mqname); + String namex = mqConf.getValue("names"); + if (namex != null && !namex.isEmpty()) { + for (String n : namex.split(";")) { + if (n.trim().isEmpty()) continue; + if (mqnames.contains(n.trim())) throw new RuntimeException("mq.name(" + n.trim() + ") is repeat"); + mqnames.add(n.trim()); + } + } try { String classval = mqConf.getValue("value"); if (classval == null || classval.isEmpty()) { @@ -382,7 +391,6 @@ public final class Application { } catch (Exception e) { logger.log(Level.SEVERE, "load application mq resource error: " + mqs[i], e); } - mqnames.add(mqname); } } } @@ -426,6 +434,11 @@ public final class Application { this.resourceFactory.inject(agent); agent.init(agent.getConfig()); this.resourceFactory.register(agent.getName(), MessageAgent.class, agent); + if (agent.getNames() != null) { + for (String n : agent.getNames()) { + this.resourceFactory.register(n, MessageAgent.class, agent); + } + } } } this.messageAgents = mqs; @@ -449,6 +462,11 @@ public final class Application { if (messageAgents == null) return null; for (MessageAgent agent : messageAgents) { if (agent.getName().equals(name)) return agent; + if (agent.getNames() != null) { + for (String n : agent.getNames()) { + if (n.equals(name)) return agent; + } + } } return null; } diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 694f3d8e2..27090dad6 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -332,7 +332,7 @@ public class NodeHttpServer extends NodeServer { return; } restedObjects.add(stype); //避免重复创建Rest对象 - WebSocketServlet servlet = httpServer.addRestWebSocketServlet(serverClassLoader, stype, prefix, en.getProperty(), messageAgent); + WebSocketServlet servlet = httpServer.addRestWebSocketServlet(serverClassLoader, stype, prefix, en.getProperty()); if (servlet == null) return; //没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null String prefix2 = prefix; WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class); diff --git a/src/org/redkale/mq/MessageAgent.java b/src/org/redkale/mq/MessageAgent.java index 27bce75db..76cd4d00b 100644 --- a/src/org/redkale/mq/MessageAgent.java +++ b/src/org/redkale/mq/MessageAgent.java @@ -38,6 +38,8 @@ public abstract class MessageAgent { protected String name; + protected String[] names; + protected AnyValue config; protected MessageProducer producer; @@ -55,6 +57,16 @@ public abstract class MessageAgent { protected HashMap messageNodes = new LinkedHashMap<>(); public void init(AnyValue config) { + this.name = checkName(config.getValue("name", "")); + String namex = config.getValue("names"); + if (namex != null && !namex.isEmpty()) { + List list = new ArrayList<>(); + for (String n : namex.split(";")) { + if (n.trim().isEmpty()) continue; + list.add(n.trim()); + } + if (!list.isEmpty()) this.names = list.toArray(new String[list.size()]); + } } //ServiceLoader时判断配置是否符合当前实现类 @@ -103,6 +115,10 @@ public abstract class MessageAgent { return name; } + public String[] getNames() { + return names; + } + public AnyValue getConfig() { return config; } diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index ed0815f0c..90fa4efa4 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -16,7 +16,6 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; import java.util.logging.Level; -import org.redkale.mq.MessageAgent; import org.redkale.net.*; import org.redkale.net.http.HttpContext.HttpContextConfig; import org.redkale.net.http.HttpResponse.HttpResponseConfig; @@ -218,12 +217,11 @@ public class HttpServer extends Server T addRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType, final String prefix, final AnyValue conf, final MessageAgent messageAgent) { - T servlet = Rest.createRestWebSocketServlet(classLoader, webSocketType, messageAgent); + public T addRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType, final String prefix, final AnyValue conf) { + T servlet = Rest.createRestWebSocketServlet(classLoader, webSocketType); if (servlet != null) this.prepare.addServlet(servlet, prefix, conf); return servlet; } diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index 47aad7e30..dcb063fb0 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -22,7 +22,6 @@ import static org.redkale.asm.Opcodes.*; import org.redkale.asm.Type; import org.redkale.convert.*; import org.redkale.convert.json.*; -import org.redkale.mq.MessageAgent; import org.redkale.net.Cryptor; import org.redkale.net.sncp.Sncp; import org.redkale.service.*; @@ -219,7 +218,7 @@ public final class Rest { return t == null ? defValue : t; } - public static T createRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType, final MessageAgent messageAgent) { + public static T createRestWebSocketServlet(final ClassLoader classLoader, final Class webSocketType) { if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet"); if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet"); if (Modifier.isFinal(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot final on createRestWebSocketServlet"); @@ -720,11 +719,6 @@ public final class Rest { Class newClazz = newLoader.loadClass(newDynName.replace('/', '.'), cw.toByteArray()); try { T servlet = (T) newClazz.getDeclaredConstructor().newInstance(); - if (messageAgent != null) { - Field agentField = servlet.getClass().getDeclaredField("messageAgent"); - agentField.setAccessible(true); - agentField.set(servlet, messageAgent); - } newClazz.getField("_redkale_annotations").set(null, msgclassToAnnotations); if (rws.cryptor() != Cryptor.class) { Cryptor cryptor = rws.cryptor().getDeclaredConstructor().newInstance(); diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index caf51708b..2d68d989f 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -18,7 +18,6 @@ import java.util.logging.*; import java.util.zip.*; import javax.annotation.*; import org.redkale.convert.Convert; -import org.redkale.mq.MessageAgent; import org.redkale.net.Cryptor; import org.redkale.service.*; import org.redkale.util.*; @@ -116,8 +115,6 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl @Resource(name = "$") protected WebSocketNode node; - protected MessageAgent messageAgent; - @Resource(name = "SERVER_RESFACTORY") protected ResourceFactory resourceFactory;