锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Trigger鏄竴涓娊璞$被錛?span style="font-family: Calibri">Quartz鎻愪緵浜嗕袱涓瘮杈冨父鐢ㄧ殑瑙﹀彂鍣?span style="font-family: Calibri">SimpleTrigger鍜?span style="font-family: Calibri">CronTrigger銆傚畠浠兘鏄?span style="font-family: Calibri">Trigger鐨勫瓙綾?/span> 榪欐槸涓涓畝鍗曠殑瑙﹀彂鍣紝閫氳繃瀹冩垜浠彲浠ュ畾涔夎Е鍙戠殑鏃墮棿錛屽茍閫夋嫨鎬х殑璁懼畾閲嶅鐨勬鏁板拰闂撮殧鏃墮棿銆傚畠鏈変互涓嬪父鐢ㄧ殑灞炴?/span> 鍙傛暟鍚?/span> 鍙傛暟綾誨瀷 澶囨敞 name String 瑙﹀彂鍣ㄥ悕縐?/span> group String 瑙﹀彂鍣ㄧ粍鍚嶇О repeatCount int 閲嶅嬈℃暟錛屾敞鎰忥細濡傛灉涓?span style="font-family: Calibri">0琛ㄧず涓嶆墽琛岋紝-1琛ㄧず涓嶉檺鍒舵鏁幫紙鐩村埌榪囨湡錛夛紝榛樿涓?span style="font-family: Calibri">0 repeatInterval long 闂撮殧鏃墮棿錛屾敞鎰忥細鏄互姣涓哄崟浣?/span> startTime Date 寮濮嬫椂闂達紝榛樿褰撳墠鏃墮棿 endTime Date 榪囨湡鏃墮棿錛岄粯璁や竴鐩存墽琛岋紙鐩村埌鎵ц嬈℃暟宸茶揪鍒?span style="font-family: Calibri">repeatCount錛?/span> 榪欎釜瑙﹀彂鍣ㄧ殑鍔熻兘闈炲父寮哄ぇ錛岃屼笖闈炲父鐏墊椿錛屼絾闇瑕佹帉鎻℃湁鍏崇殑Cron琛ㄨ揪寮忕煡璇?/span> 鍙傛暟鍚?/span> 鍙傛暟綾誨瀷 澶囨敞 name String 瑙﹀彂鍣ㄥ悕縐?/span> group String 瑙﹀彂鍣ㄧ粍鍚嶇О cronEx CronExpression 瑙勫垯琛ㄨ揪寮?/span> startTime Date 寮濮嬫椂闂達紝榛樿褰撳墠鏃墮棿 endTime Date 榪囨湡鏃墮棿錛岄粯璁や竴鐩存墽琛岋紙鐩村埌鎵ц嬈℃暟宸茶揪鍒?span style="font-family: Calibri">repeatCount錛?/span> 瑙﹀彂鍣ㄨ鍒欒〃杈懼紡閰嶇疆錛?/span> 鏍煎紡: [縐?span>] [鍒哴 [灝忔椂] [鏃 [鏈圿 [鍛╙ [騫碷 鏍煎紡璇存槑錛?/span> 浣嶇疆 鏃墮棿鍩熷悕 鏄惁蹇呴』 鍏佽鍊?/span> 鍏佽閫氶厤絎?/span> 1 縐?/span> 鏄?/span> 0-59 , - * / 2 鍒?/span> 鏄?/span> 0-59 , - * / 3 灝忔椂 鏄?/span> 0-23 , - * / 4 鏃?/span> 鏄?/span> 1-31 , - * ? / L W 5 鏈?/span> 鏄?/span> 1-12 , - * / 6 鍛?/span> 鏄?/span> 1-7鎴?span style="font-family: Calibri">MON-SUN , - * ? / L # 7 騫?/span> 鍚?/span> empty鎴?span style="font-family: Calibri">1970-2099 , - * / 閫氶厤絎﹁鏄庯細 * 鍙敤鍦ㄦ墍鏈夊瓧孌典腑錛岃〃紺哄搴旀椂闂村煙鐨勬瘡涓涓椂鍒伙紝渚嬪錛?span style="font-size: 9pt">*鍦ㄥ垎閽熷瓧孌墊椂錛岃〃紺?span style="font-size: 9pt">“姣忓垎閽?span style="font-size: 9pt">” ? 璇ュ瓧絎﹀彧鍦ㄦ棩鏈熷拰鏄熸湡瀛楁涓嬌鐢紝瀹冮氬父鎸囧畾涓?span style="font-size: 9pt">“鏃犳剰涔夌殑鍊?span style="font-size: 9pt">”錛岀浉褰撲簬鐐逛綅絎?/p> - 琛ㄧず鍖洪棿銆備緥濡?鍦ㄥ皬鏃朵笂璁劇疆 "10-12",琛ㄧず 10,11,12鐐歸兘浼氳Е鍙?/span> , 琛ㄧず鎸囧畾澶氫釜鍊鹼紝渚嬪鍦ㄥ懆瀛楁涓婅緗?span> "MON,WED,FRI" 琛ㄧず鍛ㄤ竴錛屽懆涓夊拰鍛ㄤ簲瑙﹀彂 / x/y琛ㄨ揪涓涓瓑姝ラ暱搴忓垪錛?span style="font-size: 9pt">x涓鴻搗濮嬪鹼紝y涓哄閲忔闀垮箋傚鍦ㄥ垎閽熷瓧孌典腑浣跨敤0/15錛屽垯琛ㄧず涓?span style="font-size: 9pt">0,15,30鍜?span style="font-size: 9pt">45縐掞紝鑰?span style="font-size: 9pt">5/15鍦ㄥ垎閽熷瓧孌典腑琛ㄧず5,20,35,50錛屼綘涔熷彲浠ヤ嬌鐢?span style="font-size: 9pt">*/y錛屽畠絳夊悓浜?span style="font-size: 9pt">0/y L 璇ュ瓧絎﹀彧鍦ㄦ棩鏈熷拰鏄熸湡瀛楁涓嬌鐢紝浠h〃“Last”鐨勬剰鎬濓紝浣嗗畠鍦ㄤ袱涓瓧孌典腑鎰忔濅笉鍚屻?span style="font-size: 9pt">L鍦ㄦ棩鏈熷瓧孌典腑錛岃〃紺鴻繖涓湀浠界殑鏈鍚庝竴澶╋紝濡備竴鏈堢殑31鍙鳳紝闈為棸騫翠簩鏈堢殑28鍙鳳紱濡傛灉L鐢ㄥ湪鏄熸湡涓紝鍒欒〃紺烘槦鏈熷叚錛岀瓑鍚屼簬7銆備絾鏄紝濡傛灉L鍑虹幇鍦ㄦ槦鏈熷瓧孌甸噷錛岃屼笖鍦ㄥ墠闈㈡湁涓涓暟鍊?span style="font-size: 9pt">X錛屽垯琛ㄧず“榪欎釜鏈堢殑鏈鍚?span style="font-size: 9pt">X澶?span style="font-size: 9pt">”錛屼緥濡傦紝6L琛ㄧず璇ユ湀鐨勬渶鍚庢槦鏈熶簲 W 璇ュ瓧絎﹀彧鑳藉嚭鐜板湪鏃ユ湡瀛楁閲岋紝鏄鍓嶅鏃ユ湡鐨勪慨楗幫紝琛ㄧず紱昏鏃ユ湡鏈榪戠殑宸ヤ綔鏃ャ備緥濡?span style="font-size: 9pt">15W琛ㄧず紱昏鏈?span style="font-size: 9pt">15鍙鋒渶榪戠殑宸ヤ綔鏃ワ紝濡傛灉璇ユ湀15鍙鋒槸鏄熸湡鍏紝鍒欏尮閰?span style="font-size: 9pt">14鍙鋒槦鏈熶簲錛涘鏋?span style="font-size: 9pt">15鏃ユ槸鏄熸湡鏃ワ紝鍒欏尮閰?span style="font-size: 9pt">16鍙鋒槦鏈熶竴錛涘鏋?span style="font-size: 9pt">15鍙鋒槸鏄熸湡浜岋紝閭g粨鏋滃氨鏄?span style="font-size: 9pt">15鍙鋒槦鏈熶簩銆備絾蹇呴』娉ㄦ剰鍏寵仈鐨勫尮閰嶆棩鏈熶笉鑳藉璺ㄦ湀錛屽浣犳寚瀹?span style="font-size: 9pt">1W錛屽鏋?span style="font-size: 9pt">1鍙鋒槸鏄熸湡鍏紝緇撴灉鍖歸厤鐨勬槸3鍙鋒槦鏈熶竴錛岃岄潪涓婁釜鏈堟渶鍚庣殑閭eぉ銆?span style="font-size: 9pt">W瀛楃涓插彧鑳芥寚瀹氬崟涓鏃ユ湡錛岃屼笉鑳芥寚瀹氭棩鏈熻寖鍥?/p> # 璇ュ瓧絎﹀彧鑳藉湪鏄熸湡瀛楁涓嬌鐢紝琛ㄧず褰撴湀鏌愪釜宸ヤ綔鏃ャ傚6#3琛ㄧず褰撴湀鐨勭涓変釜鏄熸湡浜?span style="font-size: 9pt">(6琛ㄧず鏄熸湡浜旓紝#3琛ㄧず褰撳墠鐨勭涓変釜)錛岃?span style="font-size: 9pt">4#5琛ㄧず褰撴湀鐨勭浜斾釜鏄熸湡涓夛紝鍋囪褰撴湀娌℃湁絎簲涓槦鏈熶笁錛屽拷鐣ヤ笉瑙﹀彂 SimpleJob.java package com.test.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { // your business logic // ... System.out.println("simpleJob running ...."); } } TestSimpleJob.java package com.test.job; import java.text.ParseException; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory; public class TestSimpleJob { public static void main(String[] args){ try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); String jobName = "simpleJob"; String groupName = "DEFAULT"; //鍒犻櫎浣滀笟 if(scheduler.getJobDetail(jobName,groupName) != null){ scheduler.deleteJob(jobName, groupName); } //浣滀笟鐨勮緇嗕俊鎭?/p>
//浠誨姟鍚嶇О錛屼換鍔$粍鍚嶇О錛屼換鍔″疄鐜扮被 JobDetail jobDetail = new JobDetail(jobName,groupName,SimpleJob.class); //鍒涘緩綆鍗曡Е鍙戝櫒 SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger",null); simpleTrigger.setRepeatCount(100); // 璋冪敤100嬈?/p>
simpleTrigger.setRepeatInterval(5*1000); //姣?span style="font-family: 'Courier New'; color: #3f7f5f; font-size: 10pt">5縐掗挓璋冪敤涓嬈?/p>
//娉ㄥ唽浣滀笟 scheduler.scheduleJob(jobDetail, simpleTrigger); CronTrigger cronTrigger = new CronTrigger("cronTrigger",null); CronExpression cronExpression = null; try { cronExpression = new CronExpression("0 0 12 * * ?"); //姣忓ぉ12鐐硅繍琛?/p>
cronTrigger.setCronExpression(cronExpression); //娉ㄥ唽浣滀笟 scheduler.scheduleJob(jobDetail, cronTrigger); if(! scheduler.isShutdown()){ scheduler.start(); } } catch (ParseException e) { e.printStackTrace(); } } catch (SchedulerException e) { e.printStackTrace(); } } }
]]>
]]>
]]>
-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
鐒跺悗鍙敤濡備笅浠g爜榪涜榪炴帴錛?br />
JMXConnector jmxc = JMXConnectorFactory.connect(url);
mbs = jmxc.getMBeanServerConnection();
鍙傝冿細
]]>Java鍚屾鏂囦歡鍒癑boss铏氭嫙鐩綍
]]>SimpleTrigger
CronTrigger
]]>
]]>
Scheduler璐熻矗綆$悊Quartz鐨勮繍琛岀幆澧冿紝Quartz瀹冩槸鍩轟簬澶氱嚎紼嬫灦鏋勭殑錛屽畠鍚姩鐨勬椂鍊欎細鍒濆鍖栦竴濂楃嚎紼嬶紝榪欏綰跨▼浼氱敤鏉ユ墽琛屼竴浜涢緗殑浣滀笟銆?/span>
瑕佸垱寤轟竴涓綔涓氬茍鑳藉琚Е鍙戣皟鐢紝蹇呴』鍦?span style="font-family: Calibri">Scheduler涓婇潰娉ㄥ唽涓涓?span style="font-family: Calibri">JobDetail鍜?span style="font-family: Calibri">Trigger銆?/span>
Scheduler鎻愭惡浜嗘墍鏈?span style="font-family: Calibri">Trigger鍜?span style="font-family: Calibri">JobDetail錛屼嬌瀹冧滑鍗忚皟宸ヤ綔銆傝繖浜?span style="font-family: Calibri">Trigger鍜?span style="font-family: Calibri">JobDetail閫氳繃鑷韓鐨?span style="font-family: Calibri">name鍜?span style="font-family: Calibri">group灞炴у尯鍒?span>銆?/span>
Scheduler 鐢?span style="font-family: Calibri">SchedulerFactory浜х敓錛屾垜浠彲浠ラ氳繃浠ヤ笅鏂瑰紡鑾峰彇Scheduler鐨勫疄渚嬶細
//浠?span style="background: #d9d9d9">ServletContext
SchedulerFactory factory = (SchedulerFactory)
ServletActionContext.getServletContext().getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");
//鑾峰彇Scheduler瀵硅薄
Scheduler defScheduler = factory.getScheduler();
浠誨姟錛屽叾瀹炲氨鏄竴涓帴鍙c傝鍒涘緩涓涓換鍔★紝蹇呴』寰楀疄鐜拌繖涓帴鍙c傝鎺ュ彛鍙湁涓涓猠xecute鏂規硶錛屼換鍔℃瘡嬈¤璋冪敤鐨勬椂鍊欓兘浼氭墽琛岃繖涓猠xecute鏂規硶鐨勯昏緫銆?/span>
public class TestJob impletemens org.quartz.Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException{
// you business logic
// …
System.out.println("########### this is testJob running ############");
}
}
JobDetail 鐢ㄦ潵淇濆瓨鎴戜滑浣滀笟鐨勮緇嗕俊鎭備竴涓狫obDetail鍙互鏈夊涓猅rigger錛屼絾鏄竴涓猅rigger鍙兘瀵瑰簲涓涓狫obDetail銆備笅闈㈡槸JobDetail鐨勪竴浜涘父鐢ㄧ殑灞炴у拰鍚箟
鍙傛暟鍚?/span> |
綾誨瀷 |
澶囨敞 |
name |
String |
浠誨姟鐨勫悕縐幫紝蹇呴』 |
group |
String |
浠誨姟鎵鍦ㄧ粍錛岄粯璁や負DEFAULT |
jobClass |
Class |
浠誨姟鐨勫疄鐜扮被錛屽繀欏?/span> |
description |
String |
鎻忚堪 |
jobDataMap |
JobDataMap |
鐢ㄦ潵緇欎綔涓氭彁渚涙暟鎹敮鎸佺殑鏁版嵁緇撴瀯 |
volatility |
Boolean |
閲嶅惎搴旂敤涔嬪悗鏄惁鍒犻櫎浠誨姟鐨勭浉鍏充俊鎭紝榛樿false |
durability |
Boolean |
浠誨姟瀹屾垚涔嬪悗鏄惁渚濈劧淇濈暀鍒版暟鎹簱錛岄粯璁?span style="font-family: Calibri">false |
shouldRecover |
Boolean |
搴旂敤閲嶅惎涔嬪悗鏃跺欏拷鐣ヨ繃鏈熶換鍔★紝榛樿false |
jobListeners |
Set |
鐩戝惉鍣?/span> |
榪欐槸涓涓粰浣滀笟鎻愪緵鏁版嵁鏀寔鐨勬暟鎹粨鏋勶紝浣跨敤鏂規硶鍜宩ava.util.Map涓鏍鳳紝闈炲父鏂逛究銆傚綋涓涓綔涓氳鍒嗛厤緇欒皟搴﹀櫒鏃訛紝JobDataMap瀹炰緥灝遍殢涔嬬敓鎴愩?/p>
Job鏈変竴涓猄tatefulJob瀛愭帴鍙o紝浠h〃鏈夌姸鎬佺殑浠誨姟錛岃鎺ュ彛鏄竴涓病鏈夋柟娉曠殑鏍囩鎺ュ彛錛屽叾鐩殑鏄Quartz鐭ラ亾浠誨姟鐨勭被鍨嬶紝浠ヤ究閲囩敤涓嶅悓鐨勬墽琛屾柟妗堛傛棤鐘舵佷換鍔″湪鎵ц鏃舵嫢鏈夎嚜宸辯殑JobDataMap鎷瘋礉錛屽JobDataMap鐨勬洿鏀逛笉浼氬獎鍝嶄笅嬈$殑鎵ц銆傝屾湁鐘舵佷換鍔″叡浜叡浜悓涓涓狫obDataMap瀹炰緥錛屾瘡嬈′換鍔℃墽琛屽JobDataMap鎵鍋氱殑鏇存敼浼氫繚瀛樹笅鏉ワ紝鍚庨潰鐨勬墽琛屽彲浠ョ湅鍒拌繖涓洿鏀癸紝涔熷嵆姣忔鎵ц浠誨姟鍚庨兘浼氬鍚庨潰鐨勬墽琛屽彂鐢熷獎鍝嶃?/p>
姝e洜涓鴻繖涓師鍥狅紝鏃犵姸鎬佺殑Job鍙互騫跺彂鎵ц錛岃屾湁鐘舵佺殑StatefulJob涓嶈兘騫跺彂鎵ц錛岃繖鎰忓懗鐫濡傛灉鍓嶆鐨凷tatefulJob榪樻病鏈夋墽琛屽畬姣曪紝涓嬩竴嬈$殑浠誨姟灝嗛樆濉炵瓑寰咃紝鐩村埌鍓嶆浠誨姟鎵ц瀹屾瘯銆傛湁鐘舵佷換鍔℃瘮鏃犵姸鎬佷換鍔¢渶瑕佽冭檻鏇村鐨勫洜绱狅紝紼嬪簭寰寰鎷ユ湁鏇撮珮鐨勫鏉傚害錛屽洜姝ら櫎闈炲繀瑕侊紝搴旇灝介噺浣跨敤鏃犵姸鎬佺殑Job銆?/p>
濡傛灉Quartz浣跨敤浜嗘暟鎹簱鎸佷箙鍖栦換鍔¤皟搴︿俊鎭紝鏃犵姸鎬佺殑JobDataMap浠呬細鍦⊿cheduler娉ㄥ唽浠誨姟鏃朵繚鎸佷竴嬈★紝鑰屾湁鐘舵佷換鍔″搴旂殑JobDataMap鍦ㄦ瘡嬈℃墽琛屼換鍔″悗閮戒細榪涜淇濆瓨銆?/p>
JobDataMap瀹炰緥涔熷彲浠ヤ笌涓涓Е鍙戝櫒鐩稿叧鑱斻傝繖縐嶆儏鍐典笅錛屽浜庡悓涓浣滀笟鐨勪笉鍚岃Е鍙戝櫒錛屾垜浠彲浠ュ湪JobDataMap涓坊鍔犱笉鍚岀殑鏁版嵁錛屼互渚夸綔涓氬湪涓嶅悓鏃墮棿鎵ц鏃惰兘澶熸彁渚涙洿涓虹伒媧葷殑鏁版嵁鏀寔錛堝鏍′笂鍗堟斁鐪間繚鍋ユ搷褰曢煶絎竴鐗堬紝涓嬪崍鏀劇浜岀増錛夈?/p>
涓嶇鏄湁鐘舵佽繕鏄棤鐘舵佺殑浠誨姟錛屽湪浠誨姟鎵ц鏈熼棿瀵筎rigger鐨凧obDataMap鎵鍋氱殑鏇存敼閮戒笉浼氳繘琛屾寔涔咃紝涔熷嵆涓嶄細瀵逛笅嬈$殑鎵ц浜х敓褰卞搷銆?/p>
鐪嬩綘褰撳墠鐨凧VM鏈澶у彲鐢ㄥ埌澶氬皯鍐呭瓨錛岀敤濡備笅鍛戒護錛?java -Xmx澶氬ぇ鍐呭瓨m -version
涓瀹氳鍦ㄥ澶у唴瀛樺悗闈㈠姞涓妋鍝︼紝瑕佷笉瀹冭涓烘槸瀛楄妭KB鍛紝浼氭姏閿欑殑
棣栧厛鍒涘緩紺轟緥鐨勭幆澧冿紝
涓嬮潰浠嬬粛鐨勬槸鏈鍩虹鐨勮漿鎹㈠櫒錛岄鍏堝垱寤轟竴涓狿erson綾伙細
package com.thoughtworks.xstream.examples; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
鎺ョ潃錛屾垜浠垱寤轟竴涓疄渚嬶紝騫惰漿鍖栦粬錛?/p>
package com.thoughtworks.xstream.examples; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class PersonTest { public static void main(String[] args) { Person person = new Person(); person.setName("Guilherme"); XStream xStream = new XStream(new DomDriver()); System.out.println(xStream.toXML(person)); } }
濡備綘鎵鏂欙紝寰楀埌涓嬮潰鐨勭粨鏋滐細
<com.thoughtworks.xstream.examples.Person> <name>Guilherme</name> </com.thoughtworks.xstream.examples.Person>
涓嬮潰鎴戜滑涓簆erson綾誨垱寤轟竴涓埆鍚嶏細
XStream xStream = new XStream(new DomDriver()); xStream.alias("person", Person.class); System.out.println(xStream.toXML(person));
鐜板湪鐨勭粨鏋滃氨寰堟槗璇諱簡錛?/font>
<person> <name>Guilherme</name> </person>
鍒版錛屾垜浠凡緇忓緩绔嬪ソ涓涓彲浠ヤ緵鎴戜滑瀹為獙鐨勫熀紜渚嬪瓙浜嗭紝涓嬮潰鎴戜滑鏉ョ湅鐪媂Stream鐨勮漿鎹㈠櫒鑳戒負鎴戜滑鍋氫簺浠涔堬細
2錛屽垱寤轟竴涓狿erson杞崲鍣細
涓嬮潰鎴戜滑鏉ュ垱寤轟竴涓畝鍗曠殑杞崲鍣紝瀹冭兘錛?br />
1錛岀敤鏉ヨ漿鎹erson綾?br />
2錛屽皢Person瀹炰緥杞崲鎴怷ML
3錛屽皢xml杞崲涓篜erson瀹炰緥
棣栧厛鍒涘緩涓涓狿ersonConverter綾伙紝騫惰榪欎釜綾誨疄鐜癈onverter鎺ュ彛錛?/p>
package com.thoughtworks.xstream.examples; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class PersonConverter implements Converter { public boolean canConvert(Class clazz) { return false; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { return null; } }
涓嬮潰錛屾垜浠鍏堝憡璇夎漿鎹㈠櫒錛屾垜浠彧鑳借漿鎹erson綾伙紝鑰屼笉鏄埆鐨勭被錛屽寘鎷叾瀛愮被錛?/font>
public boolean canConvert(Class clazz) { return clazz.equals(Person.class); }
榪欎竴姝ュ緢綆鍗曪紝闄ら潪浣犳槸鐢ㄦ潵澶勭悊娉涘瀷鐨勮漿鎹㈠櫒鏄細鍥伴毦涓鐐廣?/font>
Marshal鏂規硶鏄敤鏉ュ皢瀵硅薄杞崲涓篨ML鐨勶紝浠栨湁涓変釜鍙傛暟錛?br />
1錛屾垜浠噯澶囪漿鎹㈢殑瀵硅薄
2錛屾垜浠噯澶囪緭鍑哄璞$殑writer
3錛屽綋鍓嶇殑marshaling context
棣栧厛鎴戜滑灝唎bject杞崲鎴怭erson
Person person = (Person) value;
鎺ョ潃錛屾垜浠氨鍙互寮濮嬭緭鍑烘暟鎹簡錛岄鍏堟垜浠垱寤轟竴涓彨鍋歠ullname鐨勮妭鐐癸紝騫跺皢person鐨勫悕瀛椾紶緇欎粬錛?/font>
writer.startNode("fullname"); writer.setValue(person.getName()); writer.endNode();
鍛靛懙锝炲緢綆鍗曞惂錛?/font>
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Person person = (Person) value; writer.startNode("fullname"); writer.setValue(person.getName()); writer.endNode(); }
鎴戜滑鍙互浠繪剰嬈℃暟鐨勮皟鐢╯tart/end node鏂規硶錛屼絾闇瑕佽浣忥紝浣犲繀欏誨湪鎵撳紑涓涓妭鐐逛箣鍚庤浣忓叧闂畠銆備竴鑸潵璇達紝鎵ц杞崲鐨勬搷浣滃湪setValue鏂規硶璋冪敤鏃跺彂鐢熴?br /> 涓嬮潰錛屾垜浠繘鍏nmarshal鏂規硶錛屾垜浠嬌鐢╩oveDown鍜宮oveUp鏂規硶鍦ㄨ妭鐐規爲灞傛涓Щ鍔紝鎵浠ワ紝榪欓噷鎴戜滑鍙渶瑕佺畝鍗曠殑moveDown錛屽緱鍒板鹼紝鍐峬oveUp錛?/font>
Person person = new Person(); reader.moveDown(); person.setName(reader.getValue()); reader.moveUp();
鏈鍚庯紝鎴戜滑寰楀埌浜嗕竴涓繖鏍風殑杞崲鍣細
package com.thoughtworks.xstream.examples; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class PersonConverter implements Converter { public boolean canConvert(Class clazz) { return clazz.equals(Person.class); } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Person person = (Person) value; writer.startNode("fullname"); writer.setValue(person.getName()); writer.endNode(); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Person person = new Person(); reader.moveDown(); person.setName(reader.getValue()); reader.moveUp(); return person; } }
鎺ョ潃錛屾垜浠湪鎴戜滑鐨刴ain鏂規硶涓敞鍐岃繖涓漿鍖栧櫒錛?/p>
package com.thoughtworks.xstream.examples; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class PersonTest { public static void main(String[] args) { Person person = new Person(); person.setName("Guilherme"); XStream xStream = new XStream(new DomDriver()); xStream.registerConverter(new PersonConverter()); xStream.alias("person", Person.class); System.out.println(xStream.toXML(person)); } }
娉ㄦ剰鍒版垜浠庝箞娉ㄥ唽鎴戜滑鐨勮漿鎹㈠櫒浜嗕箞錛熷彧闇瑕佷笅闈㈢畝鍗曠殑涓鍙ワ細
xStream.registerConverter(new PersonConverter());
鏈緇堝緱鍒扮殑緇撴灉鏄細
<person>
<fullname>Guilherme</fullname>
</person>
涔熻浣犱細璇達細榪欏彧鏀瑰彉浜嗘垜杈撳嚭鐨勬爲錛屾垜闇瑕佺敤瀹冩潵杞崲鏁版嵁銆?br />
涓嬮潰鎴戜滑鏉ュ皾璇曞湪person鏍囩涓垱寤轟竴涓彨鍋歠ullname鐨勫睘鎬э紝鑰屼笉鏄柊鍒涘緩涓涓妭鐐癸細
3錛屼竴縐嶅彲閫夌殑鏂瑰紡錛?br />
棣栧厛錛屼負Person鍒涘緩涓涓猼oString鏂規硶錛岄噷闈㈠寘鍚簡鎵鏈夎兘鐢ㄦ潵閲嶆柊鍒涘緩涓涓狿erson瀹炰緥鐨勬暟鎹細
package com.thoughtworks.xstream.examples; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return getName(); } }
鐜板湪錛屾垜浠氨鑳芥妸鎴戜滑鐨勮漿鍖栧櫒綆鍐欎負錛?/font>
package com.thoughtworks.xstream.examples; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; public class PersonConverter extends AbstractSingleValueConverter { public boolean canConvert(Class clazz) { return clazz.equals(Person.class); } public Object fromString(String str) { Person person = new Person(); person.setName(string); return person; } }
鐜板湪錛岃緭鍑虹殑XML涔熶細鍙樺緱鏇存槗璇伙紙涓簆erson鍒涘緩鍒悕person涔嬪悗錛夛細
<person>Guilherme</person>
鍚嶅瓧鍙樻垚浜嗕竴涓唴緗殑鍊鹼紝鑰屼笉鏄竴涓崟鐙殑鑺傜偣銆?br />
4錛岃漿鎹ate錛?br />
鎴戜滑宸茬粡鐭ラ亾Converter鎺ュ彛鏄庢牱宸ヤ綔鐨勪簡錛岀幇鍦ㄦ垜浠潵鍒涘緩涓涓嬌鐢↙ocale瀵硅薄杞崲鏃墮棿鐨勮漿鎹㈠櫒錛?br />
鍦ㄦ垜浠殑杞崲鍣ㄦ瀯閫犳柟娉曚腑錛屾垜浠皢浼犲叆涓涓狶ocale瀵硅薄錛岃Locale瀵硅薄浼氫綔涓轟竴涓垚鍛樺睘鎬ц杞崲鍣ㄦ寔鏈夛細
package com.thoughtworks.xstream.examples; import java.util.Locale; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class DateConverter implements Converter { private Locale locale; public DateConverter(Locale locale) { super(); this.locale = locale; } public boolean canConvert(Class clazz) { return false; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { return null; } }
鐜板湪錛岃鎴戜滑鑳借漿鎹換浣曠戶鎵夸簡Calendar瀵硅薄鐨勭被錛?/font>
public boolean canConvert(Class clazz) {
return Calendar.class.isAssignableFrom(clazz);
}
棣栧厛錛屾垜浠潵灝咰alendar杞崲鎴愭湰鍦板寲鐨勫瓧絎︿覆錛氶鍏堟垜浠妸object杞寲鎴怌alendar,寰楀埌Date瀵硅薄錛屽茍浣跨敤DataFormatter鏉ュ緱鍒頒竴涓湰鍦板寲鐨勬椂闂達細
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Calendar calendar = (Calendar) value; // grabs the date Date date = calendar.getTime(); // grabs the formatter DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, this.locale); // formats and sets the value writer.setValue(formatter.format(date)); }
鍙︿竴鏂歸潰錛屽湪unmarshall鏂規硶涓紝鎴戜滑鍒涘緩浜嗕竴涓狦regorianCalendar錛屽緱鍒版湰鍦板寲鐨凞ataFormat瀹炰緥錛屽皢瀛楃涓茶漿鎹㈡垚Date瀵硅薄錛屽茍璧嬪肩粰GregorianCalendar銆?/font>
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
// creates the calendar
GregorianCalendar calendar = new GregorianCalendar();
// grabs the converter
DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,
this.locale);
// parses the string and sets the time
try {
calendar.setTime(formatter.parse(reader.getValue()));
} catch (ParseException e) {
throw new ConversionException(e.getMessage(), e);
}
// returns the new object
return calendar;
}
娉ㄦ剰錛?br /> 1錛岃浣忎竴浜汥ataFormat瀹炵幇涓嶆槸綰跨▼瀹夊叏鐨勶紝鎵浠ワ紝涓嶈璁╀綘鐨勮漿鎹㈠櫒鎸佹湁DataFormat鐨勫紩鐢?br /> 2錛屽湪緇忚繃浜嗕繚瀛樺拰鍔犺澆鐨勮繃紼嬪悗錛岃杞崲鍣ㄥ彲浠ュ皢鍏朵粬Calendar瀹炵幇杞崲涓篏regorianCalendar銆傚鏋滆繖涓嶆槸浣犲笇鏈涚殑錛屽彧闇瑕佷慨鏀筩anConvert鏂規硶錛屽茍鍦ㄧ被鍨嬪彧鏈変負GregorianCalendar鐨勬椂鍊欏啀榪斿洖true銆?br /> 鐜板湪錛屾垜浠緱鍒頒簡涓嬮潰榪欎釜杞崲鍣細
package com.thoughtworks.xstream.examples; import java.text.DateFormat; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import com.thoughtworks.xstream.converters.ConversionException; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class DateConverter implements Converter { private Locale locale; public DateConverter(Locale locale) { super(); this.locale = locale; } public boolean canConvert(Class clazz) { return Calendar.class.isAssignableFrom(clazz); } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Calendar calendar = (Calendar) value; Date date = calendar.getTime(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, this.locale); writer.setValue(formatter.format(date)); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { GregorianCalendar calendar = new GregorianCalendar(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, this.locale); try { calendar.setTime(formatter.parse(reader.getValue())); } catch (ParseException e) { throw new ConversionException(e.getMessage(), e); } return calendar; } }
鐜板湪錛屾垜浠潵嫻嬭瘯涓涓嬶紝鍒涘緩涓涓猰ain鏂規硶錛?br />
1錛屽垱寤轟竴涓猚alendar錛?br />
2錛屽垱寤篨Stream瀵硅薄
3錛屾敞鍐岃杞崲鍣紝騫朵嬌鐢˙razilian Portuguese鏈湴鍖栧璞?br />
4錛屽皢瀵硅薄杞寲鎴怷ML
浠g爜濡備笅錛?/font>
package com.thoughtworks.xstream.examples; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class DateTest { public static void main(String[] args) { // grabs the current date from the virtual machine Calendar calendar = new GregorianCalendar(); // creates the xstream XStream xStream = new XStream(new DomDriver()); // brazilian portuguese locale xStream.registerConverter(new DateConverter(new Locale("pt", "br"))); // prints the result System.out.println(xStream.toXML(calendar)); } }
鍙互寰楀埌綾諱技濡備笅鐨勭粨鏋滐細
<gregorian-calendar>Sexta-feira, 10 de Fevereiro de 2006</gregorian-calendar>
娉ㄦ剰錛屾垜浠病鏈変負GregorianCalendar鍒涘緩浠諱綍鍒悕錛岃実regorian-calendar灝辨槸榛樿鐨勫悕瀛椼?br />
涓嬮潰鎴戜滑鏉ヨ瘯璇晆nmarshal 鏂規硶錛?/p>
// loads the calendar from the string
Calendar loaded = (Calendar) xStream
.fromXML("<gregorian-calendar>Sexta-feira, 10 de Fevereiro de 2006</gregorian-calendar>");
鐒跺悗鎵撳嵃鍑鴻鏃ユ湡錛?/p>
// prints using the system defined locale
System.out.println(DateFormat.getDateInstance(DateFormat.SHORT).format(
loaded.getTime()));
寰楀埌鐨勭粨鏋滀負錛?/p>
2/10/06
5錛屽鏉傜殑杞崲鍣細
鍒涘緩鍙︿竴涓緥瀛愶細
鎴戜滑宸茬粡鍒涘緩浜嗕袱涓璞′簡錛岀幇鍦ㄦ妸瀹冧滑緇勫悎璧鋒潵錛?/p>
package com.thoughtworks.xstream.examples; public class Birthday { private Person person; private Calendar date; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public Calendar getDate() { return date; } public void setDate(Calendar date) { this.date = date; } }
瑕佽漿鎹㈣綾伙紝XStream涓鐐歸棶棰橀兘娌℃湁銆傝繖閲岋紝鎴戜滑瀹炵幇鑷繁鐨勮漿鎹㈠櫒涓昏鏄負浜嗛獙璇侊紝鍦ㄨ繖閲岋紝鎴戜滑鎯抽噸鐢ㄦ垜浠垰鎵嶇殑PersonConverter鍜孋alendarConverter銆俢anConvert浠嶇劧寰堢畝鍗曪紝涓嶈繃榪欓噷錛屾垜浠笉闇瑕佸啀涓烘瘡涓涓睘鎬ч噸鏂板啓杞崲鏂規硶浜嗭紝鎴戜滑鍙渶瑕佷嬌鐢ㄥ凡緇忔敞鍐屼簡鐨勮漿鎹㈠櫒鏉ュ畬鎴愯漿鎹細
package com.thoughtworks.xstream.examples; import java.util.Calendar; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class BirthdayConverter implements Converter { public boolean canConvert(Class clazz) { return Birthday.class == clazz; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Birthday birthday = (Birthday)value; if (value.getPerson() != null) { writer.startNode("person"); context.convertAnother(value.getPerson()); writer.endNode(); } if (value.getDate() != null) { writer.startNode("birth"); context.convertAnother(value.getDate()); writer.endNode(); } } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Birthday birthday = new Birthday(); while (reader.hasMoreChildren()) { reader.moveDown(); if ("person".equals(reader.getNodeName())) { Person person = (Person)context.convertAnother(birthday, Person.class); birthday.setPerson(person); } else if ("birth".equals(reader.getNodeName())) { Calendar date = (Calendar)context.convertAnother(birthday, Calendar.class); birthday.setDate(date); } reader.moveUp(); } return birthday; } }
濡傛灉birthday瀹炰緥鑳藉紜繚涓嶄細鍑虹幇null鍊鹼紝閭d箞鎴戜滑灝卞彲浠ュ幓鎺塵arshal鍜寀nmarshal鏂規硶涓null鎯呭喌鐨勫垽鏂紝涔熶笉闇瑕佸驚鐜紝鑰岀洿鎺ユ牴鎹畉ag鐨勫悕瀛楄繘琛岃В鏋愶細
package com.thoughtworks.xstream.examples; import java.util.Calendar; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class BirthdayConverter implements Converter { public boolean canConvert(Class clazz) { return Birthday.class == clazz; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Birthday birthday = (Birthday)value; writer.startNode("person"); context.convertAnother(value.getPerson()); writer.endNode(); writer.startNode("birth"); context.convertAnother(value.getDate()); writer.endNode(); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Birthday birthday = new Birthday(); reader.moveDown(); Person person = (Person)context.convertAnother(birthday, Person.class); birthday.setPerson(person); reader.moveUp(); reader.moveDown(); Calendar date = (Calendar)context.convertAnother(birthday, Calendar.class); birthday.setDate(date); reader.moveUp(); return birthday; } }