我需要使用多线程环境实现HTTP连接池。我正在使用下面提到的代码。提到的服务URL大约需要1-3秒才能响应,但是我从客户端每秒获得大约30-50次点击。我需要点击具有不同属性的单个 URL。所以我不清楚,我应该怎么做才能响应所有点击(30-40 次点击/秒)。如果HttpURLConnection已经进行了连接池,那么多线程是它的解决方案。
我尝试使用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, "airtel@123".toCharArray()); //password is airtel@123
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" + ":" + "air@123";
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;
}
}
HttpURLConnection 已经执行了连接池。除了避免调用 dispose() 之外,您不必对此执行任何操作。