org.apache.eventmesh.runtime.boot.EventMeshHTTPServer Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.eventmesh.runtime.boot;
import org.apache.eventmesh.common.ThreadPoolFactory;
import org.apache.eventmesh.common.protocol.http.common.RequestCode;
import org.apache.eventmesh.runtime.common.ServiceState;
import org.apache.eventmesh.runtime.configuration.EventMeshHTTPConfiguration;
import org.apache.eventmesh.runtime.core.consumergroup.ConsumerGroupConf;
import org.apache.eventmesh.runtime.core.protocol.http.consumer.ConsumerManager;
import org.apache.eventmesh.runtime.core.protocol.http.processor.AdminMetricsProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.BatchSendMessageProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.BatchSendMessageV2Processor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.HeartBeatProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.ReplyMessageProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.SendAsyncMessageProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.SendSyncMessageProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.SubscribeProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.UnSubscribeProcessor;
import org.apache.eventmesh.runtime.core.protocol.http.processor.inf.Client;
import org.apache.eventmesh.runtime.core.protocol.http.producer.ProducerManager;
import org.apache.eventmesh.runtime.core.protocol.http.push.AbstractHTTPPushRequest;
import org.apache.eventmesh.runtime.core.protocol.http.retry.HttpRetryer;
import org.apache.eventmesh.runtime.metrics.http.HTTPMetricsServer;
import org.apache.eventmesh.runtime.trace.OpenTelemetryTraceFactory;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import com.google.common.eventbus.EventBus;
import com.google.common.util.concurrent.RateLimiter;
public class EventMeshHTTPServer extends AbstractHTTPServer {
private EventMeshServer eventMeshServer;
public ServiceState serviceState;
private EventMeshHTTPConfiguration eventMeshHttpConfiguration;
public final ConcurrentHashMap localConsumerGroupMapping =
new ConcurrentHashMap<>();
public final ConcurrentHashMap> localClientInfoMapping =
new ConcurrentHashMap<>();
public EventMeshHTTPServer(EventMeshServer eventMeshServer,
EventMeshHTTPConfiguration eventMeshHttpConfiguration) {
super(eventMeshHttpConfiguration.httpServerPort, eventMeshHttpConfiguration.eventMeshServerUseTls);
this.eventMeshServer = eventMeshServer;
this.eventMeshHttpConfiguration = eventMeshHttpConfiguration;
}
public EventMeshServer getEventMeshServer() {
return eventMeshServer;
}
public EventBus eventBus = new EventBus();
private ConsumerManager consumerManager;
private ProducerManager producerManager;
private HttpRetryer httpRetryer;
public ThreadPoolExecutor batchMsgExecutor;
public ThreadPoolExecutor sendMsgExecutor;
public ThreadPoolExecutor replyMsgExecutor;
public ThreadPoolExecutor pushMsgExecutor;
public ThreadPoolExecutor clientManageExecutor;
public ThreadPoolExecutor adminExecutor;
private RateLimiter msgRateLimiter;
private RateLimiter batchRateLimiter;
public void shutdownThreadPool() throws Exception {
batchMsgExecutor.shutdown();
adminExecutor.shutdown();
clientManageExecutor.shutdown();
sendMsgExecutor.shutdown();
pushMsgExecutor.shutdown();
replyMsgExecutor.shutdown();
}
public void initThreadPool() throws Exception {
BlockingQueue batchMsgThreadPoolQueue =
new LinkedBlockingQueue(eventMeshHttpConfiguration.eventMeshServerBatchBlockQSize);
batchMsgExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerBatchMsgThreadNum,
eventMeshHttpConfiguration.eventMeshServerBatchMsgThreadNum, batchMsgThreadPoolQueue,
"eventMesh-batchMsg-", true);
BlockingQueue sendMsgThreadPoolQueue =
new LinkedBlockingQueue(eventMeshHttpConfiguration.eventMeshServerSendMsgBlockQSize);
sendMsgExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerSendMsgThreadNum,
eventMeshHttpConfiguration.eventMeshServerSendMsgThreadNum, sendMsgThreadPoolQueue,
"eventMesh-sendMsg-", true);
BlockingQueue pushMsgThreadPoolQueue =
new LinkedBlockingQueue(eventMeshHttpConfiguration.eventMeshServerPushMsgBlockQSize);
pushMsgExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerPushMsgThreadNum,
eventMeshHttpConfiguration.eventMeshServerPushMsgThreadNum, pushMsgThreadPoolQueue,
"eventMesh-pushMsg-", true);
BlockingQueue clientManageThreadPoolQueue =
new LinkedBlockingQueue(eventMeshHttpConfiguration.eventMeshServerClientManageBlockQSize);
clientManageExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerClientManageThreadNum,
eventMeshHttpConfiguration.eventMeshServerClientManageThreadNum, clientManageThreadPoolQueue,
"eventMesh-clientManage-", true);
BlockingQueue adminThreadPoolQueue = new LinkedBlockingQueue(50);
adminExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerAdminThreadNum,
eventMeshHttpConfiguration.eventMeshServerAdminThreadNum, adminThreadPoolQueue, "eventMesh-admin-",
true);
BlockingQueue replyMessageThreadPoolQueue = new LinkedBlockingQueue(100);
replyMsgExecutor =
ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerReplyMsgThreadNum,
eventMeshHttpConfiguration.eventMeshServerReplyMsgThreadNum, replyMessageThreadPoolQueue,
"eventMesh-replyMsg-", true);
}
public ThreadPoolExecutor getBatchMsgExecutor() {
return batchMsgExecutor;
}
public ThreadPoolExecutor getSendMsgExecutor() {
return sendMsgExecutor;
}
public ThreadPoolExecutor getReplyMsgExecutor() {
return replyMsgExecutor;
}
public ThreadPoolExecutor getPushMsgExecutor() {
return pushMsgExecutor;
}
public ThreadPoolExecutor getClientManageExecutor() {
return clientManageExecutor;
}
public ThreadPoolExecutor getAdminExecutor() {
return adminExecutor;
}
public RateLimiter getMsgRateLimiter() {
return msgRateLimiter;
}
public RateLimiter getBatchRateLimiter() {
return batchRateLimiter;
}
public void init() throws Exception {
logger.info("==================EventMeshHTTPServer Initialing==================");
super.init("eventMesh-http");
initThreadPool();
msgRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.eventMeshHttpMsgReqNumPerSecond);
batchRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.eventMeshBatchMsgRequestNumPerSecond);
metrics = new HTTPMetricsServer(this);
metrics.init();
consumerManager = new ConsumerManager(this);
consumerManager.init();
producerManager = new ProducerManager(this);
producerManager.init();
httpRetryer = new HttpRetryer(this);
httpRetryer.init();
registerHTTPRequestProcessor();
super.openTelemetryTraceFactory = new OpenTelemetryTraceFactory(eventMeshHttpConfiguration);
super.tracer = openTelemetryTraceFactory.getTracer(this.getClass().toString());
super.textMapPropagator = openTelemetryTraceFactory.getTextMapPropagator();
logger.info("--------------------------EventMeshHTTPServer inited");
}
@Override
public void start() throws Exception {
super.start();
metrics.start();
consumerManager.start();
producerManager.start();
httpRetryer.start();
logger.info("--------------------------EventMeshHTTPServer started");
}
@Override
public void shutdown() throws Exception {
super.shutdown();
metrics.shutdown();
consumerManager.shutdown();
shutdownThreadPool();
AbstractHTTPPushRequest.httpClientPool.shutdown();
producerManager.shutdown();
httpRetryer.shutdown();
logger.info("--------------------------EventMeshHTTPServer shutdown");
}
public void registerHTTPRequestProcessor() {
BatchSendMessageProcessor batchSendMessageProcessor = new BatchSendMessageProcessor(this);
registerProcessor(RequestCode.MSG_BATCH_SEND.getRequestCode(), batchSendMessageProcessor, batchMsgExecutor);
BatchSendMessageV2Processor batchSendMessageV2Processor = new BatchSendMessageV2Processor(this);
registerProcessor(RequestCode.MSG_BATCH_SEND_V2.getRequestCode(), batchSendMessageV2Processor,
batchMsgExecutor);
SendSyncMessageProcessor sendSyncMessageProcessor = new SendSyncMessageProcessor(this);
registerProcessor(RequestCode.MSG_SEND_SYNC.getRequestCode(), sendSyncMessageProcessor, sendMsgExecutor);
SendAsyncMessageProcessor sendAsyncMessageProcessor = new SendAsyncMessageProcessor(this);
registerProcessor(RequestCode.MSG_SEND_ASYNC.getRequestCode(), sendAsyncMessageProcessor, sendMsgExecutor);
AdminMetricsProcessor adminMetricsProcessor = new AdminMetricsProcessor(this);
registerProcessor(RequestCode.ADMIN_METRICS.getRequestCode(), adminMetricsProcessor, adminExecutor);
HeartBeatProcessor heartProcessor = new HeartBeatProcessor(this);
registerProcessor(RequestCode.HEARTBEAT.getRequestCode(), heartProcessor, clientManageExecutor);
SubscribeProcessor subscribeProcessor = new SubscribeProcessor(this);
registerProcessor(RequestCode.SUBSCRIBE.getRequestCode(), subscribeProcessor, clientManageExecutor);
UnSubscribeProcessor unSubscribeProcessor = new UnSubscribeProcessor(this);
registerProcessor(RequestCode.UNSUBSCRIBE.getRequestCode(), unSubscribeProcessor, clientManageExecutor);
ReplyMessageProcessor replyMessageProcessor = new ReplyMessageProcessor(this);
registerProcessor(RequestCode.REPLY_MESSAGE.getRequestCode(), replyMessageProcessor, replyMsgExecutor);
}
public ConsumerManager getConsumerManager() {
return consumerManager;
}
public ProducerManager getProducerManager() {
return producerManager;
}
public ServiceState getServiceState() {
return serviceState;
}
public EventMeshHTTPConfiguration getEventMeshHttpConfiguration() {
return eventMeshHttpConfiguration;
}
public EventBus getEventBus() {
return eventBus;
}
public HttpRetryer getHttpRetryer() {
return httpRetryer;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy