---初始化项目
This commit is contained in:
46
powerjob-remote/powerjob-remote-impl-akka/pom.xml
Normal file
46
powerjob-remote/powerjob-remote-impl-akka/pom.xml
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>powerjob-remote</artifactId>
|
||||
<groupId>tech.powerjob</groupId>
|
||||
<version>5.1.2</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>powerjob-remote-impl-akka</artifactId>
|
||||
<name>powerjob-remote-impl-akka</name>
|
||||
<version>5.1.2</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<powerjob-remote-framework.version>5.1.2</powerjob-remote-framework.version>
|
||||
|
||||
<akka.version>2.6.13</akka.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>tech.powerjob</groupId>
|
||||
<artifactId>powerjob-remote-framework</artifactId>
|
||||
<version>${powerjob-remote-framework.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- akka remote -->
|
||||
<dependency>
|
||||
<groupId>com.typesafe.akka</groupId>
|
||||
<artifactId>akka-remote_2.13</artifactId>
|
||||
<version>${akka.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.typesafe.akka</groupId>
|
||||
<artifactId>akka-slf4j_2.13</artifactId>
|
||||
<version>${akka.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@ -0,0 +1,110 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import akka.actor.ActorRef;
|
||||
import akka.actor.ActorSystem;
|
||||
import akka.actor.DeadLetter;
|
||||
import akka.actor.Props;
|
||||
import akka.routing.RoundRobinPool;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.typesafe.config.Config;
|
||||
import com.typesafe.config.ConfigFactory;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import tech.powerjob.common.serialize.JsonUtils;
|
||||
import tech.powerjob.common.utils.SysUtils;
|
||||
import tech.powerjob.remote.framework.actor.ActorInfo;
|
||||
import tech.powerjob.remote.framework.base.Address;
|
||||
import tech.powerjob.remote.framework.cs.CSInitializer;
|
||||
import tech.powerjob.remote.framework.cs.CSInitializerConfig;
|
||||
import tech.powerjob.remote.framework.transporter.Transporter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* AkkaCSInitializer
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
@Slf4j
|
||||
public class AkkaCSInitializer implements CSInitializer {
|
||||
|
||||
private ActorSystem actorSystem;
|
||||
private CSInitializerConfig config;
|
||||
|
||||
@Override
|
||||
public String type() {
|
||||
return tech.powerjob.common.enums.Protocol.AKKA.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(CSInitializerConfig config) {
|
||||
|
||||
this.config = config;
|
||||
|
||||
Address bindAddress = config.getBindAddress();
|
||||
log.info("[PowerJob-AKKA] bindAddress: {}", bindAddress);
|
||||
|
||||
// 初始化 ActorSystem(macOS上 new ServerSocket 检测端口占用的方法并不生效,可能是AKKA是Scala写的缘故?没办法...只能靠异常重试了)
|
||||
Map<String, Object> overrideConfig = Maps.newHashMap();
|
||||
|
||||
Address externalAddress = config.getExternalAddress();
|
||||
|
||||
if (externalAddress == null || StringUtils.equalsIgnoreCase(externalAddress.toFullAddress(), bindAddress.toFullAddress())) {
|
||||
overrideConfig.put("akka.remote.artery.canonical.hostname", bindAddress.getHost());
|
||||
overrideConfig.put("akka.remote.artery.canonical.port", bindAddress.getPort());
|
||||
log.info("[PowerJob-AKKA] not exist externalIp, overrideConfig: {}", overrideConfig);
|
||||
} else {
|
||||
overrideConfig.put("akka.remote.artery.canonical.hostname", externalAddress.getHost());
|
||||
overrideConfig.put("akka.remote.artery.canonical.port", externalAddress.getPort());
|
||||
|
||||
overrideConfig.put("akka.remote.artery.bind.hostname", "0.0.0.0");
|
||||
overrideConfig.put("akka.remote.artery.bind.port", bindAddress.getPort());
|
||||
|
||||
log.info("[PowerJob-AKKA] exist externalAddress[{}], final overrideConfig: {}", externalAddress, overrideConfig);
|
||||
}
|
||||
|
||||
Config akkaBasicConfig = ConfigFactory.load(AkkaConstant.AKKA_CONFIG);
|
||||
Config akkaFinalConfig = ConfigFactory.parseMap(overrideConfig).withFallback(akkaBasicConfig);
|
||||
|
||||
log.info("[PowerJob-AKKA] try to start AKKA System.");
|
||||
|
||||
// 启动时绑定当前的 actorSystemName
|
||||
String actorSystemName = AkkaConstant.fetchActorSystemName(config.getServerType());
|
||||
this.actorSystem = ActorSystem.create(actorSystemName, akkaFinalConfig);
|
||||
|
||||
// 处理系统中产生的异常情况
|
||||
ActorRef troubleshootingActor = actorSystem.actorOf(Props.create(AkkaTroubleshootingActor.class), "troubleshooting");
|
||||
actorSystem.eventStream().subscribe(troubleshootingActor, DeadLetter.class);
|
||||
|
||||
log.info("[PowerJob-AKKA] initialize actorSystem[{}] successfully!", actorSystem.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transporter buildTransporter() {
|
||||
return new AkkaTransporter(actorSystem);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindHandlers(List<ActorInfo> actorInfos) {
|
||||
int cores = SysUtils.availableProcessors();
|
||||
actorInfos.forEach(actorInfo -> {
|
||||
String rootPath = actorInfo.getAnno().path();
|
||||
AkkaMappingService.ActorConfig actorConfig = AkkaMappingService.parseActorName(rootPath);
|
||||
|
||||
log.info("[PowerJob-AKKA] start to process actor[path={},config={}]", rootPath, JsonUtils.toJSONString(actorConfig));
|
||||
|
||||
actorSystem.actorOf(AkkaProxyActor.props(actorInfo)
|
||||
.withDispatcher("akka.".concat(actorConfig.getDispatcherName()))
|
||||
.withRouter(new RoundRobinPool(cores)), actorConfig.getActorName());
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
actorSystem.terminate();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import tech.powerjob.remote.framework.base.ServerType;
|
||||
|
||||
/**
|
||||
* AkkaConstant
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
public class AkkaConstant {
|
||||
|
||||
public static final String AKKA_CONFIG = "powerjob.akka.conf";
|
||||
|
||||
public static final String WORKER_ACTOR_SYSTEM_NAME = "oms";
|
||||
public static final String SERVER_ACTOR_SYSTEM_NAME = "oms-server";
|
||||
|
||||
/**
|
||||
* 获取 actorSystem 名称
|
||||
* @param serverType 当前服务器类型,powerjob-server 为 server,powerjob-worker 为 worker
|
||||
* @return actorSystemName
|
||||
*/
|
||||
public static String fetchActorSystemName(ServerType serverType) {
|
||||
|
||||
|
||||
return serverType == ServerType.SERVER ? SERVER_ACTOR_SYSTEM_NAME : WORKER_ACTOR_SYSTEM_NAME;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.Accessors;
|
||||
import tech.powerjob.common.RemoteConstant;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 构建 Actor Mapping
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2023/1/7
|
||||
*/
|
||||
public class AkkaMappingService {
|
||||
|
||||
/**
|
||||
* Actor's RootPath -> Akka Actor Name
|
||||
*/
|
||||
private static final Map<String, ActorConfig> RP_2_ACTOR_CFG = Maps.newHashMap();
|
||||
|
||||
static {
|
||||
addMappingRule(RemoteConstant.S4W_PATH, "server_actor", "w-r-c-d");
|
||||
addMappingRule(RemoteConstant.S4S_PATH, "friend_actor", "friend-request-actor-dispatcher");
|
||||
|
||||
addMappingRule(RemoteConstant.WTT_PATH, "task_tracker", "task-tracker-dispatcher");
|
||||
addMappingRule(RemoteConstant.WPT_PATH, "processor_tracker", "processor-tracker-dispatcher");
|
||||
}
|
||||
|
||||
private static final String DEFAULT_DISPATCH_NAME = "common-dispatcher";
|
||||
|
||||
/**
|
||||
* 根据 actor 的 rootPath 获取 Akka Actor Name,不存在改写则使用当前路径
|
||||
* @param actorRootPath actorRootPath
|
||||
* @return actorName
|
||||
*/
|
||||
public static ActorConfig parseActorName(String actorRootPath) {
|
||||
return RP_2_ACTOR_CFG.getOrDefault(actorRootPath,
|
||||
new ActorConfig()
|
||||
.setActorName(actorRootPath)
|
||||
.setDispatcherName(DEFAULT_DISPATCH_NAME)
|
||||
);
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Accessors(chain = true)
|
||||
public static class ActorConfig {
|
||||
private String actorName;
|
||||
private String dispatcherName;
|
||||
}
|
||||
|
||||
private static void addMappingRule(String newActorPath, String oldActorName, String dispatchName) {
|
||||
ActorConfig actorConfig = new ActorConfig()
|
||||
.setActorName(oldActorName)
|
||||
.setDispatcherName(dispatchName == null ? DEFAULT_DISPATCH_NAME : dispatchName);
|
||||
RP_2_ACTOR_CFG.put(newActorPath, actorConfig);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import tech.powerjob.remote.framework.transporter.Protocol;
|
||||
|
||||
/**
|
||||
* AkkaProtocol
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
public class AkkaProtocol implements Protocol {
|
||||
@Override
|
||||
public String name() {
|
||||
return tech.powerjob.common.enums.Protocol.AKKA.name();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import akka.actor.AbstractActor;
|
||||
import akka.actor.Props;
|
||||
import akka.japi.pf.ReceiveBuilder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import tech.powerjob.common.exception.PowerJobException;
|
||||
import tech.powerjob.remote.framework.actor.ActorInfo;
|
||||
import tech.powerjob.remote.framework.actor.HandlerInfo;
|
||||
import tech.powerjob.remote.framework.base.HandlerLocation;
|
||||
import tech.powerjob.remote.framework.utils.RemoteUtils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 代理用的 actor
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2023/1/6
|
||||
*/
|
||||
@Slf4j
|
||||
public class AkkaProxyActor extends AbstractActor {
|
||||
|
||||
private final Receive receive;
|
||||
private final ActorInfo actorInfo;
|
||||
|
||||
public static Props props(ActorInfo actorInfo) {
|
||||
return Props.create(AkkaProxyActor.class, () -> new AkkaProxyActor(actorInfo));
|
||||
}
|
||||
|
||||
public AkkaProxyActor(ActorInfo actorInfo) {
|
||||
this.actorInfo = actorInfo;
|
||||
final ReceiveBuilder receiveBuilder = receiveBuilder();
|
||||
actorInfo.getHandlerInfos().forEach(handlerInfo -> {
|
||||
final HandlerLocation location = handlerInfo.getLocation();
|
||||
final Method handlerMethod = handlerInfo.getMethod();
|
||||
final Optional<Class<?>> powerSerializeClz = RemoteUtils.findPowerSerialize(handlerMethod.getParameterTypes());
|
||||
if (!powerSerializeClz.isPresent()) {
|
||||
throw new PowerJobException("build proxy for handler failed due to handler args is not PowerSerialize: " + location);
|
||||
}
|
||||
final Class<?> bindClz = powerSerializeClz.get();
|
||||
receiveBuilder.match(bindClz, req -> onReceiveProcessorReportTaskStatusReq(req, handlerInfo));
|
||||
});
|
||||
this.receive = receiveBuilder.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Receive createReceive() {
|
||||
return receive;
|
||||
}
|
||||
|
||||
private <T> void onReceiveProcessorReportTaskStatusReq(T req, HandlerInfo handlerInfo) {
|
||||
|
||||
try {
|
||||
final Object ret = handlerInfo.getMethod().invoke(actorInfo.getActor(), req);
|
||||
if (ret == null) {
|
||||
return;
|
||||
}
|
||||
if (ret instanceof Optional) {
|
||||
if (!((Optional<?>) ret).isPresent()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
getSender().tell(ret, getSelf());
|
||||
} catch (Exception e) {
|
||||
log.error("[PowerJob-AKKA] process failed!", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,69 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import akka.actor.ActorSelection;
|
||||
import akka.actor.ActorSystem;
|
||||
import akka.pattern.Patterns;
|
||||
import tech.powerjob.common.PowerSerializable;
|
||||
import tech.powerjob.common.RemoteConstant;
|
||||
import tech.powerjob.common.utils.CommonUtils;
|
||||
import tech.powerjob.remote.framework.base.HandlerLocation;
|
||||
import tech.powerjob.remote.framework.base.RemotingException;
|
||||
import tech.powerjob.remote.framework.base.URL;
|
||||
import tech.powerjob.remote.framework.transporter.Protocol;
|
||||
import tech.powerjob.remote.framework.transporter.Transporter;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.concurrent.CompletionStage;
|
||||
|
||||
/**
|
||||
* AkkaTransporter
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
public class AkkaTransporter implements Transporter {
|
||||
|
||||
private final ActorSystem actorSystem;
|
||||
|
||||
|
||||
/**
|
||||
* akka://<actor system>@<hostname>:<port>/<actor path>
|
||||
*/
|
||||
private static final String AKKA_NODE_PATH = "akka://%s@%s/user/%s";
|
||||
|
||||
public AkkaTransporter(ActorSystem actorSystem) {
|
||||
this.actorSystem = actorSystem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Protocol getProtocol() {
|
||||
return new AkkaProtocol();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tell(URL url, PowerSerializable request) {
|
||||
ActorSelection actorSelection = fetchActorSelection(url);
|
||||
actorSelection.tell(request, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> CompletionStage<T> ask(URL url, PowerSerializable request, Class<T> clz) throws RemotingException {
|
||||
ActorSelection actorSelection = fetchActorSelection(url);
|
||||
return (CompletionStage<T>) Patterns.ask(actorSelection, request, Duration.ofMillis(RemoteConstant.DEFAULT_TIMEOUT_MS));
|
||||
}
|
||||
|
||||
private ActorSelection fetchActorSelection(URL url) {
|
||||
|
||||
HandlerLocation location = url.getLocation();
|
||||
String targetActorSystemName = AkkaConstant.fetchActorSystemName(url.getServerType());
|
||||
|
||||
String targetActorName = AkkaMappingService.parseActorName(location.getRootPath()).getActorName();
|
||||
|
||||
CommonUtils.requireNonNull(targetActorName, "can't find actor by URL: " + location);
|
||||
|
||||
String address = url.getAddress().toFullAddress();
|
||||
|
||||
return actorSystem.actorSelection(String.format(AKKA_NODE_PATH, targetActorSystemName, address, targetActorName));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import akka.actor.AbstractActor;
|
||||
import akka.actor.DeadLetter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* TroubleshootingActor
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
@Slf4j
|
||||
public class AkkaTroubleshootingActor extends AbstractActor {
|
||||
@Override
|
||||
public Receive createReceive() {
|
||||
return receiveBuilder()
|
||||
.match(DeadLetter.class, this::onReceiveDeadLetter)
|
||||
.build();
|
||||
}
|
||||
|
||||
public void onReceiveDeadLetter(DeadLetter dl) {
|
||||
log.warn("[PowerJob-AKKA] receive DeadLetter: {}", dl);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
package tech.powerjob.remote.akka;
|
||||
|
||||
import akka.serialization.JSerializer;
|
||||
import tech.powerjob.common.serialize.SerializerUtils;
|
||||
|
||||
/**
|
||||
* Using custom serializers for akka-remote
|
||||
* https://doc.akka.io/docs/akka/current/serialization.html
|
||||
*
|
||||
* @author tjq
|
||||
* @since 2021/3/21
|
||||
*/
|
||||
public class PowerAkkaSerializer extends JSerializer {
|
||||
|
||||
@Override
|
||||
public Object fromBinaryJava(byte[] bytes, Class<?> manifest) {
|
||||
return SerializerUtils.deSerialized(bytes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int identifier() {
|
||||
return 277777;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBinary(Object o) {
|
||||
return SerializerUtils.serialize(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean includeManifest() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* 由于 AKKA 后续转向收费运营模式,PowerJob 计划移除 akka 支持,因此不再维护该 module。
|
||||
* 如果存在任何使用上的问题,请切换到其他通讯协议(建议使用 HTTP)
|
||||
*
|
||||
* @author PowerJob发言人
|
||||
* @since 2022/12/31
|
||||
*/
|
||||
package tech.powerjob.remote.akka;
|
||||
@ -0,0 +1,133 @@
|
||||
akka {
|
||||
|
||||
loggers = ["akka.event.slf4j.Slf4jLogger"]
|
||||
loglevel = "WARNING"
|
||||
|
||||
actor {
|
||||
# cluster is better(recommend by official document), but I prefer remote
|
||||
provider = remote
|
||||
allow-java-serialization = off
|
||||
|
||||
serializers {
|
||||
power-serializer = "tech.powerjob.remote.akka.PowerAkkaSerializer"
|
||||
}
|
||||
|
||||
serialization-bindings {
|
||||
"tech.powerjob.common.PowerSerializable" = power-serializer
|
||||
}
|
||||
}
|
||||
remote {
|
||||
artery {
|
||||
transport = tcp # See Selecting a transport below
|
||||
# over write by code
|
||||
canonical.hostname = "127.0.0.1"
|
||||
canonical.port = 25520
|
||||
}
|
||||
}
|
||||
|
||||
# dispatcher
|
||||
task-tracker-dispatcher {
|
||||
# Dispatcher is the name of the event-based dispatcher
|
||||
type = Dispatcher
|
||||
# What kind of ExecutionService to use
|
||||
executor = "fork-join-executor"
|
||||
# Configuration for the fork join pool
|
||||
fork-join-executor {
|
||||
# Min number of threads to cap factor-based parallelism number to
|
||||
parallelism-min = 2
|
||||
# Parallelism (threads) ... ceil(available processors * factor)
|
||||
parallelism-factor = 4.0
|
||||
# Max number of threads to cap factor-based parallelism number to
|
||||
parallelism-max = 64
|
||||
}
|
||||
# Throughput defines the maximum number of messages to be
|
||||
# processed per actor before the thread jumps to the next actor.
|
||||
# Set to 1 for as fair as possible.
|
||||
throughput = 10
|
||||
}
|
||||
|
||||
processor-tracker-dispatcher {
|
||||
type = Dispatcher
|
||||
executor = "fork-join-executor"
|
||||
fork-join-executor {
|
||||
parallelism-min = 2
|
||||
parallelism-factor = 2.0
|
||||
parallelism-max = 64
|
||||
}
|
||||
throughput = 10
|
||||
}
|
||||
|
||||
worker-common-dispatcher {
|
||||
type = Dispatcher
|
||||
executor = "fork-join-executor"
|
||||
fork-join-executor {
|
||||
parallelism-min = 2
|
||||
parallelism-factor = 2.0
|
||||
parallelism-max = 8
|
||||
}
|
||||
throughput = 10
|
||||
}
|
||||
|
||||
##################### server config #####################
|
||||
# worker-request-core-dispatcher
|
||||
w-r-c-d {
|
||||
# Dispatcher is the name of the event-based dispatcher
|
||||
type = Dispatcher
|
||||
# What kind of ExecutionService to use
|
||||
executor = "fork-join-executor"
|
||||
# Configuration for the fork join pool
|
||||
fork-join-executor {
|
||||
# Min number of threads to cap factor-based parallelism number to
|
||||
parallelism-min = 2
|
||||
# Parallelism (threads) ... ceil(available processors * factor)
|
||||
parallelism-factor = 4.0
|
||||
# Max number of threads to cap factor-based parallelism number to
|
||||
parallelism-max = 128
|
||||
}
|
||||
# Throughput defines the maximum number of messages to be
|
||||
# processed per actor before the thread jumps to the next actor.
|
||||
# Set to 1 for as fair as possible.
|
||||
throughput = 10
|
||||
}
|
||||
|
||||
friend-request-actor-dispatcher {
|
||||
# Dispatcher is the name of the event-based dispatcher
|
||||
type = Dispatcher
|
||||
# What kind of ExecutionService to use
|
||||
executor = "fork-join-executor"
|
||||
# Configuration for the fork join pool
|
||||
fork-join-executor {
|
||||
# Min number of threads to cap factor-based parallelism number to
|
||||
parallelism-min = 2
|
||||
# Parallelism (threads) ... ceil(available processors * factor)
|
||||
parallelism-factor = 4.0
|
||||
# Max number of threads to cap factor-based parallelism number to
|
||||
parallelism-max = 128
|
||||
}
|
||||
# Throughput defines the maximum number of messages to be
|
||||
# processed per actor before the thread jumps to the next actor.
|
||||
# Set to 1 for as fair as possible.
|
||||
throughput = 5
|
||||
}
|
||||
|
||||
##################### default config #####################
|
||||
common-dispatcher {
|
||||
# Dispatcher is the name of the event-based dispatcher
|
||||
type = Dispatcher
|
||||
# What kind of ExecutionService to use
|
||||
executor = "fork-join-executor"
|
||||
# Configuration for the fork join pool
|
||||
fork-join-executor {
|
||||
# Min number of threads to cap factor-based parallelism number to
|
||||
parallelism-min = 2
|
||||
# Parallelism (threads) ... ceil(available processors * factor)
|
||||
parallelism-factor = 4.0
|
||||
# Max number of threads to cap factor-based parallelism number to
|
||||
parallelism-max = 64
|
||||
}
|
||||
# Throughput defines the maximum number of messages to be
|
||||
# processed per actor before the thread jumps to the next actor.
|
||||
# Set to 1 for as fair as possible.
|
||||
throughput = 10
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user