DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS

系列文章目錄

  • 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 RequestSTOW-RS服務由于語法錯誤而無法存儲任何實例。
401 – UnauthorizedSTOW-RS服務拒絕創建或附加任何實例,因為客戶端未經過身份驗證。
403 – ForbiddenSTOW-RS服務理解該請求,但拒絕滿足該請求(例如,權限不足的經過身份驗證的用戶)。
409 – ConflictSTOW-RS服務請求格式正確,但由于請求中存在沖突(例如,不支持的SOP類或研究實例UID不匹配),服務無法存儲任何實例。這也可用于指示STOW-RS服務由于多種原因無法存儲任何實例。有關實例錯誤的其他信息可以在XML響應消息正文中找到。
503 – BusySTOW-RS服務無法存儲任何實例,因為資源不足。
警告202 – AcceptedSTOW-RS服務存儲了一些實例,但其他實例存在警告或故障。有關此錯誤的其他信息可以在XML響應消息正文中找到。
成功200 – OKSTOW-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對象的簡單流程:

在這里插入圖片描述
??流程圖顯示項目的主要功能模塊:

  1. StowRS:服務入口(Controller),負責公開服務接口(Action);
  2. StoreService:主要的業務調度模塊,負責保存Dicom對象流數據到指定的文件系統或者云存儲和保存Dicom Tag信息到指定的數據庫;
  3. StoreServiceEJB:數據訪問層,負責對數據實體的讀寫;

三、代碼解析

??在 StowRS 類找到 storeInstancesJSON 方法:

