您的位置:首页 > 编程语言

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框架,应用场景有哪些?

应用场景一

更新静态数据,需求,存入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我也没研究透,有机会好好分享一回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息