文档章节

spring开发定时器任务示例

xiejunbo
 xiejunbo
发布于 2015/04/30 16:49
字数 691
阅读 30
收藏 0
点赞 0
评论 0

spring开发定时器任务示例:

spring.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<!-- 获取新闻触发器 -->
	<bean id="getNewsTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
	 	<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
				<property name="targetObject" ref="getNewsTask"/>
				<property name="targetMethod" value="execute"/>
				<property name="concurrent" value="false"/>
			</bean>	 	
	 	</property>
	 	<property name="cronExpression" value="0 0 0/2 * * ?"/>
	</bean>

	<!-- 采集明星数据触发器 -->
	<bean id="getStarsTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
	 	<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
				<!-- 指定目标触发器类 -->
				<property name="targetObject" ref="batchGetStarsTask"/>
				<!-- 指定目标触发器类的执行方法 -->
				<property name="targetMethod" value="execute"/>
				<!-- 是否并发执行 -->
				<property name="concurrent" value="false"/>
			</bean>	 	
	 	</property>
	 	<!-- Cron表达式指定触发时间 (定义规则:秒 分 时 日 月 周 年)-->
	 	<property name="cronExpression" value="0 0 0/3 * * ?"/>
	</bean>

	<!-- 任务调度工厂 -->
	<bean id="shedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<!-- 全部触发器放入工厂 -->
				<ref bean="getNewsTrigger"/>
				<ref bean="getStarsTrigger"/>
			</list>
		</property>
	</bean>

</beans>

触发器执行任务类1:BatchGetStarsTask.java

package org.jun.task;

import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Component;

/**
 *
 * @author xiejunbo
 * @email 624664181@qq.com
 **/
@Component
public class BatchGetStarsTask extends AbstractTask {


	public void execute(){
		batchGetStars();
	}
 
	/**
	 * 批量定时抓取明星数据
	 */
	private void batchGetStars() {
		List<String> nameList  = parserService.batchGetNames();
		int nameSize = nameList.size();
		for(int i = 0; i < nameSize; i++) {
			boolean checkResult = parserService.checkAddedStar(nameList.get(i));
			if (!checkResult) {
				String name = nameList.get(i);
				boolean result = parserService.add(name);
				System.out.println(result ? "add baike success" : "add baike fail");
			}
		}
		System.out.println("=====Java=======time:" + new Date());
	}
	
	
}

触发器执行任务类2:GetNewsTask.java

package org.jun.task;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.jun.common.Consts;
import org.jun.domain.NewsList;
import org.jun.utils.HttpClientHelper;
import org.jun.utils.UnicodeUtil;
import org.springframework.stereotype.Component;

/**
 *
 * @author xiejunbo
 * @email 624664181@qq.com
 **/
@Component
public class GetNewsTask extends AbstractTask {

	
	public void execute(){
		getNewsList();
	}
	

	/**
	 * 从一级URL返回数据中解析二级URL及文章内容
	 * @return
	 */
	public String getNewsList() {
		
		//获取新闻ID集合,组装成文章url并存入DB。(id,articleId,articleURL,createAt)
		for(int i = 0; i < Consts.News.baseUrls.length; i++){
			getUrlsByHttp(Consts.News.baseUrls[i], Consts.CHARSET, Consts.News.types[i]);
		}
		return "Complete request success!";
	}
	
