More Related Content
Similar to Spring 2.0 技術手冊第九章 - API 封裝
Similar to Spring 2.0 技術手冊第九章 - API 封裝 (20)
More from Justin Lin (20)
Spring 2.0 技術手冊第九章 - API 封裝
- 1. 。式方用使
的中 Spring 在等務服程排與務服件郵、務服程遠紹介將中節章個這
。單簡加更時務服件元或 些一用 API
使 在 您 讓,式 方 的 致 一 且 化 簡 了 供 提,下 裝 封 的 樣 這 在,裝 封 象 抽 層
一 供 提 是 而,案 方 決 解 的 接 直 供 提 不 , 務服業企些一於對
API S pring
API 封裝
9
- 2. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
9.1 遠程
務服地本用使同如就,時務服端服伺用使在件物的端地本讓務服程遠
,術技程遠的同不種各於對,節細等結連路網到觸接需不端戶客,樣一
相不各術技務服程遠的用採所層底使即,式方用使的致一了供提
Spring
下一紹介來將節小個這,的致一是卻式方的們它用運中
Spring 在,同
RMI 。用使的
H essian 及以 、
B urlap 、 Http Invoker
9.1.1 RMI
, 的現出就始開
RMI 從是) (
R emote Method Invocation JDK 1.1 API
然,樣一件物地本用使同如就,時務服的供提件物端遠用使在端戶客讓它
承繼須必時義定在面介務服是像,續手的串連一有須必時用使在
RMI 而
承繼須必時作實在
java.rmi.Remote 務服、面介 Server java.rmi.Unicast-
上定設,等 與 生產令指 用使須必、別類
RemoteObject rmic stub skeleton
。雜繁續手的
過透中 在以可您
Spring org.springframework.remoting.rmi.Rmi-
在 解了,子例看看際實來,續手的 用使化簡
ServiceExporter RMI Spring
務服個一義定後然,寫撰的端服伺 下一看先首,化簡與用使的上
RMI RMI
:面介的件物
RMIServerDemo ISomeService.java
package onlyfun.caterpillar;
public interface ISomeService {
public String doSomeService(String some);
public int doOtherService(int other);
}
2
- 3. Chapter 9 API 裝封
承繼用 不面介的件物 務服 j ava.rmi.Remote作實在而,面介 I SomeService
承繼用不也時
java.rmi.UnicastRemoteObject :如例,別類
RMIServerDemo SomeServiceImpl.java
package onlyfun.caterpillar;
public class SomeServiceImpl implements ISomeService {
public String doSomeService(String some) {
return some + " is processed";
}
public int doOtherService(int other) {
return ++other;
}
}
的過改修經已個一回傳是只都法方個兩,範示的單簡個是只作實個這
, 例 實 成 生、理 管 讓,義定中檔義定 在要只來下接,值
Bean Spring Bean
:如例,務服 動啟、冊註可即此如
RMI
RMIServerDemo rmi-server.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-2.0.xsd">
<bean id="someService"
class="onlyfun.caterpillar.SomeServiceImpl"/>
<bean id="serviceExporter"
class="org.springframework.remoting.
→ rmi.RmiServiceExporter">
<property name="service" ref="someService"/>
<property name="serviceName" value="SomeService"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
3
- 4. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
</bean>
</beans>
訴告要只
org.springframework.remoting.rmi.RmiServiceExporter
) 為定設上性屬 在意注(稱名、件物務服
"serviceName" "SomeService"
務服 , 後 例 實 成 生 並 檔 義 定 取 讀 後之 , 面 介 的 理 代 要 與
Spring Bean R MI
:務服 動啟以,別類 的 單 簡個一 寫 撰 來 , 動 啟 會 就
RMIServer RMI
RMIServerDemo RMIServer.java
package onlyfun.caterpillar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
import org.springframework.remoting.rmi.RmiServiceExporter;
public class RMIServer {
public static void main(String[] args)
throws IOException {
ApplicationContext context =
new ClassPathXmlApplicationContext("rmi-server.xml");
System.out.println(" 動啟RMI Server..");
System.out.println(" 入輸請 exit 閉關Server: ");
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
while(true) {
if(reader.readLine().equals("exit")) {
break;
}
}
4
- 5. Chapter 9 API 裝封
RmiServiceExporter rmiServiceExporter =
(RmiServiceExporter) context.getBean("serviceExporter");
rmiServiceExporter.destroy();
}
}
一另用使動自會 , 動 啟 會 就 務 服 ,後 之 式 程 的 面 上 行 運 在
R MI S pring
入輸以可您,題問理處的緒行執心關用不以所,務服 行執來緒行執個
RMI
向以端戶客 個一作實何如,下一看來著接,式程開離接直
"exit" RMI RMI
是就也,面介的象抽於賴依是端戶客,是的得記要先首,務服求要器服伺
。份一有端戶客在須必也檔 之面介
ISomeService .class 的前先
過透要只,時務服 要需端戶客在
R MI o rg.springframework.remoting.
的定設前先至應對( 的務服知告並,
rmi.RmiProxyFactoryBean URL
地本用使在像好就時式程寫撰在,可即面介的理代、)稱名
"SomeService"
: 寫 撰 下 如 以 可 檔 義 定 如例, 樣 一 務 服 的 理 管 端
Bean
RMIClientDemo rmi-client.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-2.0.xsd">
<bean id="someServiceProxy"
class="org.springframework.remoting.
rmi.RmiProxyFactoryBean">
→
<property name="serviceUrl"
value="rmi://localhost/SomeService"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
</bean>
</beans>
- 6. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
伺定指著接,頭開 以是它,定設的性屬 到意注
"serviceUrl" "rmi://"
的上器服伺 用使以式程端戶客的單簡個寫撰來,稱名務服與址位器服 RMI
:務服
RMIClientDemo RMIClient.java
package onlyfun.caterpillar;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
public class RMIClient {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext(
"rmi-client.xml");
ISomeService service =
(ISomeService) context.getBean("someServiceProxy");
String result1 = service.doSomeService("Some request");
System.out.println(result1);
int result2 = service.doOtherService(1);
System.out.println(result2);
}
}
理代,節細種種的結連務服關有到理處要需不全完,中作實的式程在
得取在正到意注會不本根,看來式程從單,節細些這成完您幫動自會件物
:示 所 下 如 果 結 的 行 執,務 服 的 上 器 服 伺 端 遠
圖 9.1 RMIClientDemo 果結行執的案專
6
- 7. Chapter 9 API 裝封
9.1.2 Hessian、Burlap
Hessian B urlap 由是 、
Caucho Technology ( h ttp://www.caucho.com/ )
HTTP 。務服程遠的現實 過透,出提所
若不而,送傳行進
Hessian 用使 息 訊 位 進 二 的 性 中 以 件 物 將 是 HTTP
某於限受不此因,的性中是息訊位進二於由,式格化列序的 用使
RMI Java
較寬頻的需所時輸傳在料資位進二,端服伺或端戶客的現實所言語式程種
。點優其是小
的高較有且件文 ,送傳行進式格件文 以件物將是則
Burlap XML X ML
當 ,息訊 的 收 接 所 讀 解 以 可 就 件 文 析 剖 以 可式程 用 應 要 只 , 性 讀 可
XML
。 端服伺 與 端 戶 客 的 現 實 所言語 種 某 於 限 受 不 也 然
、 於由,的似類是法方的
Spring 及
Hessian 用使中
Burlap 在 Hessian
就也,架框
Burlap 配搭要 時 用 使 在 以 所 , 送 傳
HTTP 過透是 Spring Web
以, 用使何如範示來子例的際實個舉,
DispatcherServlet 用使是 Hessian
、
9.1.1 的好寫撰已用使接直以可,說來子 例 的紹介中
RMI ISomeService
:
SomeServiceImpl 置配中 在要端服伺而, web.xml DispatcherServlet
HessianServerDemo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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" version="2.4">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
7
- 8. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/service-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.service</url-pattern>
</servlet-mapping>
</web-app>
在 Hessian 用使,邊這端服伺的 org.springframework.remoting.cau-
:務服佈發來
cho.HessianServiceExporter
HessianServerDemo service-config.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-2.0.xsd">
<bean id="urlMapping"
class="org.springframework.web.servlet.
→ handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/some.service">serviceExporter</prop>
</props>
</property>
</bean>
<bean id="someService"
class="onlyfun.caterpillar.SomeServiceImpl"/>
<bean id="serviceExporter"
8
- 9. Chapter 9 API 裝封
class="org.springframework.remoting.
caucho.HessianServiceExporter">
→
<property name="service" ref="someService"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
</bean>
</beans>
求請,上置設的 在到意注
SimpleUrlHandlerMapping " some.service"
有沒是就也,稱名務服冊註用不邊這在,
" serviceExporter" 給配分會的
則, 是的用使果如,要需不
"serviceName" 、 ,性屬
H essian B urlap Burlap
用改要只性屬 的
"serviceExporter" 在上定設
"class" org.spring-
。可即別類
framework. remoting.caucho.BurlapServiceExporter
,後之式程用應 的計設上以入載,器容 動啟要只來下接
Servlet Web
的需所 入加中錄目 在要得記,了動啟會就端服伺
Hessian 則 lib Hessian
目
API 下錄目 中案檔載下 .jar 用使以可這,案檔 之別類 Spring lib caucho
入加得記要,話的 用使果如,案檔
hessian-3.0.20.jar 的錄
Burlap Burlap API
.jar 。案檔 的需所
來案專 Hessian的寫撰前先用使以可則寫撰的端戶客 RMIClientDemo
: 如 例 , 可 即 檔 義 定 下 一改修 要 只 上 實 事 , 寫 改
Bean
HessianClientDemo hessian-client.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-2.0.xsd">
<bean id="someServiceProxy"
class="org.springframework.remoting.
caucho.HessianProxyFactoryBean">
→
<property name="serviceUrl" value="http://localhost:8080/
- 10. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
→ HessianServerDemo/some.service"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
</bean>
</beans>
的準標 個 是 它 , 定 設 的 性 屬
"serviceUrl" 到意注 HTTP 來,址位求請
:務服的上器服伺 用 使 以 式程端 戶 客 的 單 簡 個 寫 撰
Hessian
HessianClientDemo HessianClient.java
package onlyfun.caterpillar;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
public class HessianClient {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext(
"hessian-client.xml");
ISomeService service =
(ISomeService) context.getBean("someServiceProxy");
String result1 = service.doSomeService("Some request");
System.out.println(result1);
int result2 = service.doOtherService(1);
System.out.println(result2);
}
}
果結的行執,案檔 的 括 包 入加要 , 得 記 須 必 的 樣 同
Hessian API .jar
用 使 要 果 如 , 面 畫 的 圖考參 以 可 , 的 同 相 是 案 專
RMIClientDemo 與 9.1
Burlap 用改要只上定設則,
org.springframework.remoting.caucho.
1
- 11. Chapter 9 API 裝封
BurlapProxyFactoryBean 入加須必得記要然當,可即 Burlap API 需所
的 .jar 。案檔
9.1.3 Http Invoker
來制機化列序的 用使時送傳,件物送傳
Http Invoker 用使HTTP Java
來架框 配搭要時們它用使在以所,送傳
HTTP 過透於由,送傳 Spring Web
的 寫 改 以 可, 到 用 使 是 就 也,用 使
DispatcherServlet 9.1.2 HessianServer-
Demo :了以可就 下一改修要只,案專
service-config.xml
HttpInvokerDemo service-config.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-2.0.xsd">
<bean id="urlMapping"
class="org.springframework.web.servlet.
→ handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/some.service">serviceExporter</prop>
</props>
</property>
</bean>
<bean id="someService"
class="onlyfun.caterpillar.SomeServiceImpl"/>
<bean id="serviceExporter"
class="org.springframework.remoting.
→ httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="someService"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
</bean>
11
- 12. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
</beans>
寫 改 以 可,份 部 的 端 戶 客 來 下 接 HessianClientDemo 修,容內的案專
:容內的檔義定 下一改
Bean
InvokerClientDemo invoker-client.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-2.0.xsd">
<bean id="someServiceProxy"
class="org.springframework.remoting.
→ httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/
→ HttpInvokerDemo/some.service"/>
<property name="serviceInterface"
value="onlyfun.caterpillar.ISomeService"/>
</bean>
</beans>
撰來,址位求請 的準 標 是 它 , 定 設 的 性 屬
"serviceUrl" 到意注 HTTP
:務服的上器服伺 用 使以式 程 端 戶 客 的 單 簡 寫
Http Invoker
InvokerClientDemo InvokerClient.java
package onlyfun.caterpillar;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
public class InvokerClient {
public static void main(String[] args) {
ApplicationContext context =
12
- 13. Chapter 9 API 裝封
new ClassPathXmlApplicationContext(
"invoker-client.xml");
ISomeService service =
(ISomeService) context.getBean("someServiceProxy");
String result1 = service.doSomeService("Some request");
System.out.println(result1);
int result2 = service.doOtherService(1);
System.out.println(result2);
}
}
與果結的行執 RMIClientDemo 。面畫的 圖考參以可,的同相是案專 9.1
13
- 14. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
9.2 郵件
的 由 是 援支的 務 服 送 發 件 郵 於 對
Spring org.springframework.mail.
MailSender :別類作實個兩有它,義定所面介 o rg.springframework.mail.
cos.CosMailSenderImpl 與 org.springframework.mail.javamail.Java-
的它在(
MailSenderImpl 對為者前,Jason Hunter's COS Java Servlet
。援支之
Programming 對為 者 後 , 援 支 之 ) 的 供 提 中 書 Java Mail
9.2.1 簡單郵件
服件郵 供提何如 範示,用使的 以將邊這在
Java Mail Spring Java Mail
範示的式程,作實何如送傳之件郵字文純的單簡最個看來先首,裝封的務
:下如
SimpleMailDemo SimpleMailDemo.java
package onlyfun.caterpillar;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.SimpleMailMessage;
public class SimpleMailDemo {
public static void main(String[] args) throws Exception {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
// 定設 Mail Server
senderImpl.setHost("your_mail_server.com");
// 息訊件郵立建
SimpleMailMessage mailMessage = new SimpleMailMessage();
// 文內與題主、人件寄、人件收定設
mailMessage.setTo("xxx@your_mail_server.com");
mailMessage.setFrom("xxx@your_mail_server.com");
mailMessage.setSubject("Test");
mailMessage.setText("This is a test!!!");
14
- 15. Chapter 9 API 裝封
// 件郵送傳
senderImpl.send(mailMessage);
System.out.println(" 送傳件郵 OK..");
}
}
郵 的您果如,通溝作 埠接連與會設預
JavaMailSenderImple 25 SMTP
以行 執 , 埠 接 連 定 設 來25 用使以可,埠接連 用使是不器服伺件 setPort()
是 的 用 使 所 邊 這 在 , 案 檔 的 需 所 關相入 加 得 記 , 時 式 程 上
API .jar Spring
出送傳,案檔 lib 與 j2ee 的錄目 下錄目 中案檔載下
activation.jar mail.jar
: 示 所 下如後 到 收 接 在 件 郵 的 去
圖 9.2 SimpleMailDemo 果結行執的案專
9.2.2 HTML 郵件
用使要果如 HTML 用使以可,話的件郵 Spring 的 org.springframe-
立建來
work.mail.javamail.MimeMessageHelper HTML 用使接直,件郵
:範示作來例實
HTMLMailDemo HTMLMailDemo.java
package onlyfun.caterpillar;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.MimeMessageHelper;
1
- 16. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
public class HTMLMailDemo {
public static void main(String[] args) throws Exception {
JavaMailSenderImpl senderImpl =
new JavaMailSenderImpl();
// 定設 Mail Server
senderImpl.setHost("your_mail_server.com");
// 息訊件郵立建
MimeMessage mailMessage =
senderImpl.createMimeMessage();
MimeMessageHelper messageHelper =
new MimeMessageHelper(mailMessage);
// 文內與題主、人件寄、人件收定設
messageHelper.setTo("xxx@your_mail_server.com");
messageHelper.setFrom("xxx@your_mail_server.com");
messageHelper.setSubject("Test");
messageHelper.setText(
"<html><head></head><body><h1>Hello! Spring!"
+ "</h1></body></html>", true);
// 件郵送傳
senderImpl.send(mailMessage);
System.out.println(" 送傳件郵 OK...");
}
}
在
MimeMessageHelper 為定設數參 的 上法方
setText() 的別類 boolean
true 用啟要示表,時 HTML :容內件郵的後去出送傳下一看來,件郵的式格
圖 9.3 HTMLMailDemo 果結行執的案專
16
- 17. Chapter 9 API 裝封
9.2.3 內嵌圖片或附檔
個一定給要時片圖嵌內在,片圖嵌內中件郵在以可也您 "cid" 直,值
:範示的式程看來接
AttachedImageDemo AttachedImageDemo.java
package onlyfun.caterpillar;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.MimeMessageHelper;
public class AttachedImageDemo {
public static void main(String[] args) throws Exception {
JavaMailSenderImpl senderImpl =
new JavaMailSenderImpl();
// 定設 Mail Server
senderImpl.setHost("your_mail_server.com");
// 息訊件郵立建
MimeMessage mailMessage =
senderImpl.createMimeMessage();
MimeMessageHelper messageHelper =
new MimeMessageHelper(mailMessage, true);
// 文內與題主、人件寄、人件收定設
messageHelper.setTo("xxx@your_mail_server.com");
messageHelper.setFrom("xxx@your_mail_server.com");
messageHelper.setSubject("Test");
messageHelper.setText(
"<html><head></head><body><h1>Hello! Spring!"
+ "</h1><img src="cid:caterpillar">"
+ "</body></html>", true);
ClassPathResource img =
new ClassPathResource("caterpillar.jpg");
messageHelper.addInline("wish", img);
17
- 18. 18
。 況 情 的 片 圖 示 顯 法無生 發 會 中 體 軟 端 戶 客
些某在能可,題問有會援支的片圖嵌內於對端戶客件郵的有是處壞,片圖
的結連所得取以可時件郵取讀者用使讓以,案檔供提上器服伺在須必,式
方的結連定給像用不是處好,壞有好有中件郵入加案檔像影將接直
果結行執的案專 9.4 AttachedImageDemo 圖
:面畫
之 件郵的 後 送 傳 下 一 看 來 ,中件 郵 至 入 加 案 檔 像 影 將 以 可 法 方 addInline()
,應對定指值 "cid"
的中法方 addInline()
與定設個這, "caterpillar"
為值 "cid"
定指法方 setText()
在,式模 multipart
用啟要示表, true
為值 boolean
的定給所時例實的別類 MimeMessageHelper
構建在
}
}
..."); 功成送傳件郵 System.out.println("
senderImpl.send(mailMessage);
// 件郵送傳
) – http://openhome.cc 良信林(冊手術技 Spring 2.0
- 19. Chapter 9 API 裝封
(案檔加附用使中件郵在以可也您 A ttachment file 用使要只,)Mime-
中其,法方
MessageHelper 的 addAttachment() "cid" 加附示顯來用是值
: 下 如例實 個 一 , 稱 名 的 案 檔
AttachedFileDemo AttachedFileDemo.java
package onlyfun.caterpillar;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.MimeMessageHelper;
public class AttachedFileDemo {
public static void main(String[] args) throws Exception {
JavaMailSenderImpl senderImpl =
new JavaMailSenderImpl();
// 定設 Mail Server
senderImpl.setHost("your_mail_server.com");
// 息訊件郵立建
MimeMessage mailMessage =
senderImpl.createMimeMessage();
MimeMessageHelper messageHelper =
new MimeMessageHelper(mailMessage, true);
// 文內與題主、人件寄、人件收定設
messageHelper.setTo("xxx@your_mail_server.com");
messageHelper.setFrom("xxx@your_mail_server.com");
messageHelper.setSubject("Test");
messageHelper.setText(
"<html><head></head><body><h1>Hello! Spring!"
+ "</h1></body></html>", true);
ClassPathResource file =
new ClassPathResource("caterpillar.zip");
messageHelper.addAttachment("caterpillar.zip", file);
// 件郵送傳
senderImpl.send(mailMessage);
1
- 20. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
System.out.println(" 功成送傳件郵 ...");
}
}
: 面 畫件郵 的 後 送 傳 下 一 看 來
圖 9.5 AttachedFileDemo 果結行執的案專
2
- 21. Chapter 9 API 裝封
9.3 排程
與 有 供 提 準 標 的 , 作工的 行 執 時 定 程 排 於 對
J DK API java.util.Timer
用善以可您讓,裝封象抽了供提它對則
java.util.TimerTask S pring ,別類
間之務任 與 務 任 定 指 能 只 , 限 有 能 功
Spring 而然,能功理管器容的
Timer
用使以可您,務任行執時定點間時個某定指法無,) (期週的
P eriod Quartz
,能功程排的多更了供提它,)
h ttp://www.opensymphony.com/quartz/ (
Spring 。 便 方加更 上 用 使 在 , 裝 封 了 行 進
Quartz 對 而
9.3.1 使用 TimerTask
(務任程排個一義定要 T ask 承繼以可,) java.util.TimerTask ,別類
:如例
TimerTaskDemo DemoTask.java
package onlyfun.caterpillar;
import java.util.TimerTask;
public class DemoTask extends TimerTask {
public void run() {
System.out.println("Task is executed.");
}
}
的
Spring 用使以可著接
org.springframework.scheduling.timer.
: 如 例 ,期週 行 執 的 務 任 義 定 來
ScheduledTimerTask
21
- 22. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
TimerTaskDemo beans-config.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-2.0.xsd">
<bean id="demoTask" class="onlyfun.caterpillar.DemoTask"/>
<bean id="scheduledTimerTask"
class="org.springframework.scheduling.
timer.ScheduledTimerTask">
→
<property name="timerTask" ref="demoTask"/>
<property name="period" value="600000"/>
<property name="delay" value="10000"/>
</bean>
<bean id="timerFactoryBean"
class="org.springframework.scheduling.
timer.TimerFactoryBean">
→
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTimerTask"/>
</list>
</property>
</bean>
</beans>
,秒毫是位單的義定,中性屬
ScheduledTimerTask 的別類 "period" 在
任 的義定 所 次 一 行 執 ) 秒 毫 ( 鐘 分 每 將,義 定 的 上 以 據 根 此 因
10 6 00000
少 多遲延 要 前 務 任 行 執 次 一 第 , 後 動 啟
"delay" Timer 了義定性屬 而,務
。秒毫
用使要
ScheduledTimerTask 的好義定org.springframework.sche-
要只來下接,務任程排的有所入加來別類
duling.timer.TimerFactoryBean
:如 例 , 務 任 的 定 排 所行進 始 開 會 就 , 檔 義 定 完 取 讀 動 啟 器 容
Spring
22
- 23. Chapter 9 API 裝封
TimerTaskDemo TimerTaskDemo.java
package onlyfun.caterpillar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Timer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
public class TimerTaskDemo {
public static void main(String[] args) throws IOException {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans-config.xml");
System.out.println(" Task..");
動啟
System.out.println(" 入輸請 exit 閉關 Task: ");
BufferedReader reader =
new BufferedReader(
new InputStreamReader(System.in));
while(true) {
if(reader.readLine().equals("exit")) {
break;
}
}
Timer timer = (Timer) context.getBean("timerFactoryBean");
timer.cancel();
}
}
後動啟在式程個這,容內的檔義定
Bean 據根 10 任次一第行執會秒
。務任次一行執鐘分 每後之,務
10
23
- 24. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
9.3.2 使用 MethodInvokingTimerTaskFactoryBean
用使 Spring 承 繼 要 定 一 不 並,時 TimerTask ,務 任 個 一 義 定 來 S pring
供提 org.springframework.scheduling.timer.MethodInvokingTimerTask-
FactoryBean 下一寫改以可如例,法方的件物個某行執定指接直以可,
TimerTaskDemo :別類 承繼用不次這,別類 的中案專
DemoTask TimerTask
TimerTaskDemo2 DemoTask.java
package onlyfun.caterpillar;
public class DemoTask {
public void execute() {
System.out.println("Task is executed.");
}
}
在要只著接 Bean 用使中檔義定 MethodInvokingTimerTaskFactory-
Bean :如例,可即
TimerTaskDemo2 beans-config.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-2.0.xsd">
<bean id="demoTask" class="onlyfun.caterpillar.DemoTask"/>
<bean id="timerTaskBean"
class="org.springframework.scheduling.
→timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="demoTask"/>
<property name="targetMethod" value="execute"/>
</bean>
24
- 26. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
class="org.springframework.scheduling.
timer.ScheduledTimerTask">
→
<property name="timerTask" ref="timerTaskBean"/>
<property name="period" value="5000"/>
<property name="delay" value="1000"/>
</bean>
<bean id="timerFactoryBean"
class="org.springframework.scheduling.
timer.TimerFactoryBean">
→
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTimerTask"/>
</list>
</property>
</bean>
</beans>
用使接直以可時行執 TimerTaskDemo 的中案專 TimerTaskDemo 類
,層底在,別 立建動自會
MethodInvokingTimerTaskFactoryBean TimerTask
。 法 方 定 指 的 上件物 標 目 行 執 以 例 實 的
9.3.3 使用 Quartz
間之務任與務任定指能只,限有能功
JDK API 的供提所中 準標
Timer
用使以可您,務任行執時定來點間時個某定指法無,
P eriod ) ( 週的
期 Quartz
,能功程排的多更了供提它,)
h ttp://www.opensymphony.com/quartz/ (
。 便 方 加更上 用 使 在 , 裝 封 了 行 進
Spring Quartz 對則 而
承繼以可
org.springframework.scheduling.quartz.QuartzJobBean
Job :如例,別類 個一作實來
26
- 27. Chapter 9 API 裝封
QuartzDemo DemoJob.java
package onlyfun.caterpillar;
import org.quartz.JobExecutionContext;
import org.springframework.scheduling.
quartz.QuartzJobBean;
public class DemoJob extends QuartzJobBean {
private JobData jobData;
public void executeInternal(
JobExecutionContext context) {
System.out.println(
jobData.getData() + " is executed.");
}
public void setJobData(JobData jobData) {
this.jobData = jobData;
}
public JobData getJobData() {
return jobData;
}
}
執被 程排出看能了為,別類範示的件物料資 個一是只
JobData Job Job
時回傳的料資需所時 行執示表,件物 個一回傳它,性期週的時行
Date Job
:如例,間
QuartzDemo JobData.java
package onlyfun.caterpillar;
import java.util.Date;
public class JobData {
public String getData() {
return "Data from "
+ new Date().toString();
}
}
27
- 28. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
: 義定何 如 檔 義 定 看 來 接 直
QuartzDemo beans-config.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-2.0.xsd">
<bean id="someData" class="onlyfun.caterpillar.JobData"/>
<bean id="jobDetailBean"
class="org.springframework.scheduling.
→ quartz.JobDetailBean">
<property name="jobClass"
value="onlyfun.caterpillar.DemoJob"/>
<property name="jobDataAsMap">
<map>
<entry key="jobData" value-ref="someData"/>
</map>
</property>
</bean>
<bean id="simpleTriggerBean"
class="org.springframework.scheduling.
→ quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetailBean"/>
<property name="repeatInterval" value="5000"/>
<property name="startDelay" value="1000"/>
</bean>
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.
→ quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTriggerBean"/>
</list>
</property>
</bean>
</beans>
28
- 29. Chapter 9 API 裝封
,是的意注要別特中定設上以在 o rg.springframework.scheduling.
不而,稱名別類的 供提須必性屬
quartz.JobDetailBean 的
"jobClass" Job
中性屬
Job Bean 在以可料資的需所 而,例實 的 是
Job "jobDataAsMap"
。供提來
用使,上定指期週的務任程排在org.springframework.scheduling.
式方定指的中程排 與點這,定指來
quartz.SimpleTriggerBean TimerTask
是 的 用 使 所 , 時 定 排 而,位 單 為 作 秒 毫 以 是 也樣同 間 時 的 定 指 , 似 類
Job
。
org.springframework.scheduling.quartz.SchedulerFactoryBean
,行進會就務任程排,後檔義定取讀並 動啟要只,後之定設成完
Spring
: 別 類 動 啟 務任的 單 簡 個 一 寫 撰 如 例
QuartzDemo QuartzDemo.java
package onlyfun.caterpillar;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.
support.ClassPathXmlApplicationContext;
public class QuartzDemo {
public static void main(String[] args)
throws IOException, SchedulerException {
ApplicationContext context =
new ClassPathXmlApplicationContext("beans-config.xml");
System.out.println(" Task..");
動啟
System.out.println(" 入輸請 exit Task: ");
閉關
BufferedReader reader =
new BufferedReader(
new InputStreamReader(System.in));
2
- 30. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
while(true) {
if(reader.readLine().equals("exit")) {
break;
}
}
Scheduler scheduler =
(Scheduler) context.getBean("schedulerFactoryBean");
scheduler.shutdown();
}
}
執的務任個每到看以可中當,面畫考參個一的時行執式程個這看看來
:間時行
圖 9.6 QuartzDemo 果結行執的案專
期週的行執間之 與 的單簡作能只 用使
SimpleTriggerBean Job Job
用使以可則,定指的點間時作接直要果如,定指) (
P eriod org.spring-
:如例,
framework.scheduling.quartz.CronTriggerBean
QuartzDemo2 beans-config.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
3
- 31. Chapter 9 API 裝封
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="someData" class="onlyfun.caterpillar.JobData"/>
<bean id="jobDetailBean"
class="org.springframework.scheduling.
→ quartz.JobDetailBean">
<property name="jobClass"
value="onlyfun.caterpillar.DemoJob"/>
<property name="jobDataAsMap">
<map>
<entry key="jobData" value-ref="someData"/>
</map>
</property>
</bean>
<bean id="cronTriggerBean"
class="org.springframework.scheduling.
→ quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailBean"/>
<property name="cronExpression" value="0 0 19 * * ?"/>
</bean>
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.
→ quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
</beans>
間時個六少至是式格的定指,定指的性屬 於在點重
"cronExpression"
,次一 行執要時 的天每是定指的面上如例,素元間時個七多最,素元 19 Job
:下如式格的定指性屬
"cronExpression"
31
- 32. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
(秒
0 -59 )
(分
0 -59 )
) (時小 0 -23
) (天幾第月每 1 -31
) 或 (月
1 -12 JAN-DEC
或 (天幾第期星每 1 -7 SUN-SAT )
) (年
1 970-2099
一定設能只個兩,的斥互是」天幾第期星每「與」天幾第月每「中其
例 , 號 符 用 使 以 可 , 點 間時個 幾 好 有 果 如 , 寫 撰 號 符 以 的 定 設 不 , 個
? ,
對; 行執要時 、時 、時 的天每示表」
0 0 10,12,14 * * ? 「:如 10 12 14 Job
的月每示表」 「 如 例 , 號 符 用使 以 可 間 時 的 續 連 於
- 0 0 10,12,14 1-15 * ?
可 有可定 指 年 的 中 式 格 間 時 , 行 執 要 時 、 時 、 時 每 日 到
1 15 10 12 14 Job
、 時 的一期星每年 示表」 0 0 10,12,14 ? * MON 2006「:如例,無 2006 10
12 14 Job 。 行執要時 、時
9.3.4 使用 MethodInvokingJobDetailFactoryBean
承繼要定一不並,話的 用使果如
Spring QuartzJobBean 一義定來別類
Job 供提 ,別類 個
Spring org.springframework.scheduling.quartz.
的件物個某行執定指接直以可,
MethodInvokingJobDetailFactoryBean
:別類 的中案專 下一寫改如例,法方 QuartzDemo DemoJob
QuartzDemo3 DemoJob.java
package onlyfun.caterpillar;
public class DemoJob {
private JobData jobData;
public void execute() {
System.out.println(
32
- 33. Chapter 9 API 裝封
jobData.getData() + " is executed.");
}
public void setJobData(JobData jobData) {
this.jobData = jobData;
}
public JobData getJobData() {
return jobData;
}
}
用使中檔義定 在要只著接Bean MethodInvokingJobDetailFactoryBean
的中案專 下一寫改如例,可即 QuartzDemo beans-config.xml :
QuartzDemo3 beans-config.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-2.0.xsd">
<bean id="someData" class="onlyfun.caterpillar.JobData"/>
<bean id="someJob"
class="onlyfun.caterpillar.DemoJob">
<property name="jobData" ref="someData"/>
</bean>
<bean id="jobDetailBean"
class="org.springframework.scheduling.
→ quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="someJob"/>
<property name="targetMethod" value="execute"/>
</bean>
<bean id="cronTriggerBean"
class="org.springframework.scheduling.
→ quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetailBean"/>
33
- 34. Spring 2.0 良信林(冊手術技 – http://openhome.cc )
<property name="cronExpression" value="0 30 18 * * ?"/>
</bean>
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.
→ quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
</beans>
,層 底 在 , 務 任 的 定 指 行 執 會 都 分 時 的天每 , 中 定 指 的 面 上 在
18 30
執以,例實的 立建動自會
MethodInvokingJobDetailFactoryBean JobDetail
。法方 定 指 的 件 物 標 目 行
34
- 35. 3
感快發開的 Spring 驗體 9.7 圖
。 手上快 很 以 可 都 能 功 它 其 的 Spring
於 對 信 相 , 照對的 件 文 考 參 上 加 礎 基
的書本了有,件文考參的供提所 Spring
考參以可您議建,紹介加詳都個一
每法無,限有圍範的獵涉所人個與幅篇唯,多許有還能功的 於關上 Spring
實事,落段一告先紹介的能功別個 Spring
於對書本,止為節章個這到
9.4 接下來的主題
裝封 Chapter 9 API