Develop Log - Print Service (Part I)

Architecture Background

Problem Background

企業intranet內的各種應用均可能需要作打印動作,包括標籤的打印,表單的打印,等等。考慮提供這樣一套組件,爲需要打印的系統提供遠程的或是本地的打印服務,以減小各系統的實現的複雜度及困難度,並可能對網絡內的打印作統一控管。組件叫做PrintService。

System Overview

PrintService 的作用,就是給客戶系統提供打印服務。如下圖示:










Driving Requirements

Functional Requirements

打印內容

    PrinvService應提供標籤跟表單的打印實現。支援目前客戶系統所出的各式標籤樣式及表單樣式。

使用方式

    PrintService應有2種使用方式,即Server ModeLirary Mode

Server Mode:

該模式下PrintService爲客戶系統提供遠程打印服務:獨立啓動PrintService後,接收遠端message 作分發打印。

Library Mode:

該模式下PrintService爲客戶系統提供本地打印服務。本地叫用時傳入messagePrintService 叫用MsgParser生成PrintRequest,而後

PrintService 直接將PrintRequest 交由PrintMsgHandler 作本地打印。
PrintService 再將PrintRequest 轉換爲XML格式返回,由Client自行選擇處理方式。

Quantity Requirement

PrintService應具有以下特性:

Platform Independent -- PrintService運行環境不侷限於Windows平臺。可以migrate到UNIX/Linux平臺,以利用該系列平臺的諸多優勢。

High Availability -- PrintService應滿足高可用性,適時響應客戶系統的打印需求。

High Reliability -- PrintService應滿足高可靠性,降低類似因網絡丟包而打印失敗狀況的機率。

High Performance -- PrintService應滿足高效能,能同時處理若干客戶系統的打印請求。

Architectural Approaches

Local Cache

相較於客戶系統的打印請求提交速率,PrintService對於打印請求的處理速率始終是一瓶頸。爲避免因客戶系統提交的請求過多造成網絡擁塞而致使應用崩潰,考慮在PrintService端提供本地緩存。即儘快將網絡中存在的消息取至本地,然後再行處理。另外由於本地緩存的引入勢必會給PrintService的運行造成額外的負擔,其機制也應作爲運行時的可選項爲宜。

Server Mode vs. Library Mode

考慮爲PrintService2種使用方式(Server ModeLibrary Mode)分別交付對應的Package。其中Server Mode下的Package應是完整模式的PrintService,包括其所有的組件,發佈後單獨啓動,響應客戶系統的遠程打印需求。而Library Mode下的Package則是部分模式的PrintService,僅包括其作爲Library使用的部分組件,發佈後接收客戶系統的本地叫用。


因爲Local Cache的引入,完整模式下的PrintService的運作模式可分爲Direct ModeData Cache Mode 2種。

Direct Mode

該模式下PrintService接收到message後,直接作轉派打印動作。





Data Cached Mode

該模式下,PrintListener 收到 message後只需把message存入embeded DB,而後由CachedMsgHandler負責分批取出作打印。



ps: PrintServiceException 需在界線兩邊分別throwcatch


Mapping Requirements to Architecture

The following use case diagram depicts the high-level system functional requirements:


Views (core部分)

Module Views

High Level Module View

Primary Presentation

總體來看,PrintService Server Mode 運作時的架構 如下:

Element Catalog

PrintService

PrintService爲程序入口,PrintService啓動時,則會將相關PrintListener叫起以備接收message

PrintListener

PrintListener收到message後,或是直接將message交由PrintMsgHandler處理,或是將message交由DBCache緩存起來然後由CachedMsgHandler分批取出再交給PrintMsgHandler處理。

PrintMsgHandler

PrintMsgHandler 被叫用時,使用PrintMsgParsermessage轉換得到PrintRequest,然後交由PrintServer處理。


以上各類實際運作時多以線程方式存在,相互配合以實現打印服務。

Variability Guide

定義接口PrintListener,以針對不同的網絡偵聽方式。如MQ, Mail, RMI, WS, etc.

定義接口PrintMsgParser,以針對不同的打印樣式請求。如shipping label, carton label, stock in sheet, etc.

定義接口PrintServer,以針對不同的打印模式,如標籤打印,表單打印,等等。

Related Views

Initialization Module

Message Receiving Module

Message Handling Module

Initialazation Module

Primary Presentation



Element Catalog

作初始化時,PrintService通過PrintServiceConfig讀取配置文件 printservice-config.xml 並緩存配置信息。然後根據配置要求啓動相應服務。

Message Receiving Module

Primary Presentation



Element Catalog

MQPrintListner

目前接口PrintListner 僅有1個實現即MQPrintListnerMQPrintListner可以接收MQ Message,收到後交由PrintMsgHandler處理,或是通過DBCache暫存。

DBCache

DBCache是一個工具類,封裝了對於javaDB的操作。

CachedMsgHandler

CachedMsgHandler 則通過DBCache分批取出暫存於javaDBmessage,轉而交由PrintMsgHandler處理。

Related Views

Message Handling Module

 

Message Handling Module

Primary Presentation



Element Catalog

PrintMsgHandler

處理打印message直至提交打印請求的類。

PrintMsgParser

PrintMsgHandler通過PrintMsgParserFactory創建對應的PrintMsgParser,然後由PrintMsgParser解析message生成PrintRequest

PrintServer

PrintMsgHandler通過PrintServerFactory創建對應的PrintServer,然後將PrintRequest交由PrintServer實現打印。

Printer

Printer在此僅是一個工具類。以其屬性isBlocked表徵PrintServer當前使用的Printer的狀態。目的是爲了避免不同PrintServer同時要向一個Printer打印而可能造成的衝突。打印的代碼實現事實上放在PrintServer裏面。

Variability Guide

PrintMsgParser部分的設計考慮需要支援足夠的可擴展性,未來即可依此架構開發各種PrintMsgParser來解析各式各樣的message以生成對應的PrintRequest

目前實現的PrintServerSheetPrintServer, LabelPrintServer,未來還可以此架構開發其它PrintServer來作不同目的的打印。

Related Views

Message Receiving Module




--END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章