Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring 2.0 技術手冊第九章 - API 封裝

1,819 views

Published on

Spring 2.0 技術手冊

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Spring 2.0 技術手冊第九章 - API 封裝

  1. 1. 。式方用使的中 Spring 在等務服程排與務服件郵、務服程遠紹介將中節章個這 。單簡加更時務服件元或 些一用 API使 在 您 讓,式 方 的 致 一 且 化 簡 了 供 提,下 裝 封 的 樣 這 在,裝 封 象 抽 層一 供 提 是 而,案 方 決 解 的 接 直 供 提 不 , 務服業企些一於對 API S pring API 封裝 9
  2. 2. Spring 2.0 良信林(冊手術技 – http://openhome.cc )9.1 遠程務服地本用使同如就,時務服端服伺用使在件物的端地本讓務服程遠,術技程遠的同不種各於對,節細等結連路網到觸接需不端戶客,樣一相不各術技務服程遠的用採所層底使即,式方用使的致一了供提Spring下一紹介來將節小個這,的致一是卻式方的們它用運中 Spring 在,同RMI 。用使的 H essian 及以 、 B urlap 、 Http Invoker9.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. 3. Chapter 9 API 裝封承繼用 不面介的件物 務服 j ava.rmi.Remote作實在而,面介 I SomeService 承繼用不也時 java.rmi.UnicastRemoteObject :如例,別類 RMIServerDemo SomeServiceImpl.javapackage 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. 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. 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. 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. 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. 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. 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. 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.1Burlap 用改要只上定設則, org.springframework.remoting.caucho.1
  11. 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. 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. 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. 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 Hunters COS Java Servlet 。援支之Programming 對為 者 後 , 援 支 之 ) 的 供 提 中 書 Java Mail9.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. 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.javapackage onlyfun.caterpillar;import org.springframework.mail.javamail.JavaMailSenderImpl;import javax.mail.internet.MimeMessage;import org.springframework.mail.javamail.MimeMessageHelper; 1
  16. 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() 的別類 booleantrue 用啟要示表,時 HTML :容內件郵的後去出送傳下一看來,件郵的式格 圖 9.3 HTMLMailDemo 果結行執的案專16
  17. 17. Chapter 9 API 裝封9.2.3 內嵌圖片或附檔個一定給要時片圖嵌內在,片圖嵌內中件郵在以可也您 "cid" 直,值 :範示的式程看來接 AttachedImageDemo AttachedImageDemo.javapackage 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. 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. 19. Chapter 9 API 裝封 (案檔加附用使中件郵在以可也您 A ttachment file 用使要只,)Mime-中其,法方MessageHelper 的 addAttachment() "cid" 加附示顯來用是值 : 下 如例實 個 一 , 稱 名 的 案 檔 AttachedFileDemo AttachedFileDemo.javapackage 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. 20. Spring 2.0 良信林(冊手術技 – http://openhome.cc ) System.out.println(" 功成送傳件郵 ..."); } } : 面 畫件郵 的 後 送 傳 下 一 看 來 圖 9.5 AttachedFileDemo 果結行執的案專2
  21. 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.javapackage 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. 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 :如 例 , 務 任 的 定 排 所行進 始 開 會 就 , 檔 義 定 完 取 讀 動 啟 器 容Spring22
  23. 23. Chapter 9 API 裝封 TimerTaskDemo TimerTaskDemo.javapackage 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. 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
  25. 25. Chapter 9 API 裝封<bean id="scheduledTimerTask" 2
  26. 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. 27. Chapter 9 API 裝封 QuartzDemo DemoJob.javapackage 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.javapackage onlyfun.caterpillar;import java.util.Date;public class JobData { public String getData() { return "Data from " + new Date().toString(); }} 27
  28. 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. 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.javapackage 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. 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/beans3
  31. 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. 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 1012 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. 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. 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. 35. 3 感快發開的 Spring 驗體 9.7 圖。 手上快 很 以 可 都 能 功 它 其 的 Spring 於 對 信 相 , 照對的 件 文 考 參 上 加 礎 基的書本了有,件文考參的供提所 Spring 考參以可您議建,紹介加詳都個一每法無,限有圍範的獵涉所人個與幅篇唯,多許有還能功的 於關上 Spring實事,落段一告先紹介的能功別個 Spring 於對書本,止為節章個這到 9.4 接下來的主題 裝封 Chapter 9 API

×