// 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) { } */ } }