利用生产者消费者模式实现HTTP接口的异步调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/IUPRG/article/details/77854714

别名:在已有spring配置文件的项目中手动再配置一个工具类-且需要指定生命周期方法

参阅  spring生命周期 http://www.cnblogs.com/zrtqsk/p/3735273.html


spring applicationContext.xml中配置

...

...

 <bean id="sychroTasksUtils" class="com.tsb.cas.sychroLoginInfo.SychroTasksUtils"
     p:auditService-ref="auditService" init-method="init" lazy-init="false" />

...

注:auditService是本工具类要依赖的另外一个service(主要实现了数据库查询的操作)

...

说明:本工具类要求在项目启动时就加载init方法,在该方法中初始化阻塞队列以及任务对象,本类中的cosumer方法已经被初始化执行(内部启动一个消费线程,时刻从队列中取元素,来完成 第三方的同步请求),而 producer方法提供给项目中另外地方触发调用,用来往队列中存放一个元素(实际是一个用户名的字符串)。

扫描二维码关注公众号,回复: 5919576 查看本文章


public  class SychroTasksUtils {
	//构造一个全局的线程池
	public static  ExecutorService sychroTasksExecutorPool = null;
	public static SychroTasks sychroTasks = null;
	private AuditService auditService; 
	
	 
	public void setAuditService(AuditService auditService) {
		this.auditService = auditService;
	}
	
	public void init(){
		try {
			
			sychroTasksExecutorPool = Executors.newCachedThreadPool();
			//创建【同步登陆信息给】的主任务池
			System.out.println("实例化一个【同步登陆信息给】的任务池...");
			sychroTasks = new SychroTasks();
			System.out.println("注入的 auditService..." + this.auditService); 		
			 //启动消费者线程
			System.out.println("启动一个【同步登陆信息给】的消费者线程...");
			cosumer(sychroTasks,auditService);	
			 
		} catch (BeansException e) {
			 
			e.printStackTrace();
		} 
	}
	
	 
	/**
	 * 启动消费同步任务
	 * @param executorPool
	 * @param sychroTasks
	 * @param auditService
	 */
	public static void cosumer(SychroTasks sychroTasks,AuditService auditService){
		//启动消费者线程
		SychroCosumer sychroCosumer = new SychroCosumer(sychroTasks, auditService);
		Thread aThread = new Thread(sychroCosumer);
		aThread.start();
		 
	}
	/**
	 * 生成一个同步任务
	 * @param executorPool
	 * @param sychroTasks
	 */
	public static void producer(SychroTasks sychroTasks,String  taskString){
		//启动生产者线程
		SychroProducer sychroProducer = new SychroProducer(sychroTasks,taskString);
		sychroTasksExecutorPool.submit(sychroProducer);
	}

}


消费者线程:

public class SychroCosumer implements Runnable {

	/**【同步登陆信息给】的任务池*/
	private SychroTasks tasks;
	/**查询登陆用户信息的服务*/
	private AuditService auditService;

	/**构造器*/
	public SychroCosumer(SychroTasks task, AuditService auditService) {
		super();
		this.tasks = task;
		this.auditService = auditService;
		
	}

	@Override
	public void run() {
		
		try{
		     while(true){
			  String taskstring = tasks.getTask();
			  if (taskstring!=null){
			   System.out.println("【同步登陆信息给】的消费者线程:" + Thread.currentThread().getId() +",取出一个任务:" + taskstring);
			   handler(taskstring);
			  }
			  Thread.sleep(50);
		     }
		 
		}catch (InterruptedException e) {
			e.printStackTrace();
		}
         
	}
	
	private void handler(String username) {
		
		//同步登陆信息给
		//判断 平台的 开关:只有符合平台才触发
		 if (ISchoolConstants.CAS_TITLE.indexOf("aaa")>=0||ISchoolConstants.DOMAIN_URL.equals("http://xxx")){
			//获取用户信息
			 System.out.println("【同步登陆信息给】的消费者线程:" + Thread.currentThread().getId() +",开始处理任务:" + username);
				UserBeanForLc userBeanForLc = this.auditService.queryUserInfo(username);
				if (userBeanForLc!=null){
					String loingType = "1";
					if (!org.apache.commons.lang.StringUtils.isEmpty(userBeanForLc.getOccupations())){
						if (userBeanForLc.getOccupations().substring(0,1).equals("1")){
							loingType = "1";//老师
						}else if (userBeanForLc.getOccupations().substring(1,2).equals("1")) {
							loingType = "2";//学生
						}else if (userBeanForLc.getOccupations().substring(2,3).equals("1")) {
							loingType = "3"; //家长
						}
					}
					sycLoginToLC(username,userBeanForLc.getMobileNo(),loingType);	
				} 
			System.out.println("【同步登陆信息给】的消费者线程:" + Thread.currentThread().getId() +",结束处理任务:" + username);	
		}
	};
	
	/**
	 * 同步登陆信息给【发送http请求】
	 * @param loginID
	 * @param mobile
	 * @param loginType
	 */
	private void sycLoginToLC(String loginID,String mobile,String loginType){
		Map<String, String> map = new HashMap<String, String>();
		map.put("LoginID", loginID);//用户登录帐号。用户登录时填写的帐号名称。
		//用户手机号。用户实际的手机号码。
		//教师– 教师的手机号码
		//学生– 学生的手机号码或家长的手机号码或空
		//家长– 家长的手机号
		map.put("MobileCode", mobile==null?"":mobile);
		map.put("LoginType", loginType);//登录人员类型 1 教师 2学生身份3 家长身份不为空
		map.put("DevType", "Pc");//触发规则:Pc、apk或ios
		PCLoginSyscInfo.mobiledatainfo(map);
	}

}


生产者线程:

public class SychroProducer implements Runnable {
	/**【同步登陆信息给】的任务池*/
	private SychroTasks tasks;
	private String taskString;
	
	public SychroProducer(SychroTasks tasks,String taskString) {
		super();
		this.tasks = tasks;
		this.taskString = taskString;
	}

	@Override
	public void run() {
		tasks.putTask(taskString);

	}

}


猜你喜欢

转载自blog.csdn.net/IUPRG/article/details/77854714