2012-06-04 4 views
1

나는 멀티 스레드 환경을 사용하여 HTTP 연결 풀링을 달성해야합니다. 아래에 언급 된 코드를 사용하고 있습니다. 언급 된 serviceURL은 응답하는데 약 1 ~ 3 초가 걸리지 만 클라이언트에서 초당 약 30-50 건의 조회가 발생합니다. 서로 다른 속성을 가진 단일 URL을 공격해야합니다. 그래서 나는 명확하지 않다. 나는 모든 히트 (30-40 hits/sec)에 응답하기 위해 무엇을해야만 하는가? HttpURLConnection이 이미 연결 풀링을 수행하는 경우 멀티 스레딩이 솔루션입니다.어떻게 내가 자바에서 HTTP 연결 풀링을 달성 할 수

HTTPClient를 사용하여이 프로그램을 변환하려고했지만 불행히도 제대로 작동하지 않습니다. 그래서 당신이 말해 줄 수있는이 코드를 HTTPClient 다중 스레드 환경을 사용하여 변환 할 수 있습니다.

package airtel.product.action; 
import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.KeyManagementException; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.UnrecoverableKeyException; 
import java.security.cert.CertificateException; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.KeyManagerFactory; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 

import org.apache.commons.codec.binary.Base64; 

import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.LogManager; 
import java.util.logging.Logger; 
import java.util.logging.XMLFormatter; 
import java.util.Properties; 
import java.io.FileInputStream; 
import java.io.IOException; 


