JobSetter.java 4.1 KB
Newer Older
T
Tom Qian 已提交
1 2
package top.qianxinyao.Main;

T
sth new  
Tom Qian 已提交
3
import java.util.Date;
T
Tom Qian 已提交
4 5 6 7 8 9 10 11 12 13 14
import java.util.List;

import org.apache.log4j.Logger;
import org.quartz.SchedulerException;

import top.qianxinyao.UserBasedCollaborativeRecommender.MahoutUserBasedCollaborativeRecommender;
import top.qianxinyao.UserBasedCollaborativeRecommender.quartz.CFCronTriggerRunner;
import top.qianxinyao.algorithms.PropGetKit;
import top.qianxinyao.algorithms.RecommendKit;
import top.qianxinyao.contentbasedrecommend.ContentBasedRecommender;
import top.qianxinyao.contentbasedrecommend.quartz.CBCronTriggerRunner;
T
sth new  
Tom Qian 已提交
15
import top.qianxinyao.dbconnection.DBKit;
T
Tom Qian 已提交
16 17 18 19 20 21 22 23
import top.qianxinyao.hotrecommend.HotRecommender;
import top.qianxinyao.hotrecommend.quartz.HRCronTriggerRunner;

/**
 * @author Tom Qian
 * @email tomqianmaple@outlook.com
 * @github https://github.com/bluemapleman
 * @date 2017年12月11日
T
sth new  
Tom Qian 已提交
24
 * 设定/启动推荐任务的类
T
Tom Qian 已提交
25 26 27 28 29 30
 */
public class JobSetter
{
	
	public static final Logger logger=Logger.getLogger(JobSetter.class);
	
T
sth new  
Tom Qian 已提交
31 32
	boolean enableCF,enableCB,enableHR;
	
T
Tom Qian 已提交
33
	/**
T
sth new  
Tom Qian 已提交
34 35 36 37
	 * 
	 * @param enableCF 是否启用协同过滤(Collaborative Filtering)
	 * @param enableCB 是否启用基于内容的推荐(Content-Based Recommendation)
	 * @param enableHR 是否启用热点新闻推荐(Hot News Recommendation)
T
Tom Qian 已提交
38
	 */
T
sth new  
Tom Qian 已提交
39
	public JobSetter(boolean enableCF,boolean enableCB,boolean enableHR) {
T
Tom Qian 已提交
40 41
		//加载系统配置文件
		PropGetKit.loadProperties("paraConfig");
T
sth new  
Tom Qian 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55
		//初始化操作:主要是数据库的连接
		DBKit.initalize();
		this.enableCF=enableCF;
		this.enableCB=enableCB;
		this.enableHR=enableHR;
	}
	
	
	/**
	 * 使用Quartz的表达式进行时间设定(默认为每天0点开始工作),详情请参照:http://www.quartz-scheduler.org/api/2.2.1/index.html(CronExpression)
	 * 当启用该方法时,推荐系统可以保持运行,直到被强制关闭。
	 * @param userList
	 */
	private void executeQuartzJob(List<Long> userList) {
T
Tom Qian 已提交
56 57 58 59 60
		//设定推荐任务每天的执行时间
		String cronExpression=PropGetKit.getString("startAt");
		
		try
		{
T
sth new  
Tom Qian 已提交
61 62 63 64 65 66
			if(enableCF)
				new CFCronTriggerRunner().task(userList,cronExpression);
			if(enableCB)
				new CBCronTriggerRunner().task(userList,cronExpression);
			if(enableHR)
				new HRCronTriggerRunner().task(userList,cronExpression);
T
Tom Qian 已提交
67 68 69 70 71
		}
		catch (SchedulerException e)
		{
			e.printStackTrace();
		}
T
sth new  
Tom Qian 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
		System.out.println("本次推荐结束于"+new Date());
	}
	
	
	/**
	 * 为指定用户执行定时新闻推荐
	 * @param goalUserList 目标用户的id列表
	 */
	public void executeQuartzJobForCertainUsers(List<Long> goalUserList) {
		executeQuartzJob(goalUserList);
	}
	
	/**
	 * 为所有用户执行定时新闻推荐
	 */
	public void executeQuartzJobForAllUsers() {
		executeQuartzJob(RecommendKit.getAllUsers());
	}
	
	/**
	 * 为活跃用户进行定时新闻推荐。
	 * @param goalUserList
	 */
	public void executeQuartzJobForActiveUsers() {
		executeQuartzJob(RecommendKit.getActiveUsers());
T
Tom Qian 已提交
97 98
	}
	
T
sth new  
Tom Qian 已提交
99
	
T
Tom Qian 已提交
100 101 102 103 104
	/**
	 * 执行一次新闻推荐
	 * 参数forActiveUsers表示是否只针对活跃用户进行新闻推荐,true为是,false为否。
	 * @param forActiveUsers
	 */
T
sth new  
Tom Qian 已提交
105 106
	private void executeInstantJob(List<Long> userIDList) {
		//让热点新闻推荐器预先生成今日的热点新闻
T
Tom Qian 已提交
107 108
		HotRecommender.formTodayTopHotNewsList();
		
T
sth new  
Tom Qian 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
		if(enableCF)
			new MahoutUserBasedCollaborativeRecommender().recommend(userIDList);
		if(enableCB)
			new ContentBasedRecommender().recommend(userIDList);
		if(enableHR)
			new HotRecommender().recommend(userIDList);
		
		System.out.println("本次推荐结束于"+new Date());
	}
	
	/**
	 * 执行一次新闻推荐
	 * 参数forActiveUsers表示是否只针对活跃用户进行新闻推荐,true为是,false为否。
	 * @param forActiveUsers
	 */
	public void executeInstantJobForCertainUsers(List<Long> goalUserList) {
		executeInstantJob(goalUserList);
	}
	
	/**
	 * 为所用有用户执行一次新闻推荐
	 */
	public void executeInstantJobForAllUsers() {
		executeInstantJob(RecommendKit.getAllUsers());
	}
	
	/**
	 * 为活跃用户进行一次推荐。
	 * @param goalUserList
	 */
	public void executeInstantJobForActiveUsers() {
		executeInstantJob(RecommendKit.getActiveUsers());
T
Tom Qian 已提交
141 142 143
	}
}