新增TinyMessage,並實現郵件接收處理

序言

咱們在業務處理過程當中,常常要處理各類信息,好比:站內信息、郵件信息、還可能有短信、彩信,甚至可能與各類IM軟件進行對立的信息系統。 java

Tiny框架也須要面對這個問題,不同的是我以爲這幾種類型的信息處理模式都是同樣的,所以試圖採用統一的模式進行處理。 git

在開始以前,咱們先梳理一下需求: 框架

  1. 能夠支持各類信息系統如:短信,彩信,郵件,IM,站內信息的接收與發送
  2. 在接收或發送消息的時候能夠進行各類邏輯處理,好比:收到某種類型的郵件怎麼處理,收到某種內容的短信怎麼處理。
  3. 郵件收到的時候,能夠不刪除,能夠刪除,也能夠改爲已讀等各類狀態
  4. 發送郵件的時候,能夠附加各類附件,好比:來自文件的,來自內存的等等

概念抽象

所以,咱們就抽象了下面的幾個概念: spa

  • MessageAccount:接收信息或發送信息時,須要賬戶,所以抽象一個信息賬戶概念。
  • MessageReceiver:信息接收者
  • MessageSender:信息發送者
  • Message:要發送的信息,對應於郵件,短信,彩信之類
  • MessageReceiveService:用於提供信息發送服務
  • MessageSendService:用於提供信息接收服務
  • MessageException:用於在出現問題的時候,拋出異常
  • MessageSendProcessor:用於在發送信息的時候根據信息觸發一些操做
  • MessageReceiveProcessor:用於在接收信息的時候根據信息觸發一些操做
  • MessageManager:用於進行信息接收與發送

行爲分析

固然,上面的概念的創建不是爲了看看的,是要在咱們的信息框架中參與的,固然它們中的一些就有一些行爲,下面咱們就分析一下這些概念的行爲有哪些: .net

下面一個一個來分析一下: 設計

  • MessageAccount:因爲不一樣的信息模式,信息收發的賬號狀況,並不一致,所以這裏就只放個接口,沒有辦法進一步約束。一樣的,MessageSender,Message,MessageReceiver也同樣,所以,它們就是個空接口,把問題交給其後代來處理。
  • MessageReceiveServer:用於接收信息,只有一個方法,返回信息。
  • MessageSendService:用於發送信息,只有一個方法。
  • MessageSendProcessor:用於在發送信息的時候根據信息狀況觸發一些操做,一個方法用於判斷是否命中,一個進行真正的處理。
  • MessageReceiveProcessor:用於在接收信息的時候根據信息狀況觸發一些操做,一個方法用於判斷是否命中,一個進行真正的處理。
  • MessageManager:它實際上是對MessageReceiveService和MessageSendService的進一步封裝,在這裏提供了事件觸發的一些擴展。

在底層,只有MessageManager是有實現類的,即MessageManagerDefault,這也正常,因爲其它的都不肯定,因此就無法實現了。 code

到時爲此,信息處理的底層抽象與設計就算完成了。 接口

實現案例-Email收發

到了收發郵件,由於已是具體問題,所以上次留給子孫解決的問題,均可以解決了。 事件

因爲javax.email只是其中的一種可選方案,所以,在這裏沒有直接暴露任何與javax.email相關的接口,這樣就更方便針對不一樣郵件API進行實現。 內存

值得一提的是這裏引入了一個新的接口:

EmailMessageFlagMarker:用來在收郵件時對郵件的狀態進行不一樣的標示,這是由於不能簡單的把收到到的郵件標示成刪除或已讀,可能要根據許多種狀況進行判斷。

郵件收發實例

郵件接收

public static void main(String[] args) throws MessageException {
    MessageManager<EmailMessageAccount, EmailMessageSender, EmailMessageReceiver, EmailReceiveMessage> messageManager = new MessageManagerDefault();
    EmailMessageAccount account = new EmailMessageAccount();
    account.setHost("127.0.0.1");
    account.setUsername("luoguo@tinygroup.org");
    account.setPassword("123456");
    messageManager.setMessageAccount(account);
    EmailMessageReceiveService messageReceiveService = new EmailMessageReceiveService();
    MessageReceiveService receiveService=messageReceiveService;
    MessageSendService messageSendService = new EmailMessageSendService();
    messageManager.setMessageReceiveService(receiveService);
    messageManager.setMessageSendService(messageSendService);
    messageReceiveService.setEmailMessageFlagMarker(new RemoveAllEmailMessageFlagMarker());
    Collection<EmailReceiveMessage> messages = messageManager.getMessages();
    for (EmailReceiveMessage message : messages) {
        System.out.println("subject:" + message.getMessage().getSubject());
        System.out.println("content:" + message.getMessage().getContent());
        System.out.println("附件:" + message.getMessage().getAccessories().size());
        System.out.println("=============================================");
    }
}

郵件發送示例

public static void main(String[] args) throws IOException, MessageException {
    MessageManager<EmailMessageAccount, EmailMessageSender, EmailMessageReceiver, EmailMessage> messageManager = new MessageManagerDefault();
    EmailMessageAccount account = new EmailMessageAccount();
    account.setHost("127.0.0.1");
    account.setUsername("luoguo@tinygroup.org");
    account.setPassword("123456");
    EmailMessageSendService sendService = new EmailMessageSendService();
    EmailMessageSender messageSender = new EmailMessageSender();
    messageSender.setDisplayName("羅果");
    messageSender.setEmail("luoguo@tinygroup.org");
    EmailMessageReceiver messageReceiver = new EmailMessageReceiver();
    messageReceiver.setDisplayName("羅果");
    messageReceiver.setEmail("luog@tinygroup.org");
    EmailMessage emailMessage = new EmailMessage();
    emailMessage.setSubject("test1111111");
    emailMessage.setContent("中華人民共和國");
    EmailAccessory accessory = new EmailAccessory(new File("D:/RUNNING.txt"));
    emailMessage.getAccessories().add(accessory);
    messageManager.setMessageAccount(account);
    MessageReceiveService messageReceiveService = new EmailMessageReceiveService();
    MessageSendService messageSendService = new EmailMessageSendService();
    messageManager.setMessageReceiveService(messageReceiveService);
    messageManager.setMessageSendService(messageSendService);
    Collection<EmailMessageReceiver> receivers = new ArrayList<EmailMessageReceiver>();
    receivers.add(messageReceiver);
    messageManager.sendMessage(messageSender, receivers, emailMessage);
}
上面看起來比較複雜,實際是都是在構建Bean,若是是把Bean配在IOC容器中,就會很是簡單了。

總結

經過對各類信息的接收與發送進行分析,對信息處理進行了上層抽象,並簡單的進行實現就能夠實現各類信息的收發處理。

因爲對各類信息處理都採用了統一的接口,在須要進行各類信息都要進行接收或發送的時候,開發人員就會很是方便。

全部的源碼均可以在:http://git.oschina.net/tinyframework/tiny/tree/master/framework/org.tinygroup.message找到,感興趣的童鞋能夠前去查閱。

相關文章
相關標籤/搜索