package org.ovirt.engine.core.vdsbroker.jsonrpc; import java.io.IOException; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.vdsm.jsonrpc.client.ClientConnectionException; import org.ovirt.vdsm.jsonrpc.client.JsonRpcClient; import org.ovirt.vdsm.jsonrpc.client.internal.ClientPolicy; import org.ovirt.vdsm.jsonrpc.client.internal.ResponseWorker; import org.ovirt.vdsm.jsonrpc.client.reactors.ManagerProvider; import org.ovirt.vdsm.jsonrpc.client.reactors.Reactor; import org.ovirt.vdsm.jsonrpc.client.reactors.ReactorClient; import org.ovirt.vdsm.jsonrpc.client.reactors.ReactorFactory; import org.ovirt.vdsm.jsonrpc.client.reactors.ReactorType; import org.ovirt.vdsm.jsonrpc.client.reactors.stomp.StompClientPolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JsonRpcUtils { private static Logger log = LoggerFactory.getLogger(JsonRpcUtils.class); private static final String identifierLogMessage = "Setting up connection policy identifier for host {}"; public static JsonRpcClient createStompClient(String hostname, int port, int connectionTimeout, int clientTimeout, int connectionRetry, int heartbeat, boolean isSecure, String protocol, int parallelism, String requestQueue, String responseQueue, String eventQueue) { StompClientPolicy connectionPolicy = new StompClientPolicy(connectionTimeout, connectionRetry, heartbeat, IOException.class, requestQueue, responseQueue); connectionPolicy.setEventQueue(eventQueue); ClientPolicy clientPolicy = new ClientPolicy(clientTimeout, connectionRetry, heartbeat, IOException.class); if (Config.getValue(ConfigValues.UseHostNameIdentifier)){ log.debug(identifierLogMessage, hostname); connectionPolicy.setIdentifier(hostname); } return createClient(hostname, port, connectionPolicy, clientPolicy, isSecure, ReactorType.STOMP, protocol, parallelism); } private static JsonRpcClient createClient(String hostname, int port, ClientPolicy connectionPolicy, ClientPolicy clientPolicy, boolean isSecure, ReactorType type, String protocol, int parallelism) { ManagerProvider provider = null; if (isSecure) { provider = new EngineManagerProvider(protocol); } try { final Reactor reactor = ReactorFactory.getReactor(provider, type); return getJsonClient(reactor, hostname, port, connectionPolicy, clientPolicy, parallelism); } catch (ClientConnectionException e) { log.error("Exception occurred during building ssl context or obtaining selector for '{}': {}", hostname, e.getMessage()); log.debug("Exception", e); throw new IllegalStateException(e); } } private static JsonRpcClient getJsonClient(Reactor reactor, String hostName, int port, ClientPolicy connectionPolicy, ClientPolicy clientPolicy, int parallelism) throws ClientConnectionException { final ReactorClient client = reactor.createClient(hostName, port); client.setClientPolicy(connectionPolicy); ResponseWorker worker = ReactorFactory.getWorker(parallelism); JsonRpcClient jsonClient = worker.register(client); jsonClient.setRetryPolicy(clientPolicy); return jsonClient; } }