增加 @MessageMultiConsumer 功能
This commit is contained in:
@@ -31,19 +31,33 @@ public class HttpMessageProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
protected final HttpServlet servlet;
|
protected final HttpServlet servlet;
|
||||||
|
|
||||||
|
protected final boolean multiconsumer;
|
||||||
|
|
||||||
|
protected final String restmodule; // 前后有/, 例如: /user/
|
||||||
|
|
||||||
|
protected final String multimodule; // 前后有/, 例如: /userstat/
|
||||||
|
|
||||||
public HttpMessageProcessor(Logger logger, MessageProducer producer, NodeHttpServer server, Service service, HttpServlet servlet) {
|
public HttpMessageProcessor(Logger logger, MessageProducer producer, NodeHttpServer server, Service service, HttpServlet servlet) {
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.producer = producer;
|
this.producer = producer;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.service = service;
|
this.service = service;
|
||||||
this.servlet = servlet;
|
this.servlet = servlet;
|
||||||
|
MessageMultiConsumer mmc = service.getClass().getAnnotation(MessageMultiConsumer.class);
|
||||||
|
this.multiconsumer = mmc != null;
|
||||||
|
this.restmodule = "/" + Rest.getRestModule(service) + "/";
|
||||||
|
this.multimodule = mmc != null ? ("/" + mmc.module() + "/") : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(MessageRecord message) {
|
public void process(MessageRecord message) {
|
||||||
try {
|
try {
|
||||||
|
if (multiconsumer) message.setResptopic(null); //不容许有响应
|
||||||
HttpContext context = server.getHttpServer().getContext();
|
HttpContext context = server.getHttpServer().getContext();
|
||||||
HttpMessageRequest request = new HttpMessageRequest(context, message);
|
HttpMessageRequest request = new HttpMessageRequest(context, message);
|
||||||
|
if (multiconsumer) {
|
||||||
|
request.setRequestURI(request.getRequestURI().replaceFirst(this.restmodule, this.multimodule));
|
||||||
|
}
|
||||||
HttpMessageResponse response = new HttpMessageResponse(context, request, null, null, producer);
|
HttpMessageResponse response = new HttpMessageResponse(context, request, null, null, producer);
|
||||||
servlet.execute(request, response);
|
servlet.execute(request, response);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
|||||||
@@ -26,4 +26,7 @@ public class HttpMessageRequest extends HttpRequest {
|
|||||||
this.currentUserid = message.getUserid();
|
this.currentUserid = message.getUserid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRequestURI(String uri) {
|
||||||
|
this.requestURI = uri;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,13 +190,16 @@ public abstract class MessageAgent {
|
|||||||
//格式: http.req.user
|
//格式: http.req.user
|
||||||
protected String generateHttpReqTopic(Service service) {
|
protected String generateHttpReqTopic(Service service) {
|
||||||
String resname = Sncp.getResourceName(service);
|
String resname = Sncp.getResourceName(service);
|
||||||
return "http.req." + Rest.getRestName(service).toLowerCase() + (resname.isEmpty() ? "" : ("-" + resname));
|
String module = Rest.getRestModule(service).toLowerCase();
|
||||||
|
MessageMultiConsumer mmc = service.getClass().getAnnotation(MessageMultiConsumer.class);
|
||||||
|
if (mmc != null) return generateHttpReqTopic(mmc.module()) + (resname.isEmpty() ? "" : ("-" + resname));
|
||||||
|
return "http.req." + module + (resname.isEmpty() ? "" : ("-" + resname));
|
||||||
}
|
}
|
||||||
|
|
||||||
//格式: consumer-http.req.user
|
//格式: consumer-http.req.user
|
||||||
protected String generateHttpConsumerid(String topic, Service service) {
|
protected String generateHttpConsumerid(String topic, Service service) {
|
||||||
String resname = Sncp.getResourceName(service);
|
String resname = Sncp.getResourceName(service);
|
||||||
String key = Rest.getRestName(service).toLowerCase();
|
String key = Rest.getRestModule(service).toLowerCase();
|
||||||
return "consumer-http.req." + key + (resname.isEmpty() ? "" : ("-" + resname));
|
return "consumer-http.req." + key + (resname.isEmpty() ? "" : ("-" + resname));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/org/redkale/mq/MessageMultiConsumer.java
Normal file
32
src/org/redkale/mq/MessageMultiConsumer.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.redkale.mq;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
import static java.lang.annotation.ElementType.*;
|
||||||
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多消费组,需要同 @RestService 一起使用
|
||||||
|
* <p>
|
||||||
|
* 标记 @MessageMultiConsumer 的Service的@RestMapping方法都只能是void返回类型
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*
|
||||||
|
* @since 2.1.0
|
||||||
|
*/
|
||||||
|
@Inherited
|
||||||
|
@Documented
|
||||||
|
@Target({TYPE})
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface MessageMultiConsumer {
|
||||||
|
|
||||||
|
String module();
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@ import static org.redkale.asm.Opcodes.*;
|
|||||||
import org.redkale.asm.Type;
|
import org.redkale.asm.Type;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import org.redkale.convert.json.*;
|
import org.redkale.convert.json.*;
|
||||||
import org.redkale.mq.MessageAgent;
|
import org.redkale.mq.*;
|
||||||
import org.redkale.net.Cryptor;
|
import org.redkale.net.Cryptor;
|
||||||
import org.redkale.net.sncp.Sncp;
|
import org.redkale.net.sncp.Sncp;
|
||||||
import org.redkale.service.*;
|
import org.redkale.service.*;
|
||||||
@@ -210,7 +210,7 @@ public final class Rest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getRestName(Service service) {
|
public static String getRestModule(Service service) {
|
||||||
final RestService controller = service.getClass().getAnnotation(RestService.class);
|
final RestService controller = service.getClass().getAnnotation(RestService.class);
|
||||||
if (controller != null && !controller.name().isEmpty()) return controller.name();
|
if (controller != null && !controller.name().isEmpty()) return controller.name();
|
||||||
final Class serviceType = Sncp.getServiceType(service);
|
final Class serviceType = Sncp.getServiceType(service);
|
||||||
@@ -819,6 +819,10 @@ public final class Rest {
|
|||||||
//获取所有可以转换成HttpMapping的方法
|
//获取所有可以转换成HttpMapping的方法
|
||||||
int methodidex = 0;
|
int methodidex = 0;
|
||||||
final List<java.lang.reflect.Type[]> paramtypes = new ArrayList<>();
|
final List<java.lang.reflect.Type[]> paramtypes = new ArrayList<>();
|
||||||
|
final MessageMultiConsumer mmc = serviceType.getAnnotation(MessageMultiConsumer.class);
|
||||||
|
if (mmc != null && (mmc.module() == null || mmc.module().isEmpty())) {
|
||||||
|
throw new RuntimeException("@" + MessageMultiConsumer.class.getSimpleName() + ".module can not empty in " + serviceType.getName());
|
||||||
|
}
|
||||||
for (final Method method : serviceType.getMethods()) {
|
for (final Method method : serviceType.getMethods()) {
|
||||||
if (Modifier.isStatic(method.getModifiers())) continue;
|
if (Modifier.isStatic(method.getModifiers())) continue;
|
||||||
if (method.isSynthetic()) continue;
|
if (method.isSynthetic()) continue;
|
||||||
@@ -847,6 +851,9 @@ public final class Rest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (mmc != null && method.getReturnType() != void.class) {
|
||||||
|
throw new RuntimeException("@" + RestMapping.class.getSimpleName() + " only for method(" + method + ") with return void by @" + MessageMultiConsumer.class.getSimpleName() + " Service");
|
||||||
|
}
|
||||||
paramtypes.add(TypeToken.getGenericType(method.getGenericParameterTypes(), serviceType));
|
paramtypes.add(TypeToken.getGenericType(method.getGenericParameterTypes(), serviceType));
|
||||||
if (mappings.length == 0) { //没有Mapping,设置一个默认值
|
if (mappings.length == 0) { //没有Mapping,设置一个默认值
|
||||||
MappingEntry entry = new MappingEntry(methodidex, null, bigmodulename, method);
|
MappingEntry entry = new MappingEntry(methodidex, null, bigmodulename, method);
|
||||||
|
|||||||
Reference in New Issue
Block a user