All Java web services have the same observation. The first time program creates new objects and as long as you are in the same session, it can pull out from the memory pool whenever it needs. Look, truck always looks clumsy when it gets start first time. This is the so-called inertia which exists not only in physics but also in computer science. ;-)
-Daniel
Jia YU wrote:
I set up a web services with soap2.2.
I want to time the response time on client sides. I wrote a loop to send request 10 times to the Web services. the first one is very long others are very short. if I start program again the result is same, first one is long but others are short.
I attached the program pls help why? Do you have any idea how to do
timing for web services?
I also time the myrpc.invoke() the result is same first time is long others short.
What can cause this problem? some wrong with my program? I knew the webservice use http service. it may have sock connection setup on the first time, but my question is I create new soap connection everytime in the loop,why the time is short after first query and why if I run new program again the first time become very long too. how can http server know it is different program rather than different soap call.
Please help!!!
***This is my test program String sName=commandLine.getFlagArg("-serviceName");
GMDQuery g=null;
long time=0;
for(int i=0;i<10;i++){
try{
//create a class which is for soap query (code is below)
g=new
GMDQuery(gmdHost,Integer.parseInt(port),soapDir,soapServiceName); Price p=null;
long st=System.currentTimeMillis(); //start
time
p=g.getPrice(sName.trim());
long ft=System.currentTimeMillis(); //finish
time
time=(ft-st)+time;
System.out.println("Done: "+ (ft-st));
System.out.println(p.toString());
}catch(GMDQueryException e){
System.err.println(e.getMessage());
System.exit(2);
}
}//for
***My query class
public class GMDQuery {
Call myrpc;
String servicePoint;
public GMDQuery(String host, int port, String soapDir, String
soapServiceName) throws GMDQueryException{
Properties props = new Properties();
servicePoint="http://"+host+":"+String.valueOf(port)+soapDir;
System.out.println("Current GMD is on "+servicePoint+"\n");
myrpc = new Call(); myrpc.setTargetObjectURI(soapServiceName); }
public Price getPrice(String sName) throws GMDQueryException{ Element QueryPriceRoot=new Element("QUERY-PRICE"); QueryPriceRoot.addContent(new Element("SERVICE_NAME").setText(sName)); Document QueryPrice=new Document(QueryPriceRoot); XMLOutputter outputter=new XMLOutputter(" ",true); String outReq=outputter.outputString(QueryPrice);
//for looking at xml message //System.out.println(outReq);
myrpc.setMethodName("queryPrice");
String rxml=null; try{ rxml=executeSOAPQuery(outReq); }catch(GMDQueryException e){ throw e; } ...... return new Price(hPrice,sPrice); } private String executeSOAPQuery(String outReq) throws GMDQueryException{
myrpc.setEncodingStyleURI("http://schemas.xmlsoap.org/soap/encoding/");
//Create a URL object, which represents the endpoint URL url=null;
try{ url=new URL(servicePoint); }catch(java.net.MalformedURLException e){ throw new GMDQueryException(e.getMessage()); }
// Add Parameters if(!outReq.equals("")){ Vector myparams = new Vector(1); myparams.addElement(new Parameter("inputReq", String.class, outReq,null)); myrpc.setParams(myparams); }
//Send the SOAP RPC request message using invoke() method Response resp=null;
try{ resp=myrpc.invoke(url," "); }catch(org.apache.soap.SOAPException e){ throw new GMDQueryException("connection error"); }
//Check the response. Parameter result=null;
if(resp.generatedFault()){ //Error Occured Fault fault=resp.getFault(); throw new GMDQueryException("GMD Error:"+fault.getFaultString()); }else { result=resp.getReturnValue(); } return result.getValue().toString(); }