mirror of https://github.com/apache/cloudstack.git
149 lines
6.0 KiB
Java
149 lines
6.0 KiB
Java
// Copyright 2012 Citrix Systems, Inc. Licensed under the
|
|
// Apache License, Version 2.0 (the "License"); you may not use this
|
|
// file except in compliance with the License. Citrix Systems, Inc.
|
|
// reserves all rights not expressly granted by 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.
|
|
//
|
|
// Automatically generated by addcopyright.py at 04/03/2012
|
|
package com.cloud.cluster;
|
|
|
|
import java.io.IOException;
|
|
import java.rmi.RemoteException;
|
|
|
|
import org.apache.commons.httpclient.HttpClient;
|
|
import org.apache.commons.httpclient.HttpException;
|
|
import org.apache.commons.httpclient.HttpStatus;
|
|
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
|
|
import org.apache.commons.httpclient.methods.PostMethod;
|
|
import org.apache.commons.httpclient.params.HttpClientParams;
|
|
import org.apache.log4j.Logger;
|
|
|
|
public class ClusterServiceServletImpl implements ClusterService {
|
|
private static final long serialVersionUID = 4574025200012566153L;
|
|
private static final Logger s_logger = Logger.getLogger(ClusterServiceServletImpl.class);
|
|
|
|
private String _serviceUrl;
|
|
|
|
private int _requestTimeoutSeconds;
|
|
protected static HttpClient s_client = null;
|
|
|
|
public ClusterServiceServletImpl() {
|
|
}
|
|
|
|
public ClusterServiceServletImpl(String serviceUrl, int requestTimeoutSeconds) {
|
|
s_logger.info("Setup cluster service servlet. service url: " + serviceUrl + ", request timeout: " + requestTimeoutSeconds + " seconds");
|
|
|
|
this._serviceUrl = serviceUrl;
|
|
this._requestTimeoutSeconds = requestTimeoutSeconds;
|
|
}
|
|
|
|
@Override
|
|
public String execute(ClusterServicePdu pdu) throws RemoteException {
|
|
|
|
HttpClient client = getHttpClient();
|
|
PostMethod method = new PostMethod(_serviceUrl);
|
|
|
|
method.addParameter("method", Integer.toString(RemoteMethodConstants.METHOD_DELIVER_PDU));
|
|
method.addParameter("sourcePeer", pdu.getSourcePeer());
|
|
method.addParameter("destPeer", pdu.getDestPeer());
|
|
method.addParameter("pduSeq", Long.toString(pdu.getSequenceId()));
|
|
method.addParameter("pduAckSeq", Long.toString(pdu.getAckSequenceId()));
|
|
method.addParameter("agentId", Long.toString(pdu.getAgentId()));
|
|
method.addParameter("gsonPackage", pdu.getJsonPackage());
|
|
method.addParameter("stopOnError", pdu.isStopOnError() ? "1" : "0");
|
|
method.addParameter("pduType", Integer.toString(pdu.getPduType()));
|
|
|
|
try {
|
|
return executePostMethod(client, method);
|
|
} finally {
|
|
method.releaseConnection();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean ping(String callingPeer) throws RemoteException {
|
|
if(s_logger.isDebugEnabled()) {
|
|
s_logger.debug("Ping at " + _serviceUrl);
|
|
}
|
|
|
|
HttpClient client = getHttpClient();
|
|
PostMethod method = new PostMethod(_serviceUrl);
|
|
|
|
method.addParameter("method", Integer.toString(RemoteMethodConstants.METHOD_PING));
|
|
method.addParameter("callingPeer", callingPeer);
|
|
|
|
try {
|
|
String returnVal = executePostMethod(client, method);
|
|
if("true".equalsIgnoreCase(returnVal)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
} finally {
|
|
method.releaseConnection();
|
|
}
|
|
}
|
|
|
|
private String executePostMethod(HttpClient client, PostMethod method) {
|
|
int response = 0;
|
|
String result = null;
|
|
try {
|
|
long startTick = System.currentTimeMillis();
|
|
response = client.executeMethod(method);
|
|
if(response == HttpStatus.SC_OK) {
|
|
result = method.getResponseBodyAsString();
|
|
if(s_logger.isDebugEnabled()) {
|
|
s_logger.debug("POST " + _serviceUrl + " response :" + result + ", responding time: "
|
|
+ (System.currentTimeMillis() - startTick) + " ms");
|
|
}
|
|
} else {
|
|
s_logger.error("Invalid response code : " + response + ", from : "
|
|
+ _serviceUrl + ", method : " + method.getParameter("method")
|
|
+ " responding time: " + (System.currentTimeMillis() - startTick));
|
|
}
|
|
} catch (HttpException e) {
|
|
s_logger.error("HttpException from : " + _serviceUrl + ", method : " + method.getParameter("method"));
|
|
} catch (IOException e) {
|
|
s_logger.error("IOException from : " + _serviceUrl + ", method : " + method.getParameter("method"));
|
|
} catch(Throwable e) {
|
|
s_logger.error("Exception from : " + _serviceUrl + ", method : " + method.getParameter("method") + ", exception :", e);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private HttpClient getHttpClient() {
|
|
|
|
if(s_client == null) {
|
|
MultiThreadedHttpConnectionManager mgr = new MultiThreadedHttpConnectionManager();
|
|
mgr.getParams().setDefaultMaxConnectionsPerHost(4);
|
|
|
|
// TODO make it configurable
|
|
mgr.getParams().setMaxTotalConnections(1000);
|
|
|
|
s_client = new HttpClient(mgr);
|
|
HttpClientParams clientParams = new HttpClientParams();
|
|
clientParams.setSoTimeout(_requestTimeoutSeconds * 1000);
|
|
|
|
s_client.setParams(clientParams);
|
|
}
|
|
return s_client;
|
|
}
|
|
|
|
// for test purpose only
|
|
public static void main(String[] args) {
|
|
/*
|
|
ClusterServiceServletImpl service = new ClusterServiceServletImpl("http://localhost:9090/clusterservice", 300);
|
|
try {
|
|
String result = service.execute("test", 1, "{ p1:v1, p2:v2 }", true);
|
|
System.out.println(result);
|
|
} catch (RemoteException e) {
|
|
}
|
|
*/
|
|
}
|
|
}
|