系列文章目錄
- DCM4CHEE ARCHIVE LIGHT 源代碼解析(1)-前言
- DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS
文章目錄
- 系列文章目錄
- 概述
- 一、背景資料
- 1、RESTful服務
- 2、傳輸存儲規范
- 3、服務連接策略
- 4、響應消息狀態
- 二、業務分析
- 1、對象關系
- 2、項目結構
- 3、業務流程
- 三、代碼解析
- 1、writeToStorage() 方法
- 2、storeMetadata() 方法
- 3、updateDB() 方法
- 4、postUpdateDB() 方法
- 寫在結尾
概述
??本文嘗試通過跟蹤調試,閱讀dcm4chee-arc-stow項目的主要業務代碼。
一、背景資料
??項目 dcm4chee-arc-stow
提供通過 HTTP POST 請求接收包含 Bulkdata 的 DICOM 對象或元數據的 RESTful 服務接口。
- Web 服務端點URL:
http[s]://<host>:<port>/dcm4chee-arc/aets/{AETitle}/rs
- 注:用配置的AETitle替換URL中的
{AETitle}
。
1、RESTful服務
??通過RESTful服務在Web上存儲(STore Over The Web By RESTful Services)
方法 | 服務路徑 | 附加URL | 服務名 |
---|---|---|---|
POST | /dcm4chee-arc/aets/{aet}/rs | /studies | 存儲DICOM對象實例(Store Instances) |
POST | /dcm4chee-arc/aets/{aet}/rs | /studies/{study} | 將DICOM對象實例存儲到Study中(Store Instances to a Study) |
2、傳輸存儲規范
類別 | 限制 |
---|---|
支持的媒體類型(Accept header) | 僅限于application/dicom 或者 application/dicom+xml |
支持的傳輸語法(Media Type parameter) | 請參閱 – 《圖像存儲SOP類的傳輸語法》,《視頻存儲SOP類的傳輸語法》,《SR存儲SOP類的傳輸語法》和《其它存儲SOP類的傳輸語法》 |
SOP類別限制 | 請參閱 – 《存儲應用程序實體(SCP)的SOP類別》 |
??SOP:服務對象對(Service Object Pair)。
3、服務連接策略
??同時HTTP請求的最大數量是可配置的。默認情況下它是無限的。
4、響應消息狀態
??DCM4CHEE-STOW-SERVICE響應消息頭包含指示成功、警告或失敗的狀態代碼,如下面的“HTTP標準響應代碼”所示。不使用其他狀態代碼。
服務狀態 | HTTP 狀態碼 | STOW-RS 描述 |
---|---|---|
失敗 | 400 – Bad Request | STOW-RS服務由于語法錯誤而無法存儲任何實例。 |
401 – Unauthorized | STOW-RS服務拒絕創建或附加任何實例,因為客戶端未經過身份驗證。 | |
403 – Forbidden | STOW-RS服務理解該請求,但拒絕滿足該請求(例如,權限不足的經過身份驗證的用戶)。 | |
409 – Conflict | STOW-RS服務請求格式正確,但由于請求中存在沖突(例如,不支持的SOP類或研究實例UID不匹配),服務無法存儲任何實例。這也可用于指示STOW-RS服務由于多種原因無法存儲任何實例。有關實例錯誤的其他信息可以在XML響應消息正文中找到。 | |
503 – Busy | STOW-RS服務無法存儲任何實例,因為資源不足。 | |
警告 | 202 – Accepted | STOW-RS服務存儲了一些實例,但其他實例存在警告或故障。有關此錯誤的其他信息可以在XML響應消息正文中找到。 |
成功 | 200 – OK | STOW-RS服務已成功存儲所有實例。 |
二、業務分析
1、對象關系
??下面是項目相關對象的主要類關系圖:
2、項目結構
??dcm4chee-arc-stow
項目實際只提供了 /studies
和 /studies/{study}
兩個接口,分別用來實現Dicom對象實例和將Dicom對象實例存儲到 Study 中。
??項目中通過 StowRS
類來實現和公開相應的接口,如下圖:
??可以看到StowRS 類的 Action 方法中,大部分是成對出現的,也就是每一個成對出現的方法都同時實現了兩個接口,如下:
@POST
@Path("/studies")
@Consumes("multipart/related;type=application/dicom")
@Produces("application/dicom+json")
public void storeInstancesJSON(@Suspended AsyncResponse ar, InputStream in) throws Exception {store(ar, in, Input.DICOM, OutputType.JSON);
}@POST
@Path("/studies/{StudyInstanceUID}")
@Consumes("multipart/related;type=application/dicom")
@Produces("application/dicom+json")
public void storeInstancesJSON(@PathParam("StudyInstanceUID") String studyInstanceUID,@Suspended AsyncResponse ar,InputStream in) throws Exception {acceptedStudyInstanceUID = studyInstanceUID;store(ar, in, Input.DICOM, OutputType.JSON);
}
3、業務流程
??下圖展示了存儲Dicom對象的簡單流程:
??流程圖顯示項目的主要功能模塊:
StowRS
:服務入口(Controller
),負責公開服務接口(Action
);StoreService
:主要的業務調度模塊,負責保存Dicom對象流數據到指定的文件系統或者云存儲和保存Dicom Tag信息到指定的數據庫;StoreServiceEJB
:數據訪問層,負責對數據實體的讀寫;
三、代碼解析
??在 StowRS
類找到 storeInstancesJSON
方法:
@POST
@Path("/studies")
@Consumes("multipart/related;type=application/dicom")
@Produces("application/dicom+json")
public void storeInstancesJSON(