Java dcm4che:DIMSE RSP中偶尔出现意外消息ID?
我是dcm4che2库编程的新手,我正在编写一个简单的程序,通过将查询/检索级别设置为Patient/Series/Image来查询PACS服务器。Java dcm4che:DIMSE RSP中偶尔出现意外消息ID?,java,dicom,dcm4che,Java,Dicom,Dcm4che,我是dcm4che2库编程的新手,我正在编写一个简单的程序,通过将查询/检索级别设置为Patient/Series/Image来查询PACS服务器。 代码非常简单,在某些情况下,它工作良好: dcmqr.setCalledAET("AET_REMOTE", true); dcmqr.setRemoteHost("aa.bb.cc.dd"); dcmqr.setRemotePort(xxxx); dcmqr.getKeys(); dcmqr.setDateTimeMatchi
代码非常简单,在某些情况下,它工作良好:
dcmqr.setCalledAET("AET_REMOTE", true);
dcmqr.setRemoteHost("aa.bb.cc.dd");
dcmqr.setRemotePort(xxxx);
dcmqr.getKeys();
dcmqr.setDateTimeMatching(true);
dcmqr.setCFind(true);
dcmqr.setCGet(false);
dcmqr.configureTransferCapability(true);
dcmqr.setQueryLevel(DcmQR.QueryRetrieveLevel.IMAGE);
dcmqr.addMatchingKey(new int[]{Tag.PatientName},sPatientName);
dcmqr.addMatchingKey(new int[]{Tag.Modality},sModality);
dcmqr.addMatchingKey(new int[]{Tag.AccessionNumber},sAccession);
dcmqr.addMatchingKey(new int[]{Tag.SeriesNumber},sSeriesNumber);
dcmqr.addReturnKey(new int[]{Tag.SeriesDescription});
dcmqr.addReturnKey(new int[]{Tag.StudyDescription});
dcmqr.addReturnKey(new int[]{Tag.PatientBirthDate});
dcmqr.addReturnKey(new int[]{Tag.PatientSex});
List<DicomObject> result = null;
try{
dcmqr.start();
dcmqr.open();
result = dcmqr.query();
dcmqr.stop();
dcmqr.close();
}
catch(Exception e){
...
}
dcmqr.setCalledet(“AET_REMOTE”,true);
setRemoteHost(“aa.bb.cc.dd”);
dcmqr.setRemotePort(xxxx);
dcmqr.getKeys();
dcmqr.setDateTimeMatching(true);
dcmqr.setCFind(真);
dcmqr.setCGet(false);
dcmqr.configureTransferCapability(true);
setQueryLevel(dcmqr.queryretrievel.IMAGE);
dcmqr.addMatchingKey(新的int[]{Tag.PatientName},SpatialName);
addMatchingKey(新的int[]{Tag.Modality},sModality);
dcmqr.addMatchingKey(新的int[]{Tag.AccessionNumber},sAccession);
dcmqr.addMatchingKey(新的int[]{Tag.SeriesNumber},sSeriesNumber);
dcmqr.addReturnKey(新的int[]{Tag.SeriesDescription});
dcmqr.addReturnKey(新的int[]{Tag.StudyDescription});
dcmqr.addReturnKey(新的int[]{Tag.PatientBirthDate});
dcmqr.addReturnKey(新的int[]{Tag.PatientSex});
列表结果=空;
试一试{
dcmqr.start();
dcmqr.open();
result=dcmqr.query();
dcmqr.stop();
dcmqr.close();
}
捕获(例外e){
...
}
但是在某些情况下(以及每当我将Query/Retrieve Level设置为“Image”),Query()方法会失败(“DIMSE RSP中的意外消息ID”),并抛出A-Abort命令,如下所述:
...
[main] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << 3:C-FIND-RQ[pcid=1, prior=0
cuid=xyz/Study Root Query/Retrieve Information Model - FIND
ts=xyz/Implicit VR Little Endian]
[AE_TITLE_X] INFO org.dcm4che2.net.PDUDecoder - AET_REMOTE(1) >> 2:C-FIND-RSP[
pcid=1, status=0H cuid=xyz/Study Root Query/Retrieve Information Model - FIND]
[main] INFO org.dcm4che2.tool.dcmqr.DcmQR - Send Query Request #3/15 using .../Study Root Query/Retrieve Information Model - FIND:
(0008,0052) CS #6 [IMAGE] Query/Retrieve Level
(0008,0060) CS #2 [CT] Modality
(0010,0010) PN #12 [xxx^yyyy] PatientÆs Name
(0020,000D) UI #42 [x.y.z.zyx...] Study Instance UID
(0020,000E) UI #56 [y.x.z.zyx...] Series Instance UID
[AE_TITLE_X] WARN org.dcm4che2.net.Association - unexpected message ID in DIMSE RSP:
(0000,0002) UI #28 [x.y.z.zax...] Affected SOP Class UID
(0000,0100) US #2 [32800] Command Field
(0000,0120) US #2 [2] Message ID Being Responded To
(0000,0800) US #2 [257] Command Data Set Type
(0000,0900) US #2 [0] Status
[AE_TITLE_X] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << A-ABORT[source=0, reason=0]
[AE_TITLE_X] INFO org.dcm4che2.net.Association - AET_REMOTE(1): close Socket[addr=/aa.bb.cc.dd,port=xxx,localport=yyy]
[main] INFO org.dcm4che2.net.PDUEncoder - AET_REMOTE(1) << 4:C-FIND-RQ[pcid=1, prior=0
cuid=.../Study Root Query/Retrieve Information Model - FIND
ts=.../Implicit VR Little Endian]
[main] WARN org.dcm4che2.net.Association - unable to send P-DATA-TF in state: Sta1
。。。
[main]INFO org.dcm4che2.net.PDUEncoder-AET_REMOTE(1)>2:C-FIND-RSP[
pcid=1,状态=0H cuid=xyz/研究根查询/检索信息模型-查找]
[main]INFO org.dcm4che2.tool.dcmqr.dcmqr-使用…/Study Root Query/Retrieve Information Model发送查询请求#3/15-查找:
(00080052)CS#6[图像]查询/检索级别
(00080060)CS#2[CT]模式
(00100010)PN#12[xxx^yyyy]患者姓名
(00200000D)用户界面#42[x.y.z.zyx…]研究实例用户界面
(002000E)UI#56[y.x.z.zyx…]系列实例UID
[AE_TITLE_X]WARN org.dcm4che2.net.Association-DIMSE RSP中的意外邮件ID:
(00000002)用户界面#28[x.y.z.zax…]受影响的SOP类用户界面
(00000100)US#2[32800]命令字段
(00000120)正在响应的US#2[2]消息ID
(00000800)US#2[257]命令数据集类型
(00000900)美国2[0]地位
[AE_TITLE_X]INFO org.dcm4che2.net.PDUEncoder-AET_REMOTE(1)您的日志记录表明您发出了查询请求3,然后收到了查询请求2的响应。如果侦听器现在期待3的响应,那么它将抛出异常,因为它已收到消息2的消息ID
如果要循环查询调用来执行此操作,可以尝试将实例指定为列表:
addMatchingKey( new int[] { Tag.SeriesInstanceUID }, "uid1\\uid2\\uid3" );
谢谢你的回复。我不确定是否理解:我只在图像级别进行了一次查询,我希望返回一个图像列表(对于特定的Series实例UID)。我是否应该增加侦听器等待时间,以便正确捕获下一条RSP消息?相反,我可以捕获异常并以更好的方式管理它吗?从您的日志中,看起来您正在进行查询#3(AET#U REMOTE(1)嗨,谢谢。我忽略了SerieInstanceUID,它没有列在复合对象实例级别的键中。我更喜欢切换到SOPInstanceUID。问题已经解决了。