`

java并发发送请求的示例

    博客分类:
  • java
 
阅读更多

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import org.apache.log4j.Logger;


public class ConcurrentRuleSyncUtil {

	private static final int MAX_THREAD = 10;  //最多启动的线程数

	private static final ExecutorService exec = Executors.newFixedThreadPool(MAX_THREAD);
	
	private static final Logger logger = Logger.getLogger(ConcurrentRuleSyncUtil.class);

	/**
	 * 并发来主动通知所有应用来更新规则 最多启动
	 * 
	 * @param strUrl
	 *            需要通知的应用ip列表
	 * @return
	 */
	public static List<String> activeAppList(List<String> strUrl, String queryString) {
		if (strUrl == null || strUrl.size() == 0) {
			return null;
		}
		List<Callable<List<String>>> runThreads = GeneralThreadInfo(strUrl,queryString);
		List<String> resList = new ArrayList<String>();
		try {
			List<Future<List<String>>> fetures = exec.invokeAll(runThreads);
			for(Future<List<String>> feture: fetures){
				List<String> tmp = null;
				try {
					tmp = feture.get();
				} catch (ExecutionException e) {
					logger.error("ConcurrentRuleSyncUtil thread activeAppList get error:" + e.getMessage(), e);
				}
				if(tmp != null){
					resList.addAll(tmp);
				}
			}
		} catch (InterruptedException e) {
			logger.error("ConcurrentRuleSyncUtil activeAppList get error:" + e.getMessage(), e);
		}
		return resList;
	}

	public static List<Callable<List<String>>> GeneralThreadInfo(List<String> strUrl, String queryString) {
		List<Callable<List<String>>> runThreads = new ArrayList<Callable<List<String>>>();
		int size = strUrl.size() / MAX_THREAD + 1;
		int i = 0;
		int len = strUrl.size();
		for(; i + size <= len; i += size){
			runThreads.add(new ActiveSyncThread(strUrl.subList(i, i + size), queryString));
		}
		if(i < len){
			runThreads.add(new ActiveSyncThread(strUrl.subList(i,len), queryString));	
		}
		return runThreads;
	}
	
	static class ActiveSyncThread  implements Callable<List<String>>{

		private List<String> hostlistUrl;  //分配到当前线程的host列表
		private String queryString;  //参数串
		
		public ActiveSyncThread(List<String> strUrl, String queryString){
			this.hostlistUrl = strUrl;
			this.queryString = queryString;
		}		

		@Override
		public List<String> call() throws Exception {
			return getResponseText(hostlistUrl+queryString);
		}
		
	}
/**
	 * 根据绑定去查询绑定地址的url html,HttpUrlConnection调用方式
	 * 
	 * @param url
	 *            查询的url
	 * @throws IOException
	 */
	public static String getResponseText(String queryUrl) {
		return getResponseText(queryUrl, null, null);
	}
	/**
	 * 根据绑定去查询绑定地址的url html,HttpUrlConnection调用方式
	 * 
	 * @param url
	 *            查询的url
	 * @param host
	 *            需要绑定的host
	 * @param ip
	 *            对应host绑定的ip
	 * @throws IOException
	 */
	public static String getResponseText(String queryUrl,String host,String ip) {
		InputStream is = null;
		BufferedReader br = null;
		StringBuffer res = new StringBuffer();
		try {
			HttpURLConnection httpUrlConn = null;
			URL url = new URL(queryUrl);
			if(ip!=null){
			    String str[] = ip.split("\\.");
			    byte[] b =new byte[str.length];
			    for(int i=0,len=str.length;i<len;i++){
			        b[i] = (byte)(Integer.parseInt(str[i],10));
			    }
	            Proxy proxy = new Proxy(Proxy.Type.HTTP,
	            new InetSocketAddress(InetAddress.getByAddress(b), 80));
	            httpUrlConn = (HttpURLConnection) url
                .openConnection(proxy);
			}else{
	            httpUrlConn = (HttpURLConnection) url
	                    .openConnection();
			}
			httpUrlConn.setRequestMethod("GET");
			httpUrlConn.setDoOutput(true);
			httpUrlConn.setConnectTimeout(DEFAULT_TIMEOUT);
			httpUrlConn.setReadTimeout(DEFAULT_TIMEOUT);
			httpUrlConn.setDefaultUseCaches(false);
			httpUrlConn.setUseCaches(false);

			is = httpUrlConn.getInputStream();

			int responseCode = httpUrlConn.getResponseCode();
			// 如果返回的结果是400以上,那么就说明出问题了
			if (responseCode > 400) {
				logger.error("getResponseText for queryurl:" + queryUrl + " got responseCode :" + responseCode);
				return "getResponseText for queryurl:" + queryUrl + " got responseCode :" + responseCode;
			}
			// 需要自动识别页面的编码,通过从context-type中解析得到,默认为UTF-8
			String encoding = "UTF-8";
			String contextType = httpUrlConn.getContentType();
			if (StringUtilsExt.isNotBlank(contextType)) {
				int pos = contextType.lastIndexOf("=");
				if (pos > -1) {
					encoding = contextType.substring(pos + 1);
				}
			}
			// System.out.println(encoding);

			br = new BufferedReader(new InputStreamReader(is, encoding));

			String data = null;
			while ((data = br.readLine()) != null) {
				res.append(data + "\n");
			}
			return res.toString();

		} catch (IOException e) {
            logger.error(e.getMessage(), e);
            return "failed: " + e.getMessage();
		} catch (Exception e) {
		    logger.error(e.getMessage(), e);
		    return "failed: " + e.getMessage();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
		            logger.error(e.getMessage(), e);
		            res.append(e.getMessage());
				}
			}
		}
	}
}
 
分享到:
评论

相关推荐

    Java Https工具类,Java Https Post请求

    - 对于大量并发请求,可以使用线程池和连接池来提高效率。 8. **使用示例**: ```java Map, String&gt; params = new HashMap(); params.put("key1", "value1"); params.put("key2", "value2"); String response...

    5_EBS系统Java并发请求开发方案.docx

    ### Java并发请求开发方案 #### 概述 随着企业信息化程度的提高,EBS系统作为企业资源规划(ERP)中的重要组成部分,在业务流程自动化、数据分析等方面发挥着关键作用。为了进一步增强EBS系统的功能和灵活性,引入...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程

    假设有一个电商平台,在双11期间需要处理大量用户的并发请求。可以通过以下几种方式来提升系统的并发能力: - **采用分布式架构**:将系统拆分为多个微服务,每个服务独立部署,根据负载情况进行水平扩展。 - **...

    java并发编程.docx

    Java并发编程是Java开发中的重要领域,涉及到多线程、线程池以及线程局部变量等概念。在大型系统和高并发环境下,合理地利用这些技术可以极大地提高系统的性能和资源利用率。 一、线程池 线程池是Java并发编程中的...

    Java_socket 通信示例(Java源码)

    在Java Socket通信中,服务端通常会创建一个ServerSocket对象,监听指定端口上的连接请求。一旦有客户端发起连接,ServerSocket就会接受连接并返回一个新的Socket对象,用于与客户端进行数据交换。在客户端,我们会...

    http并发访问 java源码

    1. **线程池**:为了处理多个并发请求,我们需要使用线程池来管理和调度线程。Java的`ExecutorService`和`ThreadPoolExecutor`类是实现这一目标的常用工具。线程池可以有效地控制运行的线程数量,避免过多的线程创建...

    Java并发编程示例(三):线程中断

    Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...

    java并发编程与高并发解决方案

    在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...

    Java BIO Socke示例

    通过这些示例,你可以更深入地理解Java BIO Socket通信以及如何使用线程池来优化并发性能。不过,实际生产环境中,通常会使用NIO(非阻塞I/O)或更高级的异步I/O模型如AIO,因为它们在处理大量并发连接时表现得更为...

    Java网络编程示例代码

    首先,多线程编程示例代码展示了如何在Java中处理并发任务。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。这些示例可能包含并发控制(如synchronized关键字,Lock接口),线程池的使用...

    Java实现发送Http请求.doc

    - 并发处理:如果需要同时发送多个请求,可以考虑使用线程池或异步编程模型。 - 重试机制:在遇到网络不稳定时,可以设计重试策略以提高成功率。 通过以上知识点,你可以构建一个功能完善的Java HTTP客户端,用于与...

    java实现http请求以及解析json与java对象转换 项目源代码实例

    - 异步请求:可能使用了Java的并发库或ExecutorService来处理异步HTTP请求。 通过这个项目源代码实例,你可以学习到如何在实际项目中使用Java进行HTTP通信和JSON操作,并将理论知识应用到实践中,提升你的编程技能...

    java高并发秒杀api源码

    这个"java高并发秒杀api源码"很可能是一个实现这类功能的示例项目,它结合了Spring和MyBatis两大主流框架,以提升系统性能和可维护性。下面,我们将深入探讨这些关键知识点。 首先,`Spring`是一个全面的企业级应用...

    Java爬虫代码示例.rar

    例如,Java的ExecutorService可以创建线程池,处理多个并发请求。 5. **网页状态管理**:登录、cookie和session管理对于访问需要登录权限或者有会话状态的网站至关重要。Java的HttpURLConnection或HttpClient库都能...

    cmpp2.0短信网关发送短信代码(java)

    Java代码实现这部分功能时,通常会用到Socket编程来处理TCP连接,以及多线程技术来处理并发请求。 在描述中提到的JAVA代码,应该包含了创建CMPP连接、登录验证、发送短信、接收应答和关闭连接等关键步骤。这部分...

    Android 下soap线程池并发请求

    本篇文章将详细讲解如何在Android环境下实现SOAP线程池并发请求,以提高应用性能和用户体验。 一、SOAP基础 SOAP是基于XML的协议,它允许服务提供商和消费者通过HTTP、SMTP等传输协议进行通信。在Android中,我们...

    java短信接口代码示例

    Java短信接口代码示例主要涉及的是在Java编程环境中如何与短信服务提供商进行通信,以便实现发送短信、尤其是发送验证码的功能。这个示例通常包括以下几个关键知识点: 1. **HTTP请求库**:Java中常见的用于发送...

    java 多线程示例

    Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...

    java中发送http包,包含get及post请求

    以下是一个使用内置库的POST请求示例: ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class ...

    java发送JSON格式的http通讯的post请求

    使用Jackson库将Java对象转换为JSON字符串,并将其作为请求体发送。 以下是一个示例代码片段: ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; ...

Global site tag (gtag.js) - Google Analytics