需求,定时查询表数据,生成表格,发送给员工,
相关技术 : quartz freemark

  • Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.0。
  • FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构生成动态网页。但是,它是一个通用的模板引擎,不依赖于servlets或HTTP或HTML,因此它通常用于生成源代码,配置文件或电子邮件。FreeMarker是自由软件。

    下面是我的疑惑,也许你们也遇到了,为什么要学quartz框架,应用场景有哪些?

应用场景一

 更新静态数据,需求,存入redis的菜单数据每隔1小时就需要更新一次,(当时主要出于两个原因:一、项目开发的时间比较紧,二、使用quartz拓展性比较好,维护起来比较方便)。

### 应用场景二
自动结账
oo 因为涉及到支付,如果学员在上完课之后,没有结课的话,这部分钱就永远是讲师的带收入而不是收入。显然这是不合理的,所以就需要一个自动结账的过程。类似于咱们在淘宝上购物如果我们不确认收货,也会默认一个时间段,如果超过这个时间段也会自动结账。

### 应用场景三
解决服务器压力,我们可以把一些数据操作放在晚上执行,错过流量高峰期,这也是本章选择使用quartz框架的原因之一,

开始代码(采用ssh技术)maven工程

导入pom文件

  <!-- 权限控制 框架 --><dependencies><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><dependency><groupId>pinyin4j</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>${shiro.version}</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.18.1-GA</version><exclusions><exclusion><artifactId>javassist</artifactId><groupId>javassist</groupId></exclusion></exclusions></dependency><!-- spring 框架 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- spring data jpa 数据库持久层 --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>${springdatajpa.version}</version></dependency><!-- 消息队列 MQ --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>${activemq.version}</version></dependency><!-- struts2 框架 --><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>${struts2.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId><version>${struts2.version}</version></dependency><!-- hibernate 框架 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>${struts2.version}</version></dependency><!-- 数据库连接池 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>${c3p0.version}</version></dependency><!-- 日志框架 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- 工具包 --><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>${springdataredis.version}</version></dependency><!-- oracle数据库驱动,需要手动安装 --><!-- <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId><version>11.2.0.1.0</version> </dependency> --><dependency><groupId>com.oracle</groupId><artifactId>ojdbc14</artifactId><version>10.2.0.1.0</version></dependency><!-- Excel解析工具类 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>${poi.version}</version></dependency><!-- Servlet、JSP --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!-- 导入webservice依赖 --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxrs</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-client</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-extension-providers</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency><dependency><groupId>org.codehaus.jettison</groupId><artifactId>jettison</artifactId><version>1.3.7</version></dependency><!-- 对象转为json 工具包 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.37</version></dependency><dependency><groupId>com.colobu</groupId><artifactId>fastjson-jaxrs-json-provider</artifactId><version>0.3.1</version></dependency><!-- 引入json-lib的依赖 --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version></dependency><!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version></dependency><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${jedis.version}</version><scope>compile</scope></dependency><!-- 缓存 --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.11</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.apache.xbean</groupId><artifactId>xbean-spring</artifactId><version>4.2</version></dependency></dependencies><properties><spring.version>4.2.4.RELEASE</spring.version><struts2.version>2.3.24</struts2.version><hibernate.version>5.0.7.Final</hibernate.version><slf4j.version>1.6.6</slf4j.version><springdataredis.version>1.4.1.RELEASE</springdataredis.version><activemq.version>5.2.0</activemq.version><shiro.version>1.2.2</shiro.version><springdatajpa.version>1.10.4.RELEASE</springdatajpa.version><jedis.version>2.6.2</jedis.version><poi.version>3.11</poi.version><c3p0.version>0.9.1.2</c3p0.version><cxf.version>3.0.1</cxf.version><servlet.version>2.5</servlet.version><junit.version>4.11</junit.version><!-- 文件拷贝时的编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 编译时的编码 --><maven.compiler.encoding>UTF-8</maven.compiler.encoding></properties>

编写xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><filter><filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts</filter-name><url-pattern>*.action</url-pattern></filter-mapping><!--配置spring监听器--><!-- 配置spring框架的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 指定spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param></web-app>

配置spring配置文件

<?xml version="1.0" encoding="UTF-8"?><!-- @version $Id: applicationContext.xml 561608 2007-08-01 00:33:12Z vgritsenko $ -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:task="http://www.springframework.org/schema/task"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><!--配置quartz定时框架--><!--配置定时任务--><bean id="timer" class="cn.demo.web.timer.SendWorkBill"></bean><!-- 将自定义job放入MethodInvokingJobDetailFactoryBean --><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 注入自定义类 --><property name="targetObject" ref="timer"></property><!-- 注入自定义类的方法 --><property name="targetMethod" value="sendEmail"></property></bean><!-- 配置触发器  --><bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"></property><!-- 配置什么时间运行具体的job  每隔5秒钟运行一次任务 cron表达式--><property name="cronExpression" value="0/30 * * * * ?"></property></bean><!-- 配置计划调度器容器 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><!-- 配置触发器 --><property name="triggers"><!--可以配置多个--><list><ref bean="myTrigger"/></list></property></bean><!--开启注解扫描--><context:component-scan base-package="cn.demo.web,cn.demo.service"/><!-- 整合 spring data jpa --><jpa:repositories base-package="cn.demo.dao" /><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!--连接池--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/><property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.129.100:1521:orcl"/><property name="user" value="xiaoyang"/><property name="password" value="xy123"/></bean><!--spring 跟 jpa整合--><!--配置factory--><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource"/><!--包扫描--><property name="packagesToScan" value="cn.demo.domain"/><!--持久层使用hibernate框架--><property name="persistenceProvider" ><bean class="org.hibernate.ejb.HibernatePersistence"/></property><property name="jpaVendorAdapter"><!-- 自动建表 --><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="showSql" value="true"/><property name="generateDdl" value="true"/><property name="database" value="ORACLE"/><!--其实就是数据库方言--><property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect"/></bean></property><property name="jpaDialect"><!--hql hqpl--><bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/></property></bean>

自定义freemark模板

<html>
<head><title>工单</title>
</head>
<body><table><tr><th>编号</th><th>备注</th><th>追单次数</th></tr><#list workBills as bill><tr><td>${bill.id}</td><td>${bill.remark}</td><td>${bill.attachbilltimes}</td></tr></#list></table>
</body>
</html>

文件目录结构(WorkBill.ftl是模板)

编写定时器类,需要放在cn.demo.web.timer包下面,名字必须是
SendWorkBill,因为我们之前设置了,当然你也可以改,

public class SendWorkBill {@Resourceprivate IWorkBillDaoService workBillDaoService;public void sendEmail() throws IOException, TemplateException {//查询数据List<WorkBill> workBills = workBillDaoService.findAll();if(workBills != null){Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);//设置数据源
//cfg.setDirectoryForTemplateLoading(new File(this.getClass().getResource("/").getPath()+"/templates"));//编码cfg.setDefaultEncoding("UTF-8");// 创建一个数据模型Map root = new HashMap();root.put("workBills",workBills);StringWriter stringWriter = new StringWriter();//获取模板Template template = cfg.getTemplate("WorkBill.ftl");//整合数据template.process(root, stringWriter);System.out.println(stringWriter.toString());}}
}

运行结果如下,

只要把最后一句syso换成发送邮箱的代码就ok啦,这里提供一个邮箱工具类给大家

public class MailUtils {public static String activeUrl = "http://localhost:8082/bos_fore/customerAction_activeMail";public static void sendMail(String subject, String content, String to) {Properties pps = new Properties();InputStream email = MailUtils.class.getResourceAsStream("/email.properties");if (null == email) {System.err.println("邮箱配置文件(email.properties)不存在!");return;}try {pps.load(email);} catch (IOException e1) {e1.printStackTrace();}String address = pps.getProperty("address");String password = pps.getProperty("password");String smtp_host = "smtp." + address.replaceAll(".*@(.*)", "$1");Properties props = new Properties();props.setProperty("mail.smtp.host", smtp_host);props.setProperty("mail.transport.protocol", "smtp");props.setProperty("mail.smtp.auth", "true");if ("smtp.qq.com".equals(smtp_host)) {MailSSLSocketFactory sslFactory = null;try {sslFactory = new MailSSLSocketFactory();} catch (GeneralSecurityException e) {e.printStackTrace();}sslFactory.setTrustAllHosts(true);props.put("mail.smtp.ssl.socketFactory", sslFactory);props.put("mail.smtp.ssl.enable", "true");}Session session = Session.getInstance(props);Message message = new MimeMessage(session);try {message.setFrom(new InternetAddress(address));message.setRecipient(RecipientType.TO, new InternetAddress(to));message.setSubject(subject);message.setContent(content, "text/html;charset=utf-8");Transport transport = session.getTransport();transport.connect(smtp_host, address, password);transport.sendMessage(message, message.getAllRecipients());} catch (Exception e) {e.printStackTrace();throw new RuntimeException("邮件发送失败...");}}public static void main(String[] args) {sendMail("Hello World_itcast", "你好,读者", "00000@qq.com");}
}

使用该工具类,需要导入jar包

     <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version></dependency>

创建一个properties文件,放在resources目录下

内容如下
password=skaznlipqeicpebi   //授权码....
address=1039191520@qq.com     //邮箱账号... QQ是我的,有问题的话可以加我

最后是使用

  MailUtils.sendMail("至员工的一封信.....",stringWriter.toString(),"1039191520@qq.com");/*这里的邮箱账号是收件人的邮箱账号,stringWriter.toString() 是内容,,至员工的一封信.....是标题*/

今天的东西就讲到这里,freemark我也没研究透,有机会好好分享一回

freemark模板框架+quartz定时框架入门学习(面向百度编程)相关推荐

  1. SpringBoot——Quartz定时框架的使用详解和总结

    关注微信公众号:CodingTechWork,一起学习进步. 引言   一般在使用定时任务时,我们首先会想到使用@Scheduled注解去给某个任务设置定时时间进行定时执行.当定时任务过多时,或者有增 ...

  2. Quartz定时框架CronTrigger开发使用实例

    Quartz定时框架CronTrigger开发使用 public class HelloJob implements Job {public void execute(JobExecutionCont ...

  3. SSH框架相关准备与入门学习

    最近开始学习java web开发,记录一下学习的过程. 主要分为三个步骤: 1.基础:java.Mysql入门学习. 2.中级:html.css.javascipt.servlet.jsp入门学习,推 ...

  4. 零基础入门python小甲鱼-小甲鱼零基础入门学习Python百度云下载 | 宅男君

    Python编程语言可以在不同平台上使用,比如Windows.MAC.Linux操作系统.通常情况下,一个Python程序在你自己的Windows系统上运行,也可以在别人的MAC系统上运行.Pytho ...

  5. python零基础入门教程百度云-小甲鱼零基础入门学习Python百度云下载 | 宅男君

    Python编程语言可以在不同平台上使用,比如Windows.MAC.Linux操作系统.通常情况下,一个Python程序在你自己的Windows系统上运行,也可以在别人的MAC系统上运行.Pytho ...

  6. Spring in Action 入门之面向切面编程AOP

    注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...

  7. Arduino 开发入门 学习笔记 Arduino编程基础

    11月2日至5日 事务缠身 11月6日 继续坚持 Arduino语言 其实是基于C/C++的嵌入式设备开发框架,核心库文件提供的API使传统开发方式中各个寄存器的意义以及寄存器配置过程变得透明. 增强 ...

  8. Java项目框架搭建系列(Java学习路线)-博客提纲 (转自一位技术大佬)

    前言: 已经毕业两年,真是时间飞逝. 其实当你在一间公司工作一两年之后,公司用到的开发框架的基本使用你应该都会了. 你会根据一个现有项目A复制一下搭建出另外一个类似框架的项目B,然后在项目B上进行业务 ...

  9. OpenGLGLUT入门学习

    本文为转载,原文出处:OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的? ...

最新文章

  1. 分区文件http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html
  2. python写web自动化_Web接口开发与自动化测试——基于Python语言
  3. 【渝粤教育】10259k2_经济学基础_21秋考试
  4. 激光器安规详细解读 - 一级 - 并以940波长为例
  5. 年底设计师少不了礼品VIP活动设计,高端轻奢感尽显品味
  6. sf | 空间矢量对象的几何信息处理方法
  7. 树——二叉树的深层特性
  8. python升级版本后出现的yum错误
  9. docker工作原理、组成部分、特点优点
  10. 白盒测试哪种测试效果好_比较常用的白盒测试工具有哪些?
  11. 2020年日历电子版(打印版)_2020年日历表(带农历)下载-2020年日历全年表Excel打印版下载 - 欧普软件园...
  12. cad打开卡死_AutoCAD程序启动就卡死的修复工具(解决CAD启动卡死不动)V2.00 修正版...
  13. 伦斯勒理工学院计算机科学专业强吗,伦斯勒理工学院专业排名一览及最强专业推荐(USNEWS美国大学排名)...
  14. 软件构造LAB1的一些思考
  15. 关于增量学习的一点总结思考
  16. Android实现拨打电话
  17. Kmeans实现数据聚类
  18. oracle em错误,em使用错误,求建议
  19. Hibernate之QBE--》用语法函数表示sql语句【个人感觉此技术相当之垃圾,反其正道而行】(二十八)
  20. python pymysql 如何输出 json 字符串

热门文章

  1. centos7 部署 dzzoffice2.02
  2. 慕课数据挖掘与python实践答案_中国大学MOOC慕课_数据挖掘与python实践_答案公众号...
  3. 常见的交互式分析(Interactive Analytics)和开发工具
  4. 初始化器 java_来说说Java中的实例初始化器
  5. REALTEK ALC5628音频编码器芯片参数说明
  6. Ubuntu和Windows双系统连接罗技蓝牙键盘
  7. 【POJ】2786-Keep the Customer Satisfied(贪心 + 优先队列,姿势不对就要跪)
  8. flex使用手册翻译
  9. 项目经理可能遇到的问题
  10. 5000家,金融信创试点来了,中小银行成主力