This commit is contained in:
@@ -154,9 +154,9 @@ public abstract class NodeServer {
|
|||||||
//必须要进行初始化, 构建Service时需要使用Context中的ExecutorService
|
//必须要进行初始化, 构建Service时需要使用Context中的ExecutorService
|
||||||
server.init(this.serverConf);
|
server.init(this.serverConf);
|
||||||
//init之后才有Executor
|
//init之后才有Executor
|
||||||
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, Executor.class, server.getExecutor());
|
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, Executor.class, server.getWorkExecutor());
|
||||||
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, ExecutorService.class, server.getExecutor());
|
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, ExecutorService.class, server.getWorkExecutor());
|
||||||
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, ThreadPoolExecutor.class, server.getExecutor());
|
resourceFactory.register(Server.RESNAME_SERVER_EXECUTOR, ThreadPoolExecutor.class, server.getWorkExecutor());
|
||||||
|
|
||||||
initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。
|
initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。
|
||||||
String interceptorClass = this.serverConf.getValue("interceptor", "");
|
String interceptorClass = this.serverConf.getValue("interceptor", "");
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.mq;
|
package org.redkale.mq;
|
||||||
|
|
||||||
|
import java.util.concurrent.*;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import org.redkale.boot.NodeHttpServer;
|
import org.redkale.boot.NodeHttpServer;
|
||||||
import org.redkale.net.http.*;
|
import org.redkale.net.http.*;
|
||||||
@@ -29,6 +30,8 @@ public class HttpMessageProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
protected final NodeHttpServer server;
|
protected final NodeHttpServer server;
|
||||||
|
|
||||||
|
protected final ThreadPoolExecutor workExecutor;
|
||||||
|
|
||||||
protected final Service service;
|
protected final Service service;
|
||||||
|
|
||||||
protected final HttpServlet servlet;
|
protected final HttpServlet servlet;
|
||||||
@@ -39,6 +42,8 @@ public class HttpMessageProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
protected final String multimodule; // 前后有/, 例如: /userstat/
|
protected final String multimodule; // 前后有/, 例如: /userstat/
|
||||||
|
|
||||||
|
protected CountDownLatch cdl;
|
||||||
|
|
||||||
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.finest = logger.isLoggable(Level.FINEST);
|
this.finest = logger.isLoggable(Level.FINEST);
|
||||||
@@ -50,10 +55,24 @@ public class HttpMessageProcessor implements MessageProcessor {
|
|||||||
this.multiconsumer = mmc != null;
|
this.multiconsumer = mmc != null;
|
||||||
this.restmodule = "/" + Rest.getRestModule(service) + "/";
|
this.restmodule = "/" + Rest.getRestModule(service) + "/";
|
||||||
this.multimodule = mmc != null ? ("/" + mmc.module() + "/") : null;
|
this.multimodule = mmc != null ? ("/" + mmc.module() + "/") : null;
|
||||||
|
this.workExecutor = server.getServer().getWorkExecutor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(MessageRecord message, Runnable callback) {
|
public void begin(final int size) {
|
||||||
|
if (this.workExecutor != null) this.cdl = new CountDownLatch(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void process(final MessageRecord message, final Runnable callback) {
|
||||||
|
if (this.workExecutor == null) {
|
||||||
|
execute(message, callback);
|
||||||
|
} else {
|
||||||
|
this.workExecutor.execute(() -> execute(message, callback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void execute(final MessageRecord message, final Runnable callback) {
|
||||||
try {
|
try {
|
||||||
if (finest) logger.log(Level.FINEST, "HttpMessageProcessor.process message: " + message);
|
if (finest) logger.log(Level.FINEST, "HttpMessageProcessor.process message: " + message);
|
||||||
if (multiconsumer) message.setResptopic(null); //不容许有响应
|
if (multiconsumer) message.setResptopic(null); //不容许有响应
|
||||||
@@ -69,6 +88,18 @@ public class HttpMessageProcessor implements MessageProcessor {
|
|||||||
HttpMessageResponse.finishHttpResult(message, callback, producer, message.getResptopic(), new HttpResult().status(500));
|
HttpMessageResponse.finishHttpResult(message, callback, producer, message.getResptopic(), new HttpResult().status(500));
|
||||||
}
|
}
|
||||||
logger.log(Level.SEVERE, HttpMessageProcessor.class.getSimpleName() + " process error, message=" + message, ex);
|
logger.log(Level.SEVERE, HttpMessageProcessor.class.getSimpleName() + " process error, message=" + message, ex);
|
||||||
|
} finally {
|
||||||
|
if (cdl != null) cdl.countDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void commit() {
|
||||||
|
if (this.cdl != null) {
|
||||||
|
try {
|
||||||
|
this.cdl.await();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.util.concurrent.CountDownLatch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author zhangjx
|
|
||||||
*/
|
|
||||||
public class MessageMultiThreadProcessor implements MessageProcessor {
|
|
||||||
|
|
||||||
protected final MessageAgent messageAgent;
|
|
||||||
|
|
||||||
protected final MessageProcessor processor;
|
|
||||||
|
|
||||||
protected CountDownLatch cdl;
|
|
||||||
|
|
||||||
public MessageMultiThreadProcessor(MessageAgent messageAgent, MessageProcessor processor) {
|
|
||||||
this.messageAgent = messageAgent;
|
|
||||||
this.processor = processor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void begin(int size) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void process(MessageRecord message, Runnable callback) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void commit() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.mq;
|
package org.redkale.mq;
|
||||||
|
|
||||||
|
import java.util.concurrent.*;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import org.redkale.boot.NodeSncpServer;
|
import org.redkale.boot.NodeSncpServer;
|
||||||
import org.redkale.net.sncp.*;
|
import org.redkale.net.sncp.*;
|
||||||
@@ -27,28 +28,59 @@ public class SncpMessageProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
protected final NodeSncpServer server;
|
protected final NodeSncpServer server;
|
||||||
|
|
||||||
|
protected final ThreadPoolExecutor workExecutor;
|
||||||
|
|
||||||
protected final Service service;
|
protected final Service service;
|
||||||
|
|
||||||
protected final SncpServlet servlet;
|
protected final SncpServlet servlet;
|
||||||
|
|
||||||
|
protected CountDownLatch cdl;
|
||||||
|
|
||||||
public SncpMessageProcessor(Logger logger, MessageProducer producer, NodeSncpServer server, Service service, SncpServlet servlet) {
|
public SncpMessageProcessor(Logger logger, MessageProducer producer, NodeSncpServer server, Service service, SncpServlet 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;
|
||||||
|
this.workExecutor = server.getServer().getWorkExecutor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(MessageRecord message, Runnable callback) {
|
public void begin(final int size) {
|
||||||
SncpContext context = server.getSncpServer().getContext();
|
if (this.workExecutor != null) this.cdl = new CountDownLatch(size);
|
||||||
SncpMessageRequest request = new SncpMessageRequest(context, message);
|
}
|
||||||
SncpMessageResponse response = new SncpMessageResponse(context, request, callback, null, producer);
|
|
||||||
|
@Override
|
||||||
|
public void process(final MessageRecord message, final Runnable callback) {
|
||||||
|
if (this.workExecutor == null) {
|
||||||
|
execute(message, callback);
|
||||||
|
} else {
|
||||||
|
this.workExecutor.execute(() -> execute(message, callback));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void execute(final MessageRecord message, final Runnable callback) {
|
||||||
|
SncpMessageResponse response = null;
|
||||||
try {
|
try {
|
||||||
|
SncpContext context = server.getSncpServer().getContext();
|
||||||
|
SncpMessageRequest request = new SncpMessageRequest(context, message);
|
||||||
|
response = new SncpMessageResponse(context, request, callback, null, producer);
|
||||||
servlet.execute(request, response);
|
servlet.execute(request, response);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
response.finish(SncpResponse.RETCODE_ILLSERVICEID, null);
|
if (response != null) response.finish(SncpResponse.RETCODE_ILLSERVICEID, null);
|
||||||
logger.log(Level.SEVERE, SncpMessageProcessor.class.getSimpleName() + " process error, message=" + message, ex);
|
logger.log(Level.SEVERE, SncpMessageProcessor.class.getSimpleName() + " process error, message=" + message, ex);
|
||||||
|
} finally {
|
||||||
|
if (cdl != null) cdl.countDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void commit() {
|
||||||
|
if (this.cdl != null) {
|
||||||
|
try {
|
||||||
|
this.cdl.await();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ public abstract class Server<K extends Serializable, C extends Context, R extend
|
|||||||
protected int threads;
|
protected int threads;
|
||||||
|
|
||||||
//线程池
|
//线程池
|
||||||
protected ThreadPoolExecutor executor;
|
protected ThreadPoolExecutor workExecutor;
|
||||||
|
|
||||||
//ByteBuffer池大小
|
//ByteBuffer池大小
|
||||||
protected int bufferPoolSize;
|
protected int bufferPoolSize;
|
||||||
@@ -151,8 +151,8 @@ public abstract class Server<K extends Serializable, C extends Context, R extend
|
|||||||
final AtomicInteger counter = new AtomicInteger();
|
final AtomicInteger counter = new AtomicInteger();
|
||||||
final Format f = createFormat();
|
final Format f = createFormat();
|
||||||
final String n = name;
|
final String n = name;
|
||||||
this.executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threads, (Runnable r) -> {
|
this.workExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threads, (Runnable r) -> {
|
||||||
Thread t = new WorkThread(executor, r);
|
Thread t = new WorkThread(workExecutor, r);
|
||||||
t.setName("Redkale-" + n + "-ServletThread-" + f.format(counter.incrementAndGet()));
|
t.setName("Redkale-" + n + "-ServletThread-" + f.format(counter.incrementAndGet()));
|
||||||
return t;
|
return t;
|
||||||
});
|
});
|
||||||
@@ -187,8 +187,8 @@ public abstract class Server<K extends Serializable, C extends Context, R extend
|
|||||||
return resourceFactory;
|
return resourceFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ThreadPoolExecutor getExecutor() {
|
public ThreadPoolExecutor getWorkExecutor() {
|
||||||
return executor;
|
return workExecutor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InetSocketAddress getSocketAddress() {
|
public InetSocketAddress getSocketAddress() {
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
final HttpContextConfig contextConfig = new HttpContextConfig();
|
final HttpContextConfig contextConfig = new HttpContextConfig();
|
||||||
contextConfig.serverStartTime = this.serverStartTime;
|
contextConfig.serverStartTime = this.serverStartTime;
|
||||||
contextConfig.logger = this.logger;
|
contextConfig.logger = this.logger;
|
||||||
contextConfig.executor = this.executor;
|
contextConfig.executor = this.workExecutor;
|
||||||
contextConfig.sslContext = this.sslContext;
|
contextConfig.sslContext = this.sslContext;
|
||||||
contextConfig.bufferCapacity = this.bufferCapacity;
|
contextConfig.bufferCapacity = this.bufferCapacity;
|
||||||
contextConfig.maxconns = this.maxconns;
|
contextConfig.maxconns = this.maxconns;
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public class SncpServer extends Server<DLong, SncpContext, SncpRequest, SncpResp
|
|||||||
final SncpContextConfig contextConfig = new SncpContextConfig();
|
final SncpContextConfig contextConfig = new SncpContextConfig();
|
||||||
contextConfig.serverStartTime = this.serverStartTime;
|
contextConfig.serverStartTime = this.serverStartTime;
|
||||||
contextConfig.logger = this.logger;
|
contextConfig.logger = this.logger;
|
||||||
contextConfig.executor = this.executor;
|
contextConfig.executor = this.workExecutor;
|
||||||
contextConfig.sslContext = this.sslContext;
|
contextConfig.sslContext = this.sslContext;
|
||||||
contextConfig.bufferCapacity = this.bufferCapacity;
|
contextConfig.bufferCapacity = this.bufferCapacity;
|
||||||
contextConfig.maxconns = this.maxconns;
|
contextConfig.maxconns = this.maxconns;
|
||||||
|
|||||||
Reference in New Issue
Block a user