public class HTTPSClient { 
    public static void main(String[] args) { 
     try { 
      doHttpsPost("9711296535", "0.5", "0.5"); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    private static HttpsURLConnection getHTTPSConnection(String url) throws Exception{ 
     URL chargingUrl; 

     HostnameVerifier hv = new HostnameVerifier(){ 
     public boolean verify(String urlHostName, SSLSession session) { 
     System.out.println("Warning: URL Host: "+urlHostName+" vs. "+session.getPeerHost()); 
     return true; 
     } 
     }; 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     KeyStore ks; 
     HttpsURLConnection urlc=null; 
     //try { 
      chargingUrl = new URL(url); 
      ks = KeyStore.getInstance("JKS"); 
      ks.load(new FileInputStream("/vishnu/twss/keystore/KEYSTORE.jks"), "12345678".toCharArray());//Location of keystore c:\\SDPKeystore.dat,12345678 
      KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
      kmf.init(ks, "[email protected]".toCharArray()); //password is [email protected] 
      TrustManager[] tm; 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
      tmf.init(ks); 
      tm = tmf.getTrustManagers(); 
      SSLContext sslContext = SSLContext.getInstance("SSL"); 
      sslContext.init(kmf.getKeyManagers(), tm, null); 
      SSLSocketFactory sslSocketFactory =sslContext.getSocketFactory(); 
      urlc = (HttpsURLConnection) chargingUrl.openConnection(); 
      urlc.setSSLSocketFactory(sslSocketFactory); 
      //System.out.println("DoHttpPost(): Connection received"); 
      //System.out.println("DoHttpPost(): Setting UserName and Password");       
      String usernamePassword = "vishnu" + ":" + "[email protected]"; 
      String encoding = null; 

      byte[] encoded = Base64.encodeBase64(usernamePassword.getBytes()); 
      encoding = new String(encoded); 

      urlc.setRequestProperty("Authorization", "Basic " + encoding); 
      urlc.setRequestMethod("POST"); 
      urlc.setUseCaches(false); 
     return urlc; 
    } 

    public static HttpsURLConnection doHttpsPost(String msisdn, String actualPrice, String basePrice) throws MalformedURLException, Exception { 

    System.out.println("dHTTPPost(): Start"); 
    String chargingServiceURL="https://10.5.45.111:6443/sdpchargingservice/http/charge"; 
    String strResponse = ""; 
    HttpsURLConnection urlc=getHTTPSConnection(chargingServiceURL); 
    try{ 
     //get data from config file 
     Properties prop = new Properties(); 
     prop.load(new FileInputStream("/vishnu/twss/config.properties")); 

     System.out.println("HttpService :charge():Going to hit Charging Service.."); 
     Long currentMilis = System.currentTimeMillis(); 

     urlc.setRequestProperty("Keep-Alive", "300"); 
     urlc.setRequestProperty("Connection", "keep-alive"); 

     //set the keep aive in the system properties 
     System.setProperty("http.keepAlive", "true"); 
     System.setProperty("http.maxConnections", "2000"); 

     urlc.setRequestMethod("POST"); 
     urlc.setRequestProperty("SOAPAction",""); 
     urlc.setRequestProperty("Content-Type","text/xml; charset=utf-8"); 
     urlc.setDoOutput(true); 
     urlc.addRequestProperty("operation","debit"); 
     urlc.addRequestProperty("userId",msisdn); //CP to use his own msisdn 
     urlc.addRequestProperty("contentId","Exam Results"); 
     urlc.addRequestProperty("itemName","Exam Results"); 
     urlc.addRequestProperty("contentDescription", "Exam Results"+currentMilis); 
     urlc.addRequestProperty("contentMediaType","Exam Results"); 
     urlc.addRequestProperty("actualPrice",actualPrice); 
     urlc.addRequestProperty("basePrice",basePrice); 
     urlc.addRequestProperty("discountApplied","0"); 
     urlc.addRequestProperty("cpId","voicetap"); 
     urlc.addRequestProperty("eventType","Content Purchase"); 
     urlc.addRequestProperty("deliveryChannel","SMS"); 
     urlc.addRequestProperty("currency","INR"); 
     urlc.addRequestProperty("copyrightId","null"); 
     urlc.addRequestProperty("sMSkeyword","SMS"); 
     urlc.addRequestProperty("srcCode","606770"); 
     urlc.addRequestProperty("contentUrl","www.voicetap.com"); 
     urlc.addRequestProperty("copyrightDescription","Test Desc"); 
     System.out.println("going to hit service......"); 

     System.out.println(" urlc response "+urlc.getResponseMessage()); 

     try{  
      System.out.println(urlc.getHeaderField("status")); 
      String loggermsg = "MSISDN: "+prop.getProperty("userId") + 
        " Actualprice: "+prop.getProperty("actualPrice") + 
        " transactionId: "+urlc.getHeaderField("transactionId") + 
        " status: "+urlc.getHeaderField("status")+ 
        " errorCode: "+urlc.getHeaderField("errorCode")+ 
        " date: "+new java.util.Date(); 
      InputStreamReader isr = new InputStreamReader(urlc.getInputStream()); 
      BufferedReader in = new BufferedReader(isr); 
      String inputLine; 
      while ((inputLine = in.readLine()) != null){ 
      System.out.println(inputLine); 
      } 
      in.close(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("Execption raised during parsing SOAP-response :::" + e.getMessage()); 
     } 
    } 
    catch (Exception ex) { 
     ex.printStackTrace(); 
     System.out.println("Error "+ex); 
    } 
    return urlc; 
} 
} 
+0

안녕하세요 tibo & Alex K 오버플로 스택이 새로 생겼습니다. 나는 받아들이기에 대한 아이디어가 없었다. 지도 주셔서 감사합니다 – Vishnu

답변

0

HttpURLConnection은 이미 연결 풀링을 수행합니다. dispose()를 호출하는 것을 제외하고는 아무 것도 할 필요가 없습니다.

+0

감사합니다, 그럼 어떻게하면 성능을 향상시킬 수 있습니까? 다중 스레드 환경을 사용해야합니까? – Vishnu

+0

@Vishnu 제목에 질문에 답했습니다. 이것은 HttpClient에 관한 세 번째 질문과 마찬가지로 새로운 질문입니다. 너의 마음을 위로 해주세요. 질문에 사실이 표시되지 않으면 여러 URL에 연결하지 않는 한 멀티 스레딩이 도움이된다고 생각하는 이유를 모르겠습니다. – EJP

+0

귀중한 의견에 EJP에 감사드립니다. 사실 위에서 언급 한 serviceURL은 응답하는데 1.3 초가 걸렸지 만 초당 약 30-50 건의 조회가 발생합니다. 그래서 나는 그것을 처리하는 방법이 명확하지 않습니다. HttpURLConnection이 이미 연결 풀링을 수행하는 경우 멀티 스레딩이 이에 대한 해결책입니까? Plz 도와주세요 – Vishnu

관련 문제