@POST
@Path("/studies")
@Consumes("multipart/related;type=application/dicom")
@Produces("application/dicom+json")
public void storeInstancesJSON(

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87764.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中間件簡介:構建現代軟件的“隱形橋梁”

Java中間件簡介&#xff1a;構建現代軟件的“隱形橋梁” 在軟件開發的世界里&#xff0c;中間件&#xff08;Middleware&#xff09;是一個既熟悉又神秘的存在。它不像數據庫那樣直接存儲數據&#xff0c;也不像前端那樣與用戶交互&#xff0c;但它卻是現代軟件架構中不可或缺…

Scale AI 的王曉磊帶著對整個 AI 行業動態的深入了解加入 Meta

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

冒煙測試概念速解

最近很多人對冒煙測試這個概念發出疑問。那么我就來簡單解釋一下什么是冒煙測試&#xff0c;以及冒煙測試的由來。 1.冒煙測試的由來 硬件測試的起源&#xff1a;從 “冒煙” 到基礎功能驗證 在電子工程領域&#xff0c;早期工程師在調試新硬件&#xff08;如電路板、芯片&am…

嵌入式學習筆記——day36-多路IO復用

一、基本概念 &#xff08;服務器多客戶端模型&#xff09; 定義&#xff1a; 單線程或單進程同時監測若干個文件描述符是否可以執行IO操作的能力 作用&#xff1a; 應用程序通常需要處理來自多條事件流中的事件&#xff0c;比如我現在用的電腦&#xff0c;需要同時處理鍵盤鼠…

微服務數據一致性技術解析:從單體到微服務的數據困局

關鍵詞: 微服務數據一致性, 企業應用, 技術架構, 最佳實踐 本文基于多位資深架構師在大型互聯網公司的實戰經驗總結&#xff0c;希望能為正在進行微服務改造的團隊提供有價值的參考。如果您在實踐中遇到問題&#xff0c;歡迎交流討論&#xff01; 目錄 一、引言&#xff1a;從…

華為云Flexus+DeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手

華為云FlexusDeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Chatbox介紹Chatbox簡介主要特點 三、安裝Chatbox應用下載Chatbox軟件安裝Chatbox工具 四、開通Deep…

基于cpolar的GPT-SoVITS遠程訪問實踐過程

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 在人工智能技術持續革新之際&#xff0c;語音合成領域涌現出突破性進展。由開發者團隊"花兒不哭"研發的GPT-SoVI…

Redis數據結構之HyperLogLog

本文作者沒有設置VIP可見&#xff0c;并首發在我的博客&#xff1a;https://blog.liuzijian.com/post/redis-data-structure-hyperloglog.html 目錄 1.概述2.常用命令2.1 添加元素2.2 返回基數估算值2.3 合并hyperloglog 3.總結 1.概述 基數統計是一種去重復統計功能的基數估計…

django調用 paramiko powershell 獲取cpu 核數

在 Django 應用中使用 paramiko 庫通過 SSH 連接到遠程服務器并執行命令&#xff08;例如獲取 CPU 核數&#xff09;是一個常見的需求。下面是一個如何實現這一過程的步驟指南&#xff1a; 步驟 1: 安裝必要的庫 首先&#xff0c;確保你的 Django 項目中安裝了 paramiko 庫。如…

08-Python文件處理

08-Python文件處理 一、打開關閉文件 可以用 file 對象做大部分的文件操作。 file()在python3中已經被廢除&#xff0c;使用open()打開文件 open 函數 先用open()打開一個文件&#xff0c;創建一個file 對象&#xff0c;再用相關方法才可以調用它進行讀寫。 語法 file ob…

增強現實—Multimodal text style transfer for outdoor vision-and-language navigation

&#x1f31f;&#x1f31f; 歡迎來到我的技術小筑&#xff0c;一個專為技術探索者打造的交流空間。在這里&#xff0c;我們不僅分享代碼的智慧&#xff0c;還探討技術的深度與廣度。無論您是資深開發者還是技術新手&#xff0c;這里都有一片屬于您的天空。讓我們在知識的海洋中…

黑馬程序員新版Linux學習筆記——第二部分 基礎命令

一、Linux目錄結構 二、命令基礎 三、ls 列目錄內容 3.1 命令 3.2 參數 3.3 總結 四、cd 切換工作目錄 4.1命令 五、pwd 查看當前工作目錄 5.1命令 六、相對路徑、絕對路徑、特殊路徑符 七、mkdir 創建目錄命令 7.1命令 八、touch、cat、more 文件操作命令 8.1 touch 8.2c…

日常運維問題匯總-25

76.銷售訂單交貨單狀態更新 實務中偶有發生交貨已完成&#xff0c;無需開票或開票已經完成&#xff0c;交貨單狀態為&#xff1a;處理中&#xff0c;且仍然出現在VF04中&#xff0c;如下圖所示&#xff1a; 解決方法&#xff1a; T-CODE:VL_COMPLETE,可對錯誤的DN狀態進行更新…

【2025 年】軟件體系結構考試試卷-期末考試

2025 年軟件體系結構考試試卷 考試學期&#xff1a;2025 考試形式&#xff1a;閉卷 考試時間&#xff1a;120 分鐘 年級&#xff1a;______ 專業&#xff1a;軟件工程 班級&#xff1a;______ 一、單選題&#xff08;每小題 1.5 分&#xff0c;共 24 分&#xff09; 關于策略…

4.查看、刪除數據庫

1.顯示所有數據庫 SHOW DATABASE 2.顯示數據庫創建語句 SHOW CREAT DATABASE db_name 例如想查看某個數據庫是怎樣創建的&#xff0c;用的什么字符集啥的。 3.數據庫刪除語句【慎用】 DROP DATABASE [IF EXISTS] db_name 刪除某個數據庫之前一定要確定是否進行了備份。

設計模式 - 原型模式

原型模式&#xff08;Prototype&#xff09;&#xff0c;在制造業種通常是指大批量生產開始之前研發出的概念模型&#xff0c;并基于各種參數指標對其進行檢驗&#xff0c;效果達到了質量要求&#xff0c;即可參照這個原型進行批量生產。即&#xff0c;原型模式可以用對象創建對…

MySQL數據庫基礎:從零開始的第一步【Linux】

前言 各位小伙伴們&#xff0c;好久不見&#xff01;近期&#xff0c;我的文章更新頻率確實有些緩慢&#xff0c;在此誠摯地向大家道歉。這個月是我的期末考試月&#xff0c;正處于緊張的復習&#xff08;也可以說是重新學習&#xff09;階段。盡管學業繁忙&#xff0c;但我依然…

502 Bad Gateway:服務器作為網關或代理時收到無效響應處理方式

502 Bad Gateway 錯誤是 Web 開發和服務器管理中常見的問題&#xff0c;通常表示網關或代理服務器收到無效響應。這種錯誤可能由多種原因引起&#xff0c;包括后端服務故障、網絡問題或配置錯誤等。了解502錯誤的原因及其處理方式&#xff0c;對于維護網站的可用性和用戶體驗至…

Abel 變換,離散型分部積分

文章目錄 零、引入&#xff1a;分部積分一、Abel 變換1.1 Abel 變換1.2 證明 二、一些比較淺顯的應用2.1 等差 乘 等比型求和2.2 平方求和公式2.3 不等式證明 三、一些算法題的式子優化3.1 3500.將數組分割為子數組的最小代價3.2 D. Array Splitting3.3 300. 任務安排1 零、引入…

火山 RTC 引擎12----合流轉推 集成

一、火山、網易 合流轉推集成 1、 首次先要startPush,要不然,推不了流 void NRTCEngine::PushToCDN(std::string taskID, std::string url) {if (m_video == nullptr) return;bytertc::IMixedStreamConfig* config = getMixedStreamConfig(url);int ret = m_video->star…