	//获取新闻ID并保存
	public String getUrlsByHttp(String listUrl, String charset, String types){
		
		JSONObject content = null;
		try {
			String str = HttpClientHelper.sendRequest(listUrl, charset);
			String str2 = UnicodeUtil.unicodeDecode(str);
			content = JSONObject.fromObject(str2);
		} catch (Exception e1) {
			logger.info("[resolve json error]");
		}
		
		/*Long ret = content.getLong("ret");
		String version = content.getString("version");
		Long timestamp = content.getLong("timestamp");*/
		JSONArray idlist = null;
		try {
			idlist = content.getJSONArray("idlist");
		} catch (Exception e2) {
			logger.info("[getJSONOArray(idlist)error]");
		}
		NewsList newsList = new NewsList();
		try {
			for(int i = 0; i < idlist.size(); i++) {//第1层idlist
				JSONArray newsArray = null;
				try {
					JSONObject newslist =  idlist.getJSONObject(i);
					newsArray = newslist.getJSONArray("newslist");
				} catch (Exception e1) {
					logger.info("[Resolve newslist json error]");
				}
				for(int j = 0; j < newsArray.size(); j++) {//第2层newslist
					JSONObject news = newsArray.getJSONObject(j);
					String aid = news.getString("id");
					boolean result = parserService.checkArticle(aid);
					if( !result ){//文章不存在
						try {
							newsList.setTitle(news.getString("title"));
							newsList.setId(aid);
							newsList.setSurl(news.getString("surl"));
							newsList.setAbstracts(news.getString("abstract"));
							newsList.setTime(news.getString("time"));
							newsList.setTimestamp(news.getString("timestamp"));
							newsList.setSource(news.getString("source"));
							newsList.setThumbnails_big(news.getString("thumbnails_big"));
							newsList.setThumbnails(news.getString("thumbnails"));//大缩略图
							newsList.setTag(news.getString("tag"));//新闻标签
							newsList.setThumbnails_qqnews(news.getString("thumbnails_qqnews"));//列表左小缩略图
							newsList.setThumbnails_qqnews_photo(news.getString("thumbnails_qqnews_photo"));//列表左大缩略图
						} catch (Exception e) {
							logger.info("[JSONObject getProperties error]");
						}
						String contentUrl = newsList.getSurl(); 
						if( contentUrl != null ) {
							String htmlContent = getArticle(contentUrl);
							newsList.setContent(htmlContent);
							newsList.setTypes(types);
							boolean saveResult = parserService.saveNewsList(newsList);
							System.out.println("save news result:" + saveResult);
						}
					}
				}
			}
		} catch (Exception e) {
			logger.info("[CONTENT ERROR]");
		}
       
        //String ids = idlistJson.getString("section");
		//System.out.println("content:" + content);
		//boolean result = parserService.getSecondUrl(Consts.News.baseUrl);
		//return result ? "success" : "fail";
		
		return "success";
	}
	
	/**
	 * 获取新闻文章内容
	 * @return
	 */
	public String getArticle(String url) {
		
		try {
			String str = HttpClientHelper.sendRequest(url, Consts.CHARSET);
			return UnicodeUtil.unicodeDecode(str);
		} catch (Exception e) {
			logger.info("[TencentController.class getArticle error]");
		}
		return null;
	}
	
}


© 著作权归作者所有

共有 人打赏支持
xiejunbo
粉丝 41
博文 144
码字总数 132363
作品 0
广州
后端工程师
Spring学习——Spring MVC 中定时器实现

在一些工作需要使用到定时器,Spring很好的集成了定时器的功能! 在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且...

IT达仁 ⋅ 05/10 ⋅ 0

SpringMVC框架使用注解执行定时任务

在项目开发过程中,免不了会有一些定时任务。今天就给大家一个SpringMVC框架中利用注解的方式执行定时任务的示例代码 使用到的JAR文件: 点击下列Jar文件会跳到我的网盘下载 aopalliance-1....

Carl_ ⋅ 2015/07/23 ⋅ 0

Spring Cloud Task 2.0.0.RC1 发布,添加新功能

Spring Cloud Task 2.0.0.RC1 发布,此版本包括对现有依赖项的升级以及一些不错的新功能。 这个版本的新功能: 与Spring Cloud Stream 2.0兼容,Spring Cloud Stream 2.0在几天前发布并提供了...

周其 ⋅ 04/17 ⋅ 0

快速分布式任务开发框架 - easynetty

EasyNetty是什么? 一个基于netty封装的快速分布式任务开发框架,目标:简单,简单,再简单! EasyNetty有哪些功能? 方便的功能 封装netty服务和客户端的启动,很简单 简单的自定义协议 可快速...

GuoMengYue ⋅ 2017/12/11 ⋅ 1

spring+quartz 定时器使用

项目使用:spring+springMVC+JPA+Maven 1、在pom.xml中引用quartz的jar包 <!-- quartz --><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version......

杀丶破狼 ⋅ 2015/10/13 ⋅ 1

