freemark模板框架+quartz定时框架入门学习(面向百度编程)
2017-12-30 20:35
501 查看
需求,定时查询表数据,生成表格,发送给员工,
相关技术 : 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框架,应用场景有哪些?
### 应用场景二
自动结账
oo 因为涉及到支付,如果学员在上完课之后,没有结课的话,这部分钱就永远是讲师的带收入而不是收入。显然这是不合理的,所以就需要一个自动结账的过程。类似于咱们在淘宝上购物如果我们不确认收货,也会默认一个时间段,如果超过这个时间段也会自动结账。
### 应用场景三
解决服务器压力,我们可以把一些数据操作放在晚上执行,错过流量高峰期,这也是本章选择使用quartz框架的原因之一,
编写xml
配置spring配置文件
自定义freemark模板
文件目录结构(WorkBill.ftl是模板)
编写定时器类,需要放在cn.demo.web.timer包下面,名字必须是
SendWorkBill,因为我们之前设置了,当然你也可以改,
运行结果如下,
只要把最后一句syso换成发送邮箱的代码就ok啦,这里提供一个邮箱工具类给大家
使用该工具类,需要导入jar包
创建一个properties文件,放在resources目录下
最后是使用
今天的东西就讲到这里,freemark我也没研究透,有机会好好分享一回
相关技术 : 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> 19b37 </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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://cxf.apache.org/jaxws http://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 { @Resource private 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我也没研究透,有机会好好分享一回
相关文章推荐
- Quartz框架学习之一-快速入门
- Quartz框架入门学习(一)
- (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
- 基于Quartz实现定时任务-框架学习
- 定时调度Quartz框架学习小demo
- Spring集成Quartz定时任务框架学习
- 游戏编程入门学习笔记20——网络篇——理清框架、获取字符串输入
- quartz入门及通用型自定义定时任务框架
- MyBatis入门学习二:面向接口编程
- Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
- 定时任务框架:Quartz - 快速入门
- Web框架梳理:第四章:Spring学习入门、Spring属性注入、AOP编程、注解开发
- Quartz定时框架入门
- Lua编程入门-学习笔记2
- IOS网络编程要学习的框架
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- IOS网络编程要学习的框架
- 机器学习深度学习必备知识框架定时更新
- 【Python】学习笔记——-8.4、面向对象高级编程:4.定制类
- spark入门学习(2)---利用akka建立基于心跳基础的通信框架