别名:在已有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方法提供给项目中另外地方触发调用,用来往队列中存放一个元素(实际是一个用户名的字符串)。
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);
}
}