Spring Boot魔法的背后

Spring Boot的魔法 Spring Boot是一个基于Spring的框架,遵循“约定胜于配置”的理念,提供一套方便的方法来快速创建可执行的Spring应用。具体来说,以往我们开发一个Java Web端或服务端程序...

jacobwu ⋅ 05/10 ⋅ 0

从Spring-Session源码看Session机制的实现细节

去年我曾经写过几篇和 Spring Session 相关的文章,从一个未接触过 Spring Session 的初学者视角介绍了 Spring Session 如何上手,如果你未接触过 Spring Session,推荐先阅读下「从零开始学...

徐靖峰 ⋅ 04/20 ⋅ 0

Spring的@Scheduled注解定时任务

spring提供了@scheduled注解来实现定时任务 需要注意的几点: 1、spring的@Scheduled注解 ,需要写在实现上、 2、定时器的任务方法不能有返回值(有返回值的场景去google) 3、定时器是单线程...

金琥 ⋅ 2017/09/06 ⋅ 0

SpringMVC中定时器继承Task后无法对service注入问题

最近在做一个Spring+MyBatis的一个项目,其中用到了Redis的存储,然后遇到问题是这样的: RedisTask是通过定时器来每分钟像数据库里推送的,于是就有了 然后在定时器的任务中通过对Redis的调...

Pig-man ⋅ 2016/03/21 ⋅ 0

Springcloud各层框架注解含义

声明Bean的注解: @Component : 组件,没有明确的角色 @Service : 在业务逻辑层(service层)使用 @Repository : 在数据访问层(dao层)使用. @Controller : 在展现层(MVC--SpringMVC)使用 注入Bea...

0了凡0 ⋅ 2016/09/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 16分钟前 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 16分钟前 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 37分钟前 ⋅ 0

Spring源码解析(六)——实例创建(上)

前言 经过前期所有的准备工作,Spring已经获取到需要创建实例的 beanName 和对应创建所需要信息 BeanDefinition,接下来就是实例创建的过程,由于该过程涉及到大量源码,所以将分为多个章节进...

MarvelCode ⋅ 57分钟前 ⋅ 0

js模拟栈和队列

栈和队列 栈:LIFO(先进后出)一种数据结构 队列:LILO(先进先出)一种数据结构 使用的js方法 1.push();可以接收任意数量的参数,把它们逐个推进队尾(数组末尾),并返回修改后的数组长度。 2....

LIAOJIN1 ⋅ 今天 ⋅ 0

180619-Yaml文件语法及读写小结

Yaml文件小结 Yaml文件有自己独立的语法,常用作配置文件使用,相比较于xml和json而言,减少很多不必要的标签或者括号,阅读也更加清晰简单;本篇主要介绍下YAML文件的基本语法,以及如何在J...

小灰灰Blog ⋅ 今天 ⋅ 0

IEC60870-5-104规约传送原因

1:周期循环2:背景扫描3:自发4:初始化5:请求6:激活7:激活确认8:停止激活9:停止激活确认10:激活结束11:远程命令引起的返送信息12:当地命令引起的返送信息13:文件传送20:响应总召...

始终初心 ⋅ 今天 ⋅ 0

【图文经典版】冒泡排序

1、可视化排序过程 对{ 6, 5, 3, 1, 8, 7, 2, 4 }进行冒泡排序的可视化动态过程如下 2、代码实现    public void contextLoads() {// 冒泡排序int[] a = { 6, 5, 3, 1, 8, 7, 2, ...

pocher ⋅ 今天 ⋅ 0

ORA-12537 TNS-12560 TNS-00530 ora-609解决

oracle 11g不能连接,卡住,ORA-12537 TNS-12560 TNS-00530 TNS-12502 tns-12505 ora-609 Windows Error: 54: Unknown error 解决方案。 今天折腾了一下午,为了查这个问题。。找了N多方案,...

lanybass ⋅ 今天 ⋅ 0

IDEA反向映射Mybatis

1.首先在pom文件的plugins中添加maven对mybatis-generator插件的支持 ` <!-- mybatis逆向工程 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-ma......

lichengyou20 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部