/*
 * Copyright (c) 2011-2017 Contributors to the Eclipse Foundation
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 * which is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 */

package io.vertx.core;

import io.vertx.codegen.annotations.DataObject;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

Options for configuring a verticle deployment.

Author:Tim Fox
/** * Options for configuring a verticle deployment. * <p> * * * @author <a href="http://tfox.org">Tim Fox</a> */
@DataObject(generateConverter = true, publicConverter = false) public class DeploymentOptions { public static final boolean DEFAULT_WORKER = false; public static final boolean DEFAULT_MULTI_THREADED = false; public static final String DEFAULT_ISOLATION_GROUP = null; public static final boolean DEFAULT_HA = false; public static final int DEFAULT_INSTANCES = 1; private JsonObject config; private boolean worker; private boolean multiThreaded; private String isolationGroup; private String workerPoolName; private int workerPoolSize; private long maxWorkerExecuteTime; private boolean ha; private List<String> extraClasspath; private int instances; private List<String> isolatedClasses; private TimeUnit maxWorkerExecuteTimeUnit;
Default constructor
/** * Default constructor */
public DeploymentOptions() { this.worker = DEFAULT_WORKER; this.config = null; this.multiThreaded = DEFAULT_MULTI_THREADED; this.isolationGroup = DEFAULT_ISOLATION_GROUP; this.ha = DEFAULT_HA; this.instances = DEFAULT_INSTANCES; this.workerPoolName = null; this.workerPoolSize = VertxOptions.DEFAULT_WORKER_POOL_SIZE; this.maxWorkerExecuteTime = VertxOptions.DEFAULT_MAX_WORKER_EXECUTE_TIME; this.maxWorkerExecuteTimeUnit = VertxOptions.DEFAULT_MAX_WORKER_EXECUTE_TIME_UNIT; }
Copy constructor
Params:
  • other – the instance to copy
/** * Copy constructor * * @param other the instance to copy */
public DeploymentOptions(DeploymentOptions other) { this.config = other.getConfig() == null ? null : other.getConfig().copy(); this.worker = other.isWorker(); this.multiThreaded = other.isMultiThreaded(); this.isolationGroup = other.getIsolationGroup(); this.ha = other.isHa(); this.extraClasspath = other.getExtraClasspath() == null ? null : new ArrayList<>(other.getExtraClasspath()); this.instances = other.instances; this.isolatedClasses = other.getIsolatedClasses() == null ? null : new ArrayList<>(other.getIsolatedClasses()); this.workerPoolName = other.workerPoolName; setWorkerPoolSize(other.workerPoolSize); setMaxWorkerExecuteTime(other.maxWorkerExecuteTime); this.maxWorkerExecuteTimeUnit = other.maxWorkerExecuteTimeUnit; }
Constructor for creating a instance from JSON
Params:
  • json – the JSON
/** * Constructor for creating a instance from JSON * * @param json the JSON */
public DeploymentOptions(JsonObject json) { this(); DeploymentOptionsConverter.fromJson(json, this); }
Initialise the fields of this instance from the specified JSON
Params:
  • json – the JSON
/** * Initialise the fields of this instance from the specified JSON * * @param json the JSON */
public void fromJson(JsonObject json) { this.config = json.getJsonObject("config"); this.worker = json.getBoolean("worker", DEFAULT_WORKER); this.multiThreaded = json.getBoolean("multiThreaded", DEFAULT_MULTI_THREADED); this.isolationGroup = json.getString("isolationGroup", DEFAULT_ISOLATION_GROUP); this.ha = json.getBoolean("ha", DEFAULT_HA); JsonArray arr = json.getJsonArray("extraClasspath", null); if (arr != null) { this.extraClasspath = arr.getList(); } this.instances = json.getInteger("instances", DEFAULT_INSTANCES); JsonArray arrIsolated = json.getJsonArray("isolatedClasses", null); if (arrIsolated != null) { this.isolatedClasses = arrIsolated.getList(); } }
Get the JSON configuration that will be passed to the verticle(s) when deployed.
Returns: the JSON config
/** * Get the JSON configuration that will be passed to the verticle(s) when deployed. * * @return the JSON config */
public JsonObject getConfig() { return config; }
Set the JSON configuration that will be passed to the verticle(s) when it's deployed
Params:
  • config – the JSON config
Returns:a reference to this, so the API can be used fluently
/** * Set the JSON configuration that will be passed to the verticle(s) when it's deployed * * @param config the JSON config * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setConfig(JsonObject config) { this.config = config; return this; }
Should the verticle(s) be deployed as a worker verticle?
Returns:true if will be deployed as worker, false otherwise
/** * Should the verticle(s) be deployed as a worker verticle? * * @return true if will be deployed as worker, false otherwise */
public boolean isWorker() { return worker; }
Set whether the verticle(s) should be deployed as a worker verticle
Params:
  • worker – true for worker, false otherwise
Returns:a reference to this, so the API can be used fluently
/** * Set whether the verticle(s) should be deployed as a worker verticle * * @param worker true for worker, false otherwise * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setWorker(boolean worker) { this.worker = worker; return this; }
Should the verticle(s) be deployed as a multi-threaded worker verticle?

Ignored if isWorker is not true.

Returns:true if will be deployed as multi-threaded worker, false otherwise
/** * Should the verticle(s) be deployed as a multi-threaded worker verticle? * <p> * Ignored if {@link #isWorker} is not true. * * @return true if will be deployed as multi-threaded worker, false otherwise */
public boolean isMultiThreaded() { return multiThreaded; }
Set whether the verticle(s) should be deployed as a multi-threaded worker verticle.

WARNING: Multi-threaded worker verticles are a deprecated feature.

Most applications will have no need for them. Because of the concurrency in these verticles you have to be very careful to keep the verticle in a consistent state using standard Java techniques for multi-threaded programming.

You can read the documentation that explains how you can replace this feature by the usage of custom worker pools or executeBlocking calls.

Params:
  • multiThreaded – true for multi-threaded worker, false otherwise
Deprecated:as of 3.6.0
Returns:a reference to this, so the API can be used fluently
/** * Set whether the verticle(s) should be deployed as a multi-threaded worker verticle. * <p> * <strong>WARNING</strong>: Multi-threaded worker verticles are a deprecated feature. * <p> * Most applications will have no need for them. Because of the concurrency in these verticles you have to be * very careful to keep the verticle in a consistent state using standard Java techniques for multi-threaded * programming. * <p> * You can read the documentation that explains how you can replace this feature by the usage of custom worker * pools or {@code executeBlocking} calls. * * @deprecated as of 3.6.0 * @param multiThreaded true for multi-threaded worker, false otherwise * @return a reference to this, so the API can be used fluently */
@Deprecated public DeploymentOptions setMultiThreaded(boolean multiThreaded) { this.multiThreaded = multiThreaded; return this; }
Get the isolation group that will be used when deploying the verticle(s)
Returns:the isolation group
/** * Get the isolation group that will be used when deploying the verticle(s) * * @return the isolation group */
public String getIsolationGroup() { return isolationGroup; }
Set the isolation group that will be used when deploying the verticle(s)
Params:
  • isolationGroup – - the isolation group
Returns:a reference to this, so the API can be used fluently
/** * Set the isolation group that will be used when deploying the verticle(s) * * @param isolationGroup - the isolation group * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setIsolationGroup(String isolationGroup) { this.isolationGroup = isolationGroup; return this; }
Will the verticle(s) be deployed as HA (highly available) ?
Returns:true if HA, false otherwise
/** * Will the verticle(s) be deployed as HA (highly available) ? * * @return true if HA, false otherwise */
public boolean isHa() { return ha; }
Set whether the verticle(s) will be deployed as HA.
Params:
  • ha – true if to be deployed as HA, false otherwise
Returns:a reference to this, so the API can be used fluently
/** * Set whether the verticle(s) will be deployed as HA. * * @param ha true if to be deployed as HA, false otherwise * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setHa(boolean ha) { this.ha = ha; return this; }
Get any extra classpath to be used when deploying the verticle.

Ignored if no isolation group is set.

Returns: any extra classpath
/** * Get any extra classpath to be used when deploying the verticle. * <p> * Ignored if no isolation group is set. * * @return any extra classpath */
public List<String> getExtraClasspath() { return extraClasspath; }
Set any extra classpath to be used when deploying the verticle.

Ignored if no isolation group is set.

Returns:a reference to this, so the API can be used fluently
/** * Set any extra classpath to be used when deploying the verticle. * <p> * Ignored if no isolation group is set. * * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setExtraClasspath(List<String> extraClasspath) { this.extraClasspath = extraClasspath; return this; }
Get the number of instances that should be deployed.
Returns: the number of instances
/** * Get the number of instances that should be deployed. * * @return the number of instances */
public int getInstances() { return instances; }
Set the number of instances that should be deployed.
Params:
  • instances – the number of instances
Returns:a reference to this, so the API can be used fluently
/** * Set the number of instances that should be deployed. * * @param instances the number of instances * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setInstances(int instances) { this.instances = instances; return this; }
Get the list of isolated class names, the names can be a Java class fully qualified name such as 'com.mycompany.myproject.engine.MyClass' or a wildcard matching such as `com.mycompany.myproject.*`.
Returns:the list of isolated classes
/** * Get the list of isolated class names, the names can be a Java class fully qualified name such as * 'com.mycompany.myproject.engine.MyClass' or a wildcard matching such as `com.mycompany.myproject.*`. * * @return the list of isolated classes */
public List<String> getIsolatedClasses() { return isolatedClasses; }
Set the isolated class names.
Params:
  • isolatedClasses – the list of isolated class names
Returns:a reference to this, so the API can be used fluently
/** * Set the isolated class names. * * @param isolatedClasses the list of isolated class names * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setIsolatedClasses(List<String> isolatedClasses) { this.isolatedClasses = isolatedClasses; return this; }
Returns:the worker pool name
/** * @return the worker pool name */
public String getWorkerPoolName() { return workerPoolName; }
Set the worker pool name to use for this verticle. When no name is set, the Vert.x worker pool will be used, when a name is set, the verticle will use a named worker pool.
Params:
  • workerPoolName – the worker pool name
Returns:a reference to this, so the API can be used fluently
/** * Set the worker pool name to use for this verticle. When no name is set, the Vert.x * worker pool will be used, when a name is set, the verticle will use a named worker pool. * * @param workerPoolName the worker pool name * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setWorkerPoolName(String workerPoolName) { this.workerPoolName = workerPoolName; return this; }
Get the maximum number of worker threads to be used by the worker pool when the verticle is deployed with a setWorkerPoolName. When the verticle does not use a named worker pool, this option has no effect.

Worker threads are used for running blocking code and worker verticles.

Returns:the maximum number of worker threads
/** * Get the maximum number of worker threads to be used by the worker pool when the verticle is deployed * with a {@link #setWorkerPoolName}. When the verticle does not use a named worker pool, this option * has no effect. * <p> * Worker threads are used for running blocking code and worker verticles. * * @return the maximum number of worker threads */
public int getWorkerPoolSize() { return workerPoolSize; }
Set the maximum number of worker threads to be used by the Vert.x instance.
Params:
  • workerPoolSize – the number of threads
Returns:a reference to this, so the API can be used fluently
/** * Set the maximum number of worker threads to be used by the Vert.x instance. * * @param workerPoolSize the number of threads * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setWorkerPoolSize(int workerPoolSize) { if (workerPoolSize < 1) { throw new IllegalArgumentException("workerPoolSize must be > 0"); } this.workerPoolSize = workerPoolSize; return this; }
Get the value of max worker execute time, in maxWorkerExecuteTimeUnit.

Vert.x will automatically log a warning if it detects that worker threads haven't returned within this time.

This can be used to detect where the user is blocking a worker thread for too long. Although worker threads can be blocked longer than event loop threads, they shouldn't be blocked for long periods of time.

Returns:The value of max worker execute time, the default value of setMaxWorkerExecuteTimeUnit maxWorkerExecuteTimeUnit is TimeUnit.NANOSECONDS
/** * Get the value of max worker execute time, in {@link DeploymentOptions#setMaxWorkerExecuteTimeUnit maxWorkerExecuteTimeUnit}. * <p> * Vert.x will automatically log a warning if it detects that worker threads haven't returned within this time. * <p> * This can be used to detect where the user is blocking a worker thread for too long. Although worker threads * can be blocked longer than event loop threads, they shouldn't be blocked for long periods of time. * * @return The value of max worker execute time, the default value of {@link DeploymentOptions#setMaxWorkerExecuteTimeUnit} {@code maxWorkerExecuteTimeUnit} is {@link TimeUnit#NANOSECONDS} */
public long getMaxWorkerExecuteTime() { return maxWorkerExecuteTime; }
Sets the value of max worker execute time, in maxWorkerExecuteTimeUnit.

The default value of maxWorkerExecuteTimeUnit is TimeUnit.NANOSECONDS

Params:
Returns:a reference to this, so the API can be used fluently
/** * Sets the value of max worker execute time, in {@link DeploymentOptions#setMaxWorkerExecuteTimeUnit maxWorkerExecuteTimeUnit}. * <p> * The default value of {@link DeploymentOptions#setMaxWorkerExecuteTimeUnit maxWorkerExecuteTimeUnit} is {@link TimeUnit#NANOSECONDS} * * @param maxWorkerExecuteTime the value of max worker execute time, in in {@link DeploymentOptions#setMaxWorkerExecuteTimeUnit maxWorkerExecuteTimeUnit}. * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setMaxWorkerExecuteTime(long maxWorkerExecuteTime) { if (maxWorkerExecuteTime < 1) { throw new IllegalArgumentException("maxWorkerExecuteTime must be > 0"); } this.maxWorkerExecuteTime = maxWorkerExecuteTime; return this; }
Returns:the time unit of maxWorkerExecuteTime
/** * @return the time unit of {@code maxWorkerExecuteTime} */
public TimeUnit getMaxWorkerExecuteTimeUnit() { return maxWorkerExecuteTimeUnit; }
Set the time unit of maxWorkerExecuteTime
Params:
  • maxWorkerExecuteTimeUnit – the time unit of maxWorkerExecuteTime
Returns:a reference to this, so the API can be used fluently
/** * Set the time unit of {@code maxWorkerExecuteTime} * @param maxWorkerExecuteTimeUnit the time unit of {@code maxWorkerExecuteTime} * @return a reference to this, so the API can be used fluently */
public DeploymentOptions setMaxWorkerExecuteTimeUnit(TimeUnit maxWorkerExecuteTimeUnit) { this.maxWorkerExecuteTimeUnit = maxWorkerExecuteTimeUnit; return this; }
Convert this to JSON
Returns: the JSON
/** * Convert this to JSON * * @return the JSON */
public JsonObject toJson() { JsonObject json = new JsonObject(); DeploymentOptionsConverter.toJson(this, json); return json; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; DeploymentOptions that = (DeploymentOptions) o; if (worker != that.worker) return false; if (multiThreaded != that.multiThreaded) return false; if (ha != that.ha) return false; if (instances != that.instances) return false; if (config != null ? !config.equals(that.config) : that.config != null) return false; if (isolationGroup != null ? !isolationGroup.equals(that.isolationGroup) : that.isolationGroup != null) return false; if (extraClasspath != null ? !extraClasspath.equals(that.extraClasspath) : that.extraClasspath != null) return false; return !(isolatedClasses != null ? !isolatedClasses.equals(that.isolatedClasses) : that.isolatedClasses != null); } @Override public int hashCode() { int result = config != null ? config.hashCode() : 0; result = 31 * result + (worker ? 1 : 0); result = 31 * result + (multiThreaded ? 1 : 0); result = 31 * result + (isolationGroup != null ? isolationGroup.hashCode() : 0); result = 31 * result + (ha ? 1 : 0); result = 31 * result + (extraClasspath != null ? extraClasspath.hashCode() : 0); result = 31 * result + instances; result = 31 * result + (isolatedClasses != null ? isolatedClasses.hashCode() : 0); result = 31 * result + (workerPoolName != null ? workerPoolName.hashCode() : 0); result = 31 * result + workerPoolSize; result = 31 * result + Long.hashCode(maxWorkerExecuteTime); return result; } }