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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…