mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
feat: use gatling to have a presure test for remote framework
This commit is contained in:
parent
50b4ca3cca
commit
24b4cc4eb5
@ -19,7 +19,7 @@
|
|||||||
<commons.io.version>2.7</commons.io.version>
|
<commons.io.version>2.7</commons.io.version>
|
||||||
<guava.version>31.1-jre</guava.version>
|
<guava.version>31.1-jre</guava.version>
|
||||||
<okhttp.version>3.14.9</okhttp.version>
|
<okhttp.version>3.14.9</okhttp.version>
|
||||||
<akka.version>2.6.12</akka.version>
|
<akka.version>2.6.20</akka.version>
|
||||||
<kryo.version>5.0.4</kryo.version>
|
<kryo.version>5.0.4</kryo.version>
|
||||||
<jackson.version>2.12.2</jackson.version>
|
<jackson.version>2.12.2</jackson.version>
|
||||||
<junit.version>5.9.0</junit.version>
|
<junit.version>5.9.0</junit.version>
|
||||||
|
@ -16,14 +16,28 @@
|
|||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|
||||||
|
<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
|
||||||
|
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
||||||
|
|
||||||
<logback.version>1.2.9</logback.version>
|
<logback.version>1.2.9</logback.version>
|
||||||
<springboot.version>2.7.4</springboot.version>
|
<springboot.version>2.7.4</springboot.version>
|
||||||
<powerjob-remote-impl-http.version>4.2.0</powerjob-remote-impl-http.version>
|
<powerjob-remote-impl-http.version>4.2.0</powerjob-remote-impl-http.version>
|
||||||
<powerjob-remote-impl-akka.version>4.2.0</powerjob-remote-impl-akka.version>
|
<powerjob-remote-impl-akka.version>4.2.0</powerjob-remote-impl-akka.version>
|
||||||
|
|
||||||
|
<gatling.version>3.9.0</gatling.version>
|
||||||
|
<gatling-maven-plugin.version>4.2.9</gatling-maven-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 性能测试相关 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.gatling.highcharts</groupId>
|
||||||
|
<artifactId>gatling-charts-highcharts</artifactId>
|
||||||
|
<version>${gatling.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
@ -47,6 +61,46 @@
|
|||||||
<artifactId>powerjob-remote-impl-akka</artifactId>
|
<artifactId>powerjob-remote-impl-akka</artifactId>
|
||||||
<version>${powerjob-remote-impl-akka.version}</version>
|
<version>${powerjob-remote-impl-akka.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<version>${springboot.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>tech.powerjob.remote.benchmark.BenchmarkApplication</mainClass>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>${maven-jar-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>io.gatling</groupId>
|
||||||
|
<artifactId>gatling-maven-plugin</artifactId>
|
||||||
|
<version>${gatling-maven-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<!-- Enterprise Cloud (https://cloud.gatling.io/) configuration reference: https://gatling.io/docs/gatling/reference/current/extensions/maven_plugin/#working-with-gatling-enterprise-cloud -->
|
||||||
|
<!-- Enterprise Self-Hosted configuration reference: https://gatling.io/docs/gatling/reference/current/extensions/maven_plugin/#working-with-gatling-enterprise-self-hosted -->
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
</project>
|
</project>
|
@ -1,5 +1,7 @@
|
|||||||
package tech.powerjob.remote.benchmark;
|
package tech.powerjob.remote.benchmark;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.BooleanUtils;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
@ -10,6 +12,8 @@ import tech.powerjob.remote.framework.base.URL;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import java.util.concurrent.CompletionStage;
|
||||||
|
|
||||||
import static tech.powerjob.remote.benchmark.EngineService.*;
|
import static tech.powerjob.remote.benchmark.EngineService.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,6 +22,7 @@ import static tech.powerjob.remote.benchmark.EngineService.*;
|
|||||||
* @author tjq
|
* @author tjq
|
||||||
* @since 2023/1/7
|
* @since 2023/1/7
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/pressure")
|
@RequestMapping("/pressure")
|
||||||
public class PressureTestController {
|
public class PressureTestController {
|
||||||
@ -31,7 +36,26 @@ public class PressureTestController {
|
|||||||
public void httpTell(Integer blockMs, Integer responseSize, String content) {
|
public void httpTell(Integer blockMs, Integer responseSize, String content) {
|
||||||
URL url = new URL().setLocation(HL).setAddress(new Address().setPort(SERVER_HTTP_PORT).setHost(HOST));
|
URL url = new URL().setLocation(HL).setAddress(new Address().setPort(SERVER_HTTP_PORT).setHost(HOST));
|
||||||
final BenchmarkActor.BenchmarkRequest request = new BenchmarkActor.BenchmarkRequest().setContent(content).setBlockingMills(blockMs).setResponseSize(responseSize);
|
final BenchmarkActor.BenchmarkRequest request = new BenchmarkActor.BenchmarkRequest().setContent(content).setBlockingMills(blockMs).setResponseSize(responseSize);
|
||||||
|
try {
|
||||||
engineService.getHttpTransporter().tell(url, request);
|
engineService.getHttpTransporter().tell(url, request);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[HttpTell] process failed!", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/httpAsk")
|
||||||
|
public void httpAsk(Integer blockMs, Integer responseSize, String content, Boolean debug) {
|
||||||
|
URL url = new URL().setLocation(HL).setAddress(new Address().setPort(SERVER_HTTP_PORT).setHost(HOST));
|
||||||
|
final BenchmarkActor.BenchmarkRequest request = new BenchmarkActor.BenchmarkRequest().setContent(content).setBlockingMills(blockMs).setResponseSize(responseSize);
|
||||||
|
try {
|
||||||
|
CompletionStage<BenchmarkActor.BenchmarkResponse> responseOpt = engineService.getHttpTransporter().ask(url, request, BenchmarkActor.BenchmarkResponse.class);
|
||||||
|
final BenchmarkActor.BenchmarkResponse response = responseOpt.toCompletableFuture().get();
|
||||||
|
if (BooleanUtils.isTrue(debug)) {
|
||||||
|
log.info("[httpAsk] response: {}", response);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("[httpAsk] process failed", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
import io.gatling.app.Gatling;
|
||||||
|
import io.gatling.core.config.GatlingPropertiesBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 压测启动入口
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2023/1/8
|
||||||
|
*/
|
||||||
|
public class Engine {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
GatlingPropertiesBuilder props = new GatlingPropertiesBuilder()
|
||||||
|
.resourcesDirectory(IDEPathHelper.mavenResourcesDirectory.toString())
|
||||||
|
.resultsDirectory(IDEPathHelper.resultsDirectory.toString())
|
||||||
|
.binariesDirectory(IDEPathHelper.mavenBinariesDirectory.toString());
|
||||||
|
|
||||||
|
Gatling.fromMap(props.build());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
|
public class IDEPathHelper {
|
||||||
|
|
||||||
|
static final Path mavenSourcesDirectory;
|
||||||
|
static final Path mavenResourcesDirectory;
|
||||||
|
static final Path mavenBinariesDirectory;
|
||||||
|
static final Path resultsDirectory;
|
||||||
|
static final Path recorderConfigFile;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Path projectRootDir = Paths.get(requireNonNull(IDEPathHelper.class.getResource("gatling.conf"), "Couldn't locate gatling.conf").toURI()).getParent().getParent().getParent();
|
||||||
|
Path mavenTargetDirectory = projectRootDir.resolve("target");
|
||||||
|
Path mavenSrcTestDirectory = projectRootDir.resolve("src").resolve("test");
|
||||||
|
|
||||||
|
mavenSourcesDirectory = mavenSrcTestDirectory.resolve("java");
|
||||||
|
mavenResourcesDirectory = mavenSrcTestDirectory.resolve("resources");
|
||||||
|
mavenBinariesDirectory = mavenTargetDirectory.resolve("test-classes");
|
||||||
|
resultsDirectory = mavenTargetDirectory.resolve("gatling");
|
||||||
|
recorderConfigFile = mavenResourcesDirectory.resolve("recorder.conf");
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
throw new ExceptionInInitializerError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package tech.powerjob.remote.benchmark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constant
|
||||||
|
* 压测时需要修改的常量
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2023/1/8
|
||||||
|
*/
|
||||||
|
public class Constant {
|
||||||
|
|
||||||
|
public static final String SERVER_HOST = "127.0.0.1";
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package tech.powerjob.remote.benchmark;
|
||||||
|
|
||||||
|
import static io.gatling.javaapi.core.CoreDsl.*;
|
||||||
|
import static io.gatling.javaapi.http.HttpDsl.*;
|
||||||
|
|
||||||
|
import io.gatling.javaapi.core.*;
|
||||||
|
import io.gatling.javaapi.http.*;
|
||||||
|
/**
|
||||||
|
* description
|
||||||
|
*
|
||||||
|
* @author tjq
|
||||||
|
* @since 2023/1/8
|
||||||
|
*/
|
||||||
|
public class HttpSimulation extends Simulation {
|
||||||
|
|
||||||
|
String baseUrl = String.format("http://%s:8080", Constant.SERVER_HOST);
|
||||||
|
HttpProtocolBuilder httpProtocol = http // 4
|
||||||
|
.baseUrl(baseUrl) // 5
|
||||||
|
.acceptHeader("application/json") // 6
|
||||||
|
.doNotTrackHeader("1")
|
||||||
|
.acceptLanguageHeader("en-US,en;q=0.5")
|
||||||
|
.acceptEncodingHeader("gzip, deflate")
|
||||||
|
.userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0");
|
||||||
|
|
||||||
|
ScenarioBuilder scn = scenario("HttpSimulation") // 7
|
||||||
|
.exec(http("request_http") // 请求名称,用于压测报表展示
|
||||||
|
.get("/httpAsk?debug=true&responseSize=1024")) // 9
|
||||||
|
.pause(5); // 10
|
||||||
|
|
||||||
|
{
|
||||||
|
setUp( // 11
|
||||||
|
scn.injectOpen(atOnceUsers(1)) // 12
|
||||||
|
).protocols(httpProtocol); // 13
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,127 @@
|
|||||||
|
#########################
|
||||||
|
# Gatling Configuration #
|
||||||
|
#########################
|
||||||
|
|
||||||
|
# This file contains all the settings configurable for Gatling with their default values
|
||||||
|
|
||||||
|
gatling {
|
||||||
|
core {
|
||||||
|
#outputDirectoryBaseName = "" # The prefix for each simulation result folder (then suffixed by the report generation timestamp)
|
||||||
|
#runDescription = "" # The description for this simulation run, displayed in each report
|
||||||
|
#encoding = "utf-8" # Encoding to use throughout Gatling for file and string manipulation
|
||||||
|
#simulationClass = "" # The FQCN of the simulation to run (when used in conjunction with noReports, the simulation for which assertions will be validated)
|
||||||
|
#elFileBodiesCacheMaxCapacity = 200 # Cache size for request body EL templates, set to 0 to disable
|
||||||
|
#rawFileBodiesCacheMaxCapacity = 200 # Cache size for request body Raw templates, set to 0 to disable
|
||||||
|
#rawFileBodiesInMemoryMaxSize = 1000 # Below this limit, raw file bodies will be cached in memory
|
||||||
|
#pebbleFileBodiesCacheMaxCapacity = 200 # Cache size for request body Peeble templates, set to 0 to disable
|
||||||
|
#feederAdaptiveLoadModeThreshold = 100 # File size threshold (in MB). Below load eagerly in memory, above use batch mode with default buffer size
|
||||||
|
#shutdownTimeout = 10000 # Milliseconds to wait for the actor system to shutdown
|
||||||
|
extract {
|
||||||
|
regex {
|
||||||
|
#cacheMaxCapacity = 200 # Cache size for the compiled regexes, set to 0 to disable caching
|
||||||
|
}
|
||||||
|
xpath {
|
||||||
|
#cacheMaxCapacity = 200 # Cache size for the compiled XPath queries, set to 0 to disable caching
|
||||||
|
}
|
||||||
|
jsonPath {
|
||||||
|
#cacheMaxCapacity = 200 # Cache size for the compiled jsonPath queries, set to 0 to disable caching
|
||||||
|
}
|
||||||
|
css {
|
||||||
|
#cacheMaxCapacity = 200 # Cache size for the compiled CSS selectors queries, set to 0 to disable caching
|
||||||
|
}
|
||||||
|
}
|
||||||
|
directory {
|
||||||
|
#simulations = user-files/simulations # Directory where simulation classes are located (for bundle packaging only)
|
||||||
|
#resources = user-files/resources # Directory where resources, such as feeder files and request bodies are located (for bundle packaging only)
|
||||||
|
#reportsOnly = "" # If set, name of report folder to look for in order to generate its report
|
||||||
|
#binaries = "" # If set, name of the folder where compiles classes are located: Defaults to GATLING_HOME/target.
|
||||||
|
#results = results # Name of the folder where all reports folder are located
|
||||||
|
}
|
||||||
|
}
|
||||||
|
socket {
|
||||||
|
#connectTimeout = 10000 # Timeout in millis for establishing a TCP socket
|
||||||
|
#tcpNoDelay = true
|
||||||
|
#soKeepAlive = false # if TCP keepalive configured at OS level should be used
|
||||||
|
#soReuseAddress = false
|
||||||
|
}
|
||||||
|
netty {
|
||||||
|
#useNativeTransport = true # if Netty native transport should be used instead of Java NIO
|
||||||
|
#allocator = "pooled" # switch to unpooled for unpooled ByteBufAllocator
|
||||||
|
#maxThreadLocalCharBufferSize = 200000 # Netty's default is 16k
|
||||||
|
}
|
||||||
|
ssl {
|
||||||
|
#useOpenSsl = true # if OpenSSL should be used instead of JSSE (only the latter can be debugged with -Djava.net.debug=ssl)
|
||||||
|
#useOpenSslFinalizers = false # if OpenSSL contexts should be freed with Finalizer or if using RefCounted is fine
|
||||||
|
#handshakeTimeout = 10000 # TLS handshake timeout in millis
|
||||||
|
#useInsecureTrustManager = true # Use an insecure TrustManager that trusts all server certificates
|
||||||
|
#enabledProtocols = [] # Array of enabled protocols for HTTPS, if empty use Netty's defaults
|
||||||
|
#enabledCipherSuites = [] # Array of enabled cipher suites for HTTPS, if empty enable all available ciphers
|
||||||
|
#sessionCacheSize = 0 # SSLSession cache size, set to 0 to use JDK's default
|
||||||
|
#sessionTimeout = 0 # SSLSession timeout in seconds, set to 0 to use JDK's default (24h)
|
||||||
|
#enableSni = true # When set to true, enable Server Name indication (SNI)
|
||||||
|
keyStore {
|
||||||
|
#type = "" # Type of SSLContext's KeyManagers store
|
||||||
|
#file = "" # Location of SSLContext's KeyManagers store
|
||||||
|
#password = "" # Password for SSLContext's KeyManagers store
|
||||||
|
#algorithm = "" # Algorithm used SSLContext's KeyManagers store
|
||||||
|
}
|
||||||
|
trustStore {
|
||||||
|
#type = "" # Type of SSLContext's TrustManagers store
|
||||||
|
#file = "" # Location of SSLContext's TrustManagers store
|
||||||
|
#password = "" # Password for SSLContext's TrustManagers store
|
||||||
|
#algorithm = "" # Algorithm used by SSLContext's TrustManagers store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
charting {
|
||||||
|
#noReports = false # When set to true, don't generate HTML reports
|
||||||
|
#maxPlotPerSeries = 1000 # Number of points per graph in Gatling reports
|
||||||
|
#useGroupDurationMetric = false # Switch group timings from cumulated response time to group duration.
|
||||||
|
indicators {
|
||||||
|
#lowerBound = 800 # Lower bound for the requests' response time to track in the reports and the console summary
|
||||||
|
#higherBound = 1200 # Higher bound for the requests' response time to track in the reports and the console summary
|
||||||
|
#percentile1 = 50 # Value for the 1st percentile to track in the reports, the console summary and Graphite
|
||||||
|
#percentile2 = 75 # Value for the 2nd percentile to track in the reports, the console summary and Graphite
|
||||||
|
#percentile3 = 95 # Value for the 3rd percentile to track in the reports, the console summary and Graphite
|
||||||
|
#percentile4 = 99 # Value for the 4th percentile to track in the reports, the console summary and Graphite
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http {
|
||||||
|
#fetchedCssCacheMaxCapacity = 200 # Cache size for CSS parsed content, set to 0 to disable
|
||||||
|
#fetchedHtmlCacheMaxCapacity = 200 # Cache size for HTML parsed content, set to 0 to disable
|
||||||
|
#perUserCacheMaxCapacity = 200 # Per virtual user cache size, set to 0 to disable
|
||||||
|
#warmUpUrl = "https://gatling.io" # The URL to use to warm-up the HTTP stack (blank means disabled)
|
||||||
|
#enableGA = true # Very light Google Analytics (Gatling and Java version), please support
|
||||||
|
#pooledConnectionIdleTimeout = 60000 # Timeout in millis for a connection to stay idle in the pool
|
||||||
|
#requestTimeout = 60000 # Timeout in millis for performing an HTTP request
|
||||||
|
#enableHostnameVerification = false # When set to true, enable hostname verification: SSLEngine.setHttpsEndpointIdentificationAlgorithm("HTTPS")
|
||||||
|
dns {
|
||||||
|
#queryTimeout = 5000 # Timeout in millis of each DNS query in millis
|
||||||
|
#maxQueriesPerResolve = 6 # Maximum allowed number of DNS queries for a given name resolution
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jms {
|
||||||
|
#replyTimeoutScanPeriod = 1000 # scan period for timedout reply messages
|
||||||
|
}
|
||||||
|
data {
|
||||||
|
#writers = [console, file] # The list of DataWriters to which Gatling write simulation data (currently supported : console, file, graphite)
|
||||||
|
console {
|
||||||
|
#light = false # When set to true, displays a light version without detailed request stats
|
||||||
|
#writePeriod = 5 # Write interval, in seconds
|
||||||
|
}
|
||||||
|
file {
|
||||||
|
#bufferSize = 8192 # FileDataWriter's internal data buffer size, in bytes
|
||||||
|
}
|
||||||
|
leak {
|
||||||
|
#noActivityTimeout = 30 # Period, in seconds, for which Gatling may have no activity before considering a leak may be happening
|
||||||
|
}
|
||||||
|
graphite {
|
||||||
|
#light = false # only send the all* stats
|
||||||
|
#host = "localhost" # The host where the Carbon server is located
|
||||||
|
#port = 2003 # The port to which the Carbon server listens to (2003 is default for plaintext, 2004 is default for pickle)
|
||||||
|
#protocol = "tcp" # The protocol used to send data to Carbon (currently supported : "tcp", "udp")
|
||||||
|
#rootPathPrefix = "gatling" # The common prefix of all metrics sent to Graphite
|
||||||
|
#bufferSize = 8192 # Internal data buffer size, in bytes
|
||||||
|
#writePeriod = 1 # Write period, in seconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<powerjob-remote-framework.version>4.2.0</powerjob-remote-framework.version>
|
<powerjob-remote-framework.version>4.2.0</powerjob-remote-framework.version>
|
||||||
|
|
||||||
<akka.version>2.6.12</akka.version>
|
<akka.version>2.6.20</akka.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user