2012年2月23日

CentOS 究竟該如何發音呢?


CentOS - The Community ENTerprise Operating System,
是在 Linux 中非常常被使用的一支。
但這個字如何發音引起許多人的爭論,
這篇就是要解釋他到底該怎麼發音!


支持不同發音的人都有他們自己的想法與信念,
像把他當成一整個字來念就念:sent - oss,
把 Cent 和 OS 兩個分開來念就變成:sent - ohh - ess,
也有人把 C 所代表的 Community 用 k 發音,
發音就變成了 kent - oss 或 kent - ohh - ess。

最終的解答出自這篇討論:How do you say "CentOS" ?
其中有人回覆了一個影片連結,
裡面是 CentOS 中的一個 Team Member 在說話,
看了影片後就知道他們內部的人是怎麼發音啦!

影片連結:http://video.google.com/videoplay?docid=8498828072523143942&hl=en



同樣的問題也發生在 Linux 身上,
下面的影片是由 Linux 的 creater Linus Torvalds 現身說法:


關鍵字:CentOS, pronounce, 正確, 正式, 發音, 念法, 音標

    2012年2月22日

    Hyper-V Snapshot 快照原理


    關於 Hyper-V Snapshot 相關概念及實作原理,
    找到一個頗專業的參考資料:http://itproctology.blogspot.com/search?q=snapshot
    有很多篇,之後有空再一篇一篇慢慢啃。

    圖片來源:http://shuiwuhen.pixnet.net/blog/post/8775112

    其他相關資料:
    1. Virtual Hard Disk (VHD) 規格、應用、效能介紹
    2. Virtual Machine Backup on Citrix XenServer:虛擬機器備份與快照
    關鍵字:Hyper-V, Snapshot, 快照

    2012年2月21日

    Java:針對Array中的值作排序


    上兩篇針對陣列與字串轉換、陣列移除重複項目作了介紹,
    有興趣可以先參考:
    1. Java:陣列與字串轉換,Array to String 和 String to Array
    2. Java:移除陣列Array中重複的值

    這篇則是要介紹如何對陣例中的值或字串作排序,
    排序的方法有很多種,
    好奇的話可以參考許久以前的文章,Sorting Algorithms:排序演算法
    當中有一段 youtube 上的影片,詳細地介紹了各種排序方法。

    下面的程式碼除了介紹把陣列中的項目作排序外,
    也同場加映利用 TreeSet 同時將陣列作排序及移除重複項目。
    適度地利用 Java 內建的資料結構,可以省下超多工喔!

     1 package werdna1222coldcodes.blogspot.com.demo.array;
     2 
     3 import java.text.ParseException;
     4 import java.util.Arrays;
     5 import java.util.Set;
     6 import java.util.TreeSet;
     7 
     8 public class ArraySortDemo {
     9 
    10     public static void main(String[] args) throws ParseException {
    11 
    12         // 建立有重複項目之 int array
    13         int intArray[] = { 4, 2, 5, 1, 5, 2, 4, 3 };
    14 
    15         // 利用 Arrays.sort 來排序
    16         // 輸出結果:[1, 2, 2, 3, 4, 4, 5, 5]
    17         arraySort(intArray);
    18 
    19         // 使用 
    20         TreeSet,同時達成排序和移除重複項目的需求。
    21         // 輸出結果:[1, 2, 3, 4, 5]
    22         treeSetSort(intArray);
    23     }
    24 
    25     static void arraySort(int[] array) {
    26 
    27         Arrays.sort(array);
    28         String arrayString = Arrays.toString(array);
    29         System.out.println(arrayString);
    30     }
    31 
    32     static void treeSetSort(int[] duplicateArray) {
    33 
    34         Set<Integer> intSet = new TreeSet<Integer>();
    35         for (int element : duplicateArray) {
    36             intSet.add(element);
    37         }
    38 
    39         int nonDuplicateAndSortedArray[] = new int[intSet.size()];
    40 
    41         Object[] tempArray = intSet.toArray();
    42 
    43         for (int i = 0; i < tempArray.length; i++) {
    44             nonDuplicateAndSortedArray[i] = (Integer) tempArray[i];
    45         }
    46 
    47         String arrayString = Arrays.toString(
    48                              nonDuplicateAndSortedArray);
    49         System.out.println(arrayString);
    50     }
    51 }
    

    更多關於 Java 的教學及程式範例,請見:
    Java 教學及程式範例大全

    關鍵字:Java, array, string, 陣列, 字串, 值, 排序,

    Java:移除陣列Array中重複的值


    隱隱感覺到發展為系列文的跡象,
    之前一篇介紹的是陣列與字串的轉換,
    連結在: Java:陣列與字串轉換,Array to String 和 String to Array 。
    而這一篇則是要簡單介紹一下如何移除陣列中重複的值或項目。


    要達到移除陣列中的重複項目,傳統的作法是另外建一個陣列,
    然後在每次把新項目加入之前檢查新陣列中是否已有應項目。
    上面的想法很直覺,但實作起來最難的地方應該是不知道新陣列該建多大,
    不過可以利用 ArrayList 加入項目後再轉為陣列即可。

    除了上面所說的方法外,下面的程式碼是直接利用 Set 中項目或值不會重複的特性,
    只要一個一個把值放進去,就可以自動移除重複的項目了!超簡單!

     1 package werdna1222coldcodes.blogspot.com.demo.array;
     2 
     3 import java.text.ParseException;
     4 import java.util.HashSet;
     5 import java.util.Set;
     6 
     7 public class ArrayRemoveDuplicateDemo {
     8 
     9     public static void main(String[] args) throws ParseException {
    10 
    11         // 建立有重複項目之 int array
    12         int duplicateArray[] = { 4, 2, 5, 1, 5, 2, 4, 3 };
    13         
    14         // 利用 Set 的特性,將所有項目放入 Set 
    15         中即可移除重複的項目
    16         Set<Integer> intSet = new HashSet<Integer>();
    17         for (int element : duplicateArray) {
    18             intSet.add(element);
    19         }
    20 
    21         // intSet.size() 為不重複項目的個數
    22         int nonDuplicateArray[] = new int[intSet.size()];
    23 
    24         // 將 Set 中的項目取出放到 nonDuplicateArray 中
    25         // 這裡也可以利用 iterator 來達成
    26         Object[] tempArray = intSet.toArray();
    27         for (int i = 0; i < tempArray.length; i++) {
    28             nonDuplicateArray[i] = (Integer) tempArray[i];
    29         }
    30 
    31         // 輸出結果:1, 2, 3, 4, 5, 
    32         for (int element : nonDuplicateArray) {
    33             System.out.print(element + ", ");
    34         }
    35     }
    36 }
    

    下一篇要介紹的是如何對陣列作排序,
    請見:Java:針對Array中的值作排序
    更多關於 Java 的教學及程式範例,請見:
    Java 教學及程式範例大全

    關鍵字: Java, array,  陣列, 重複, 輸出, 移除, 項目, 值, 數字, 字串, 物件
    參考資料:

    Java:陣列與字串轉換,Array to String 和 String to Array


    在 Java 中雖然有 ArrayList 等好用的 Collection 物件,
    但因為陣列簡單易用,寫程式時還是常常會用到。


    然而當我們在使用 Array 時,
    有時會有需求是將 Array 中的物件內容列印出來,
    這時我們就需要將 Array 轉換為字串,
    雖然我們可以用 for 或 iterator 自己拼出字串,但其實還有更快的方法!

    除了把陣列轉換為字串外,從另一方面來看,
    我們也會有將 Array String 重新轉換成 Array 的需求。
    以下的程式碼以簡單的 int array 為例,
    說明 Array to String 和 String to Array 的轉換方式。
    若使用的不是 int,則在程式中修改為所想要的 object type 即可。

    以下為程式碼及說明:
     1 package werdna1222coldcodes.blogspot.com.demo.array;
     2 
     3 import java.text.ParseException;
     4 import java.util.Arrays;
     5 
     6 public class ArrayStringConvertDemo {
     7 
     8     public static void main(String[] args) throws ParseException {
     9 
    10         // 建立有重複項目之 int array
    11         int intArray[] = { 4, 2, 5, 1, 5, 2, 4, 3 };
    12 
    13         // 將 int array 轉換成 array string
    14         String arrayString = intArrayToArrayString(intArray);
    15 
    16         // 將剛剛產生之 array string 再轉為 int array
    17         arrayStringToIntArray(arrayString);
    18     }
    19 
    20     static String intArrayToArrayString(int[] array) {
    21 
    22         // 利用 Arrays.toString 可以超簡單輸出 array
    23         // 輸出結果:[4, 2, 5, 1, 5, 2, 4, 3]
    24         String arrayString = Arrays.toString(array);
    25         System.out.println(arrayString);
    26         return arrayString;
    27     }
    28 
    29     static void arrayStringToIntArray(String arrayString) {
    30         
    31         // 將剛剛輸出之 array string 先作去頭去尾處理
    32         // 並用 split 來分開各個項目
    33         String[] items = arrayString.replaceAll("\\[", "")
    34                 .replaceAll("\\]", "").split(",");
    35         
    36         // items.length 是所有項目的個數
    37         int[] results = new int[items.length];
    38 
    39         // 將結果放入 results,
    40         // 並利用 Integer.parseInt 來將整數字串轉換為 int
    41         for (int i = 0; i < items.length; i++) {
    42             results[i] = Integer.parseInt(items[i].trim());
    43         }
    44 
    45         // 此時已將字串轉換至 results 中,
    46         // 但為了檢查,我們還是要把 results 印出來。
    47         // 輸出結果:4, 2, 5, 1, 5, 2, 4, 3, 
    48         for (int element : results) {
    49             System.out.print(element + ", ");
    50         }
    51     }
    52 }
    

    除了用上面的程式碼轉換外,
    用 Json 也可以達成類似的轉換方式,
    這我會在後續再補上教學連結。

    另外關於陣列,後面還有兩篇教學可以參考:
    1. Java:移除陣列Array中重複的值
    2. Java:針對Array中的值作排序
    更多關於 Java 的教學及程式範例,請見:
    Java 教學及程式範例大全

    關鍵字:Java, array, string, 陣列, 字串, 轉換, 輸出, convert,
    參考資料:

    2012年2月20日

    博客來AP策略聯盟商品推薦連結自動轉換工具


    大約兩個月前寫了部落格廣告賺錢術(二)
    當中曾推薦「博客來AP策略聯盟」,
    而在使用博客來 AP 策略聯盟時必須登入網站
    銷售連結產生器頁面將商品連結轉換成自己的銷售連結。
    如商品連結:http://www.books.com.tw/exep/prod/booksfile.php?item=0010522255
    轉換後會變成:
    http://www.books.com.tw/exep/assp.php/your_ap_id/exep/prod/booksfile.php?item=0010522255
    這種轉換雖然不難,但久而久之還是會覺得麻煩,
    如果可以在寫文章時直接貼上連結而不用轉換,那該有多好呢?


    為了讓自己方便點,我參考了無敵貼紙一文,
    研究後改寫出下面的程式,稱之為「博客來AP策略聯盟商品推薦連結自動轉換工具」XD
    現在只要在部落格或網站頁面中插入下面這一段 javascript,
    並將紅色的部份改為自己的 AP 推薦帳號,
    就可以在使用者點擊博客來連結時,
    自動將使用者導向我們 AP帳號的推薦連結了!

    <script language="JavaScript"><!-- 
    booksap_id = 'your_ap_id'; 
    //--></script>
    
    <script type="text/javascript" src="http://dl.dropbox.com/u/38084735/blog/werdna1222coldcodes/booksap.js"/></script>
    

    除了將商品連結轉換為推薦連結外,
    這個工具也可以自動將舊的推薦連結更新為新的,
    例如放在部落格上的是舊 AP 帳號的推薦連結,
    在使用這個工具後他將在使用者點擊時自動轉成新帳號的推薦連結,
    讓我們不用到舊的推薦文章中一個一個把連結更改過來,
    這對帳號轉換或無法續約時非常有用喔!

    以下來舉個轉換的例子,假設是先前火紅的「賈伯斯傳」的連結,
    當我們設定了以上的 javascript 後,無論我們直接放上商品連結,
    http://www.books.com.tw/exep/prod/booksfile.php?item=0010522255
    或是另一個帳號的推薦連結,
    http://www.books.com.tw/exep/assp.php/oldid/exep/prod/booksfile.php?item=0010522255
    在使用者點下連結後都會直接連到新的推薦連結去,
    http://www.books.com.tw/exep/assp.php/newid/exep/prod/booksfile.php?item=0010522255
    是不是很方便呢?

    檢查是否安裝成功的方式:
    1. 點下連結後再重新將滑鼠游標移回連結上,看看顯示的連結是不是新的:
      若有就是工具已安裝成功,請注意推薦帳號對不對。
    2. 點下連結後看看新頁面的網址有沒有出現 &
      如:http://www.books.com.tw/exep/prod/booksfile.php?item=0010522255
      &
      若有就是有成功連到推薦連結。
    3. 點下連結後登入到博客來購物車,看看網頁的標題列上有沒有出現帳號:
      若有就是有連到推薦連結, 請注意推薦帳號對不對。

    如果以上三點都滿足,就是工具已安裝成功,
    且也可以成功將使用者導向我們的推薦連結囉!
    接下來就只要好好撰寫推薦的文章,讓買氣加溫,
    我們推薦的獎金就會滾滾而來囉!
    快加入 AP 會員然後安裝這個「博客來AP策略聯盟商品推薦連結自動轉換工具」吧!

    因這個工具還是初分享,若大家有遇上問題,
    或是成功安裝等心得,都歡迎分享給我知道喔!

    相關文章:
    部落格廣告賺錢術(一):Google Adsense、BloggerAds、BlogAD 收益比較
    部落格廣告賺錢術(二):博客來AP策略聯盟、Yahoo!奇摩購物中心大聯盟計畫平台、PChome商店街分紅網

    更多外掛如相關文章推薦輪播、部落格廣告賺錢、社群網站外掛等,請見總整理文章:
    Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪


    關鍵字:分紅, 收入, 收益, 獎金, 博客來, AP, 策略聯盟, 推薦連結, 轉換, 工具, 貼紙, 商品, 全自動,
    參考資料:

    2012年2月9日

    開放原始碼(開源)授權(Open Source License)比較:GPL, LGPL, BSD, Apache, MIT


    開放原始碼 (開源碼, open source) 當初被設計出來的理念非常崇高,
    甚至可以說作者是帶著理想而設計出這樣子的授權(協議, License)。


    相信大家或多或少都聽說過開放原始碼的好處,
    藉由每個人讓自己的程式碼透過網路在世界自由流通,
    讓程式可以被全世界有著同樣理念的 programmer 檢視、修正及改進,
    將可以讓程式與軟體的撰寫、修正更快、更加安全,
    規模也不再限於單人的能力,而可以發展出更大的系統。

    然而雖然每個人都想自由地分享各自的程式,
    但其實大家背後真正的想法還是會不同,
    例如有人什麼也不想要,只要這個程式能更好更多人用即可;
    有的則想要留下名聲,讓每個使用的人都知道原作者是誰;
    有的則又規定這套程式一定不可以被拿來賣錢等等。

    因為有太多這些複雜的因素,加上 programmer 又很討厭法律事,
    為了讓開放原始碼可以更簡單更容易,
    便開始有個人、單位或組織建立了開源授權協議 (Open Source License),
    目前常用的大多已經過 Open Source Initiative 核準,
    核準後的授權協議書全文都可以在 Open Source Licenses 上找到。

    若不熟悉英文,或覺得看英文加法律實在太痛苦了!
    台灣也有個自由軟體鑄造場 (Open Source Software Foundry,簡稱 OSSF)
    網站中針對常見的 Open Source License 都有全文翻譯,大家可以去看看。
    目前最常見也最常被討論及使用的 License 有 GPL, LGPL, BSD, Apache, MIT 等。


    GNU General Public License 2.0(GPL)
    GPL 是 License 中最具開放原始碼精神的,
    然而他在崇尚自由之時,也要求(強迫)所有人一起崇尚自由,
    病毒式的感染、傳染常被用來形容 GPL
    因為所有只要「引用/修改/衍生自 GPL 授權程式碼的軟體也必須採用GPL授權」
    且要求未來所有的使用者、開發者也必須採用同樣的條款。

    基於這樣的限制,所以商業軟體或是不打算公開程式碼的軟體和 GPL不可以有任何牽連,
    否則受到感染後就只能依 GPL 規定開放原始碼了。
    著名的GPL自由軟體包括Linux核心和GCC等。


    GNU Lesser General Public License 2.1(LGPL)
    由於 GPL 的條款實在是太嚴格了,間接也會影響到程式碼的被採用率,
    因此後來也出現了針對放寬 GPL 部份限制後的授權版本,即 LGPL,
    二者最大的差異是在「引用」的部份。
    若只在程式中引用了採用 LGPL 授權程式的函式庫,
    而沒有針對該程式進行修改或衍生,
    則依據 LGPL 的條款,引用函式庫的程式便不需要公開程式碼。

    和 GPL 比起來,在 LGPL 的授權下,
    商業軟體可以引用 LGPL 的函式庫,藉由函式庫提供的功能來開發軟體,
    不過對於剛剛提到的「修改/衍生」LGPL 授權的部分,
    則同樣必須採用 LGPL 的授權,同樣需要公開原始碼。
    著名的 LGPL 自由軟體有 OpenOffice.Org。


    至於其他三種:
    BSD License(BSD)MIT License(MIT)Apache License 2.0(Apache 2.0)
    都是股勵原始碼分享、允許代碼修改、衍生再發佈(開源或商業軟體皆可),
    並且注重原始作者著作權的授權,通常需要附上原始授權及部份聲明文件,
    但修改者可適度修改所採用的授權內容以符合自身需求。
    至於其中的區別,再看看有沒有人可以補充說明,感謝 ^^

    關鍵字:開放原始碼, 開源, 授權, Open Source License, 比較, 說明, 介紹, GPL, LGPL, BSD, Apache, MIT, 軟體, 採用
    參考資料:

    2012年2月8日

    如何在 Excel 儲存格中輸入及查詢取代換行?


    從小到大用了 10 幾年的 Excel 了,
    一直以來似乎也用得很上手很習慣,不曾出過什麼大包。
    但今天竟然遇上一個感覺超容易但卻一直無法解決的問題:
    「到底該怎麼在 Excel 的儲存格中換行呢?」


    一直以來我們習以為常的換行,
    要嘛就是直接按 Enter,頂多是 Word 裡頭還會用到 Shift + Enter
    但今天怎麼試都沒有用,google 查了以後才發現原來是要用 Alt + Enter 啊!

    另外因為換行看不到實際的文字,
    在尋找及取代時也是一樣直接按下 Alt + Enter 喔!
    大家可以馬上開個 excel 來試試玩看看。

    關鍵字:excel, 換行, 符號, 字元, 儲存格, 指令, 取代, 尋找, 搜尋, 查詢
    參考資料:

    2012年2月5日

    在網頁中嵌入顯示程式碼:全系列效果比較及教學整理








    在網頁嵌入程式碼這系列不知不覺也寫了不少,
    如果都只看單篇的話很難比較出每種顯示的效果有何不同,
    因此這一篇就是要在不同的設定中使用同一段程式碼,
    直接讓大家看看效果的差異,也方便大家選用!


    在網頁中嵌入顯示程式碼:HighLight 軟體
    使用 HighLight 的好處是可以產生類似各 IDE 的顏色組合,
    像下面的配色是不是讓我們想起了 eclipse 呢?
     1 public class HelloWorld {
     2 
     3     public static void main (String[] args) {
     4         System.out.println("Hello, world!");
     5     }
     6 }
    

    在網頁中嵌入顯示程式碼:CSS Block
    相當簡潔的顯示方式,適合只有一兩行或一小段程式、設定檔使用。
    public class HelloWorld {
    
        public static void main (String[] args) {
            System.out.println("Hello, world!");
        }
    }

    在網頁中嵌入顯示程式碼:Google Code Prettify
    透過這個也可以為程式碼上色,且不用像 HighLight 一樣要手動轉換。
    public class HelloWorld {
    
        public static void main (String[] args) {
            System.out.println("Hello, world!");
        }
    }

    在網頁中嵌入顯示程式碼:CSS Block + Google Code Prettify
    把 CSS Block 和 Google 上色結合起來效果似乎也很不錯,
    而且設定超簡單,幾乎不用額外設定!教學請見連結文章的最下面處!
    public class HelloWorld {
    
        public static void main (String[] args) {
            System.out.println("Hello, world!");
        }
    }

    在網頁中嵌入顯示程式碼:Pastie
    直接在線上網站貼上程式碼,之後只要在文章中嵌入一段 script 即可,
    對作者而言最簡單方便的方法,不過好像會有超出版面的可能。

    以上就是我目前整理出來所有顯示程式碼的效果,
    大家可以參考比較後選擇自己比較喜歡的,
    然後再進到每一篇中去參考詳細的設定教學喔!

    更多部落格外掛,請參考:
    Blog Plugins:部落格外掛大全整理,什麼都有、什麼都不奇怪
    其他總整理類型的文章請見:大全中的大全,文章總整理index

    關鍵字:程式碼, 顯示, 網頁, 文章, 內嵌, 嵌入, 放入, 部落格, blog, blogger, css, 總整理, 推薦, 教學, 語法, 上色

      在網頁中嵌入顯示程式碼:Pastie


      (2012.02.05更新)
      全系列顯示效果比較已完成,可參考:
      在網頁中嵌入顯示程式碼:全系列效果比較及教學整理
      選擇自己較想要的效果後再進入單篇文章看每種外掛的設定教學。

      在前三篇中已介紹了不同的嵌入顯示程式碼的方式,
      分別是用 HighLightCSS BlockGoogle Code Prettify 來達成,
      但他們的設定可能都需要一些步驟,比較麻煩。

      在現在什麼都講求網路化、雲端化的時代,
      連 PDF、PPT、Word 都已經可以被放在網路上了,
      (請參考 Scribd:將PDF、PPT、DOC嵌入放上BLOG)
      要將程式碼放上網路再嵌入至部落格文章中當然也是輕而易舉,
      這篇我們要介紹的就是 Pastie 這個網站。


      使用的方式因為太簡單了我就不截圖教學了,
      進入網站後可以直接貼上程式碼,
      並於右上角選擇你的程式語言是什麼(這會影響語法顏色),
      接著按下右下角的 paste,也可以上鎖!

      按下後便產生一串網址,網址可以直接跟別人分享,
      這樣別人就可以看到我們的程式並馬上與我們討論,相當方便。
      一樣在右上角可以選擇不同的顏色組合,挑選自己想要的話,
      在右方 Embed 處可以複製 script 語法,
      將語法貼到文章中就可以成功顯示囉!

      效果如下:


      關鍵字:程式碼, 顯示, 網頁, 文章, 內嵌, 嵌入, 放入, 部落格, blog, blogger, css, 總整理, 推薦, 教學, 語法, 上色

      2012年2月1日

      Quartz in Spring:使用多個Scheduler的參數設定


      多數人在使用 Quartz 時一開始都只使用一個 Scheduler,
      而且通常也只執行一個排程,
      然而隨著經驗累積、project變大、需求變多,
      慢慢地也會出現要執行多個排程工作的需求。
      這篇就是要解釋如何在 Spring 的 xml 設定檔中達成這個目的。


      在開始多個排程設定前我們先來複習一下單一排程工作的設定:
      下面 xml 中整體的概念其實是由 schedulerFactoryBean 抓到預設的 scheduler,
      讓預設的 scheduler ,執行排程 cronTrigger,而排程執行的目標是 jobDetail
      也就是 targetClass 中 executeMethod 要做的事

      以下由 xml 依序解釋每個段落的設定有何意義:
      第一行是要讓 Spring 抓到 targetClass 的 Bean,
      下面一段則是定義要執行的工作 jobDetail
      這個工作的目標為 targetClass 中的 executeMethod

      接著設定一個排程 cronTrigger 來執行 jobDetail
      藉由設定 cronExpression 可以調整要執行的時間,
      而最下面則是利用 schedulerFactoryBean 抓到名字是空字串的預設 Scheduler,
      預設 Scheduler 就是實際去執行排程的執行者,可以執行不只一個排程
      <bean id="targetClass" class="my.project.class"/>
      
      <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <property name="targetObject" ref="targetClass"/>
          <property name="targetMethod" value="executeMethod"/>
      </bean>
      
      <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail" ref="jobDetail"/>
          <!-- 每星期天 0:00 分執行-->
          <property name="cronExpression" value="0 0 0 ? * SUN"/>
      </bean>
      
      <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
              <list>
                  <ref bean="cronTrigger"/>
              </list>
          </property>
      </bean>

      看完上面的設定我們可以發現一個結論,
      其實一個 Scheduler 就能執行多個排程了。
      只要在 triggers 的 list 中插入更多的 trigger 即可!
      <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
              <list>
                  <ref bean="cronTrigger"/>
                  <ref bean="cronTrigger2"/>
                  <ref bean="cronTrigger3"/>
              </list>
          </property>
      </bean>

      但有時我們還是會需要多個 Scheduler,
      因為大家都使用預設的 scheduler 時,
      若有某模組停用了這個 scheduler,則所有的排程都會停下來。
      所以為了安全起見,最好還是用不同的 scheduler。

      那麼依照上面 xml 檔的設定要怎麼加多個 scheduler 呢?
      按照設定檔來看,大家一開始的直覺可能就是多放幾個schedulerFactoryBean
      然而這種想法是沒有用的!
      原因是因為SchedulerFactoryBean是透過StdSchedulerFactory回傳 scheduler ,
      而且每個 Scheduler都是是註冊在SchedulerRepository中。
      而 SchedulerRepository中是用一個 MAP 存放所有的  scheduler ,
      並依據 scheduler 的 name 當成 key 來找到 scheduler。

      所以就算我們有多個 schedulerFactoryBean
      仍然會透過相同的 SchedulerRepository 來尋找 scheduler,
      但我們用的都是以空字串為名的 scheduler,
      所以最終回傳的都會是同一個 scheduler,
      即使我們用多個 schedulerFactoryBean 也一樣。

      為了解決這個問題,我們要在每個 schedulerFactoryBean 的設定中,
      加入 schedulerName 這個參數,
      這樣就可以為這個 schedulerFactoryBean 找到的 scheduler 加上名字,
      而不是只用預設的空字串。
      名字不一樣後,每個 schedulerFactoryBean 當然就可以抓到各自的 scheduler 囉!
      設定方式如下:
      <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
              <list>
                  <ref bean="cronTrigger"/>
                  <ref bean="cronTrigger2"/>
                  <ref bean="cronTrigger3"/>
              </list>
          </property>
          <property name="schedulerName">
              <value>jobScheduler</value>
          </property>
      </bean>
      


      若想知道更多有關 Java 時間相關的轉換、排程、格式化輸出輸入等應用,
      還有更多有關 Quartz 的應用方式,請見:
      Java 時間日期處理範例大全:含時間單位格式轉換、期間計算、排程等


      關鍵字:job, jobDetail, 多個, 排程, 工作, 實例, instance, spring, quartz
      參考資料: