jetstream-api 0.22.1__tar.gz → 0.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/PKG-INFO +40 -2
  2. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/README.md +39 -1
  3. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/__init__.py +1 -1
  4. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/admin.py +159 -6
  5. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/common.py +6 -12
  6. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/exception.py +4 -1
  7. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/properties.py +7136 -7397
  8. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/PKG-INFO +40 -2
  9. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/pyproject.toml +1 -1
  10. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/LICENSE.txt +0 -0
  11. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_codec.py +0 -0
  12. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_consumer.py +0 -0
  13. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_groupwire.py +0 -0
  14. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_propv2.py +0 -0
  15. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_qleader.py +0 -0
  16. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/_throttle.py +0 -0
  17. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/admintopic.py +0 -0
  18. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/connectivity.py +0 -0
  19. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/msg.py +0 -0
  20. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/partitioner.py +0 -0
  21. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/pattern.py +0 -0
  22. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/producer.py +0 -0
  23. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/py.typed +0 -0
  24. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/qmgr.py +0 -0
  25. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/topic.py +0 -0
  26. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/ilink/util.py +0 -0
  27. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/SOURCES.txt +0 -0
  28. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/dependency_links.txt +0 -0
  29. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/requires.txt +0 -0
  30. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/jetstream_api.egg-info/top_level.txt +0 -0
  31. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/setup.cfg +0 -0
  32. {jetstream_api-0.22.1 → jetstream_api-0.23.0}/tests/test_example.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.22.1
3
+ Version: 0.23.0
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -60,12 +60,50 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
60
60
  ## 설치 방법
61
61
  pip install jetstream-api
62
62
 
63
+ ## 0.23.0 변경 - 큐 속성 Property v2(JSON) · 채널 STANDBY (자바 v2.19.0 와 같음, 짝 엔진 = Property v2 P3 판 이상)
64
+
65
+ - **큐 관리가 엔진 7 과 JSON(Property v2) 으로 오간다**(엔진 P3). 함수 이름은 그대로 - ``createQueue`` · ``setQueueProperty`` ·
66
+ ``getQueueProperty`` (종류별 포함) · ``getQueueList`` (종류별 · 요약 포함) · ``removeQueue`` 가 상대가 7 이면 JSON, 6.x 면 기존 고정폭 블롭이다.
67
+ ☠ **P3 전 7.x 엔진(7.0.1.3604 이하)에는 큐 관리가 거절된다** - 판 혼재는 지원하지 않는다(엔진 · 클라 · 하네스를 함께 올린다).
68
+ - ``setQueueProperty`` 는 엔진 7 에 **세터 · 대입으로 바꾼 칸만** 보낸다. 새로 만든 객체로 일부만 바꿔도 다른 칸을 덮지 않는다
69
+ (옛 블롭은 전체 교체였다). 바꾼 것이 없으면 보내지 않는다.
70
+ - 더함: ``createQueueWithResult`` · ``setQueuePropertyWithResult`` · ``removeQueueWithResult`` (``ILPropertyResult``, 6.x 엔진이면 빈 결과),
71
+ ``ILQueueProperty.description`` (큐 설명, 200바이트, 생성 전용, 엔진 7 에서만).
72
+ - ``leaderGroup`` 은 JSON 으로만 오간다 - 고정폭 블롭은 6.3.4 레이아웃으로 되돌아갔다(LG 칸 없음).
73
+ - ``incomingDelayDepth`` · ``incomingDelay`` 의 ``0`` 은 유효한 값이다(문서 범위 고침). 세그먼트 수 · 공유 메모리 크기는 생성 전용 -
74
+ 바꿔 보내면 ``MIMQE_IMMUTABLE_PROPERTY (SEGMENTS fixed at <n>)`` 로 거절된다.
75
+ - 종류별 조회(``getLocalQueueProperty`` 등)는 종류가 다르면 ``MIMQE_OBJECT_NOT_FOUND (<큐> : TYPE_NOT_MATCHED)`` (옛 엔진과 같은 사유).
76
+ - 채널: ``ILChannelStatus.STANDBY = 5`` (리더에서만 일하는 채널이 팔로워에서 대기). 이 값을 모르는 옛 클라는 STANDBY 채널이 섞인
77
+ 채널 조회 · 목록이 실패한다. ``startChannelWithStatus`` 는 STANDBY · 오류(``"EXCEPTION"``)에서 기다리지 않고 곧바로 돌아온다
78
+ (전에는 오류에서 시한까지 기다렸다).
79
+ - 없앰: ``ILC.MIMQ_COORD_OBSERVER`` ("O") - ``getReplicationStatus`` 의 3370 arg1 은 빈칸이다(엔진이 r3486 부터 읽지 않는다).
80
+ - 예외 문구에 Property v2 본문 규칙 위반의 원인을 붙인다(전에는 ``MIMQE_INTERNAL_ERROR`` 만 보였다).
81
+ - 알려진 엔진 결함(P3 이전부터, 엔진에서 별건): 큐를 한 번 변경하면 그 뒤 ``setQueueTrace`` 결과가 조회에 안 보인다 -
82
+ 트레이스는 ``setQueueProperty`` 로 바꾼다.
83
+
84
+ ## 0.22.3 변경 - 옛 클러스터 블롭 코덱 · actingCoordinator 제거, servicePorts (자바 v2.18.3 와 같음, 짝 엔진 7.0.1.3603 이상 권장)
85
+
86
+ 0.22.2 는 시험 판(test.pypi)만 내고 버렸다 - actingCoordinator 제거를 묶어 0.22.3 으로 나간다.
87
+
88
+ - **없앰**(호환 깨짐): 옛 고정폭 클러스터 블롭 코덱 - ``ILClusterProperty(bytes)`` · ``ba=`` · ``get_serialized`` · ``get_serialized_length`` ·
89
+ ``LAYOUT_MARK``, ``ILClusterNode(bytes)`` · ``ba=`` · ``base=`` · ``get_serialized``, 모듈 ``CLUSTER_LAYOUT_MARK``,
90
+ ``ILC.MIMQ_VO_CLUSTER_LEN`` / ``MIMQ_VO_CLUSTER_NODE_LEN``. 바이트를 주면 ``TypeError``. 엔진 r3601 이 그 형식을 지웠고 0.22.0 부터
91
+ JSON(Property v2)으로만 주고받아 쓰는 경로가 없었다. 능력 선언 ``clsblob=2`` 는 그대로.
92
+ - **없앰**(호환 깨짐): ``ILClusterProperty.actingCoordinator`` · ``get_acting_coordinator`` / ``getActingCoordinator`` - 0.18.1 부터 폐기 예정,
93
+ 엔진 7.0.1.3484 부터 늘 ``None`` 이던 관측 칸이다(엔진 r3604 도 걷음). ``controllerLeader`` 를 읽는다 - 옛 이름으로 부르면 그렇게 안내한다.
94
+ - **더함**: ``ILClusterProperty.servicePorts`` / ``getServicePorts()`` (읽기 전용) - 응답한 서비스가 맡은 컨트롤러(ilcc) 자리의 포트 전부
95
+ (엔진 ``PORT`` "a,b", 맡은 자리가 없으면 빈 목록). 컨트롤러가 멈춰 있어도 나온다 - 지금 듣는 포트는 ``localCtrlPort``.
96
+ - 노드 ``status`` · ``nodeUuid`` · ``defTerm`` · ``defVersion`` 은 이름만 남는다(엔진 r3601 부터 와이어에 없어 늘 빈 값) - 문서를 고침.
97
+ - 문서 정정: 팔로워 거절 ``MIMQE_OPERATION_DENIED (STANDBY)`` 는 **토픽**의 생성 · 변경 · 삭제만이다(쿼터 · 디스크 가드 · 클러스터에는 없다).
98
+ - 엔진 r3603: 클러스터 서명(``signature``) 값의 재료가 정의의 공유 칸 전부로 넓어져 값이 바뀐다(키 · 형식 그대로, 클라 변경 없음).
99
+
63
100
  ## 0.22.1 변경 - 노드 추가 결과에 컨트롤러 기동 여부 (자바 v2.18.1 와 같음, started · wait 는 짝 엔진 7.0.1.3602 이상)
64
101
 
65
102
  - ``addNode`` 결과(``ILClusterNodeAddResult``)에 ``started`` · ``wait``(``is_started()``): 자리를 맡은 서비스가 컨트롤러를 **띄웠는가**와
66
103
  안 띄운 까닭(``MANUAL`` - 정의 STARTMODE 가 MANUAL 이라 :meth:`startCluster` 로 띄운다 · ``STOPPED`` - 사용자가 멈춰 둠 · ``FAILED`` -
67
104
  띄우다 실패, ilsvc 로그). 그 전 엔진은 이 칸을 주지 않아 맡았으면 띄운 것으로 본다(종전 동작).
68
- - 문서: 클러스터 팔로워 노드에 보낸 생성 · 변경 · 삭제는 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은 팔로워도 답한다.
105
+ - 문서: **토픽**의 생성 · 변경 · 삭제를 클러스터 팔로워 노드에 보내면 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은
106
+ 팔로워도 답한다. 쿼터 · 디스크 가드 · 클러스터(서비스가 받는 설정)에는 이 거절이 없다(배포 뒤 정정 - 처음에는 네 오브젝트 모두로 잘못 적었다).
69
107
 
70
108
  ## 0.22.0 변경 - 7 신규 오브젝트(쿼터 · 디스크 가드 · 토픽 · 클러스터) 관리를 Property v2(JSON)로 (자바 v2.18.0 와 같음, 짝 엔진 7.0.1.3601 이상)
71
109
 
@@ -10,12 +10,50 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
10
10
  ## 설치 방법
11
11
  pip install jetstream-api
12
12
 
13
+ ## 0.23.0 변경 - 큐 속성 Property v2(JSON) · 채널 STANDBY (자바 v2.19.0 와 같음, 짝 엔진 = Property v2 P3 판 이상)
14
+
15
+ - **큐 관리가 엔진 7 과 JSON(Property v2) 으로 오간다**(엔진 P3). 함수 이름은 그대로 - ``createQueue`` · ``setQueueProperty`` ·
16
+ ``getQueueProperty`` (종류별 포함) · ``getQueueList`` (종류별 · 요약 포함) · ``removeQueue`` 가 상대가 7 이면 JSON, 6.x 면 기존 고정폭 블롭이다.
17
+ ☠ **P3 전 7.x 엔진(7.0.1.3604 이하)에는 큐 관리가 거절된다** - 판 혼재는 지원하지 않는다(엔진 · 클라 · 하네스를 함께 올린다).
18
+ - ``setQueueProperty`` 는 엔진 7 에 **세터 · 대입으로 바꾼 칸만** 보낸다. 새로 만든 객체로 일부만 바꿔도 다른 칸을 덮지 않는다
19
+ (옛 블롭은 전체 교체였다). 바꾼 것이 없으면 보내지 않는다.
20
+ - 더함: ``createQueueWithResult`` · ``setQueuePropertyWithResult`` · ``removeQueueWithResult`` (``ILPropertyResult``, 6.x 엔진이면 빈 결과),
21
+ ``ILQueueProperty.description`` (큐 설명, 200바이트, 생성 전용, 엔진 7 에서만).
22
+ - ``leaderGroup`` 은 JSON 으로만 오간다 - 고정폭 블롭은 6.3.4 레이아웃으로 되돌아갔다(LG 칸 없음).
23
+ - ``incomingDelayDepth`` · ``incomingDelay`` 의 ``0`` 은 유효한 값이다(문서 범위 고침). 세그먼트 수 · 공유 메모리 크기는 생성 전용 -
24
+ 바꿔 보내면 ``MIMQE_IMMUTABLE_PROPERTY (SEGMENTS fixed at <n>)`` 로 거절된다.
25
+ - 종류별 조회(``getLocalQueueProperty`` 등)는 종류가 다르면 ``MIMQE_OBJECT_NOT_FOUND (<큐> : TYPE_NOT_MATCHED)`` (옛 엔진과 같은 사유).
26
+ - 채널: ``ILChannelStatus.STANDBY = 5`` (리더에서만 일하는 채널이 팔로워에서 대기). 이 값을 모르는 옛 클라는 STANDBY 채널이 섞인
27
+ 채널 조회 · 목록이 실패한다. ``startChannelWithStatus`` 는 STANDBY · 오류(``"EXCEPTION"``)에서 기다리지 않고 곧바로 돌아온다
28
+ (전에는 오류에서 시한까지 기다렸다).
29
+ - 없앰: ``ILC.MIMQ_COORD_OBSERVER`` ("O") - ``getReplicationStatus`` 의 3370 arg1 은 빈칸이다(엔진이 r3486 부터 읽지 않는다).
30
+ - 예외 문구에 Property v2 본문 규칙 위반의 원인을 붙인다(전에는 ``MIMQE_INTERNAL_ERROR`` 만 보였다).
31
+ - 알려진 엔진 결함(P3 이전부터, 엔진에서 별건): 큐를 한 번 변경하면 그 뒤 ``setQueueTrace`` 결과가 조회에 안 보인다 -
32
+ 트레이스는 ``setQueueProperty`` 로 바꾼다.
33
+
34
+ ## 0.22.3 변경 - 옛 클러스터 블롭 코덱 · actingCoordinator 제거, servicePorts (자바 v2.18.3 와 같음, 짝 엔진 7.0.1.3603 이상 권장)
35
+
36
+ 0.22.2 는 시험 판(test.pypi)만 내고 버렸다 - actingCoordinator 제거를 묶어 0.22.3 으로 나간다.
37
+
38
+ - **없앰**(호환 깨짐): 옛 고정폭 클러스터 블롭 코덱 - ``ILClusterProperty(bytes)`` · ``ba=`` · ``get_serialized`` · ``get_serialized_length`` ·
39
+ ``LAYOUT_MARK``, ``ILClusterNode(bytes)`` · ``ba=`` · ``base=`` · ``get_serialized``, 모듈 ``CLUSTER_LAYOUT_MARK``,
40
+ ``ILC.MIMQ_VO_CLUSTER_LEN`` / ``MIMQ_VO_CLUSTER_NODE_LEN``. 바이트를 주면 ``TypeError``. 엔진 r3601 이 그 형식을 지웠고 0.22.0 부터
41
+ JSON(Property v2)으로만 주고받아 쓰는 경로가 없었다. 능력 선언 ``clsblob=2`` 는 그대로.
42
+ - **없앰**(호환 깨짐): ``ILClusterProperty.actingCoordinator`` · ``get_acting_coordinator`` / ``getActingCoordinator`` - 0.18.1 부터 폐기 예정,
43
+ 엔진 7.0.1.3484 부터 늘 ``None`` 이던 관측 칸이다(엔진 r3604 도 걷음). ``controllerLeader`` 를 읽는다 - 옛 이름으로 부르면 그렇게 안내한다.
44
+ - **더함**: ``ILClusterProperty.servicePorts`` / ``getServicePorts()`` (읽기 전용) - 응답한 서비스가 맡은 컨트롤러(ilcc) 자리의 포트 전부
45
+ (엔진 ``PORT`` "a,b", 맡은 자리가 없으면 빈 목록). 컨트롤러가 멈춰 있어도 나온다 - 지금 듣는 포트는 ``localCtrlPort``.
46
+ - 노드 ``status`` · ``nodeUuid`` · ``defTerm`` · ``defVersion`` 은 이름만 남는다(엔진 r3601 부터 와이어에 없어 늘 빈 값) - 문서를 고침.
47
+ - 문서 정정: 팔로워 거절 ``MIMQE_OPERATION_DENIED (STANDBY)`` 는 **토픽**의 생성 · 변경 · 삭제만이다(쿼터 · 디스크 가드 · 클러스터에는 없다).
48
+ - 엔진 r3603: 클러스터 서명(``signature``) 값의 재료가 정의의 공유 칸 전부로 넓어져 값이 바뀐다(키 · 형식 그대로, 클라 변경 없음).
49
+
13
50
  ## 0.22.1 변경 - 노드 추가 결과에 컨트롤러 기동 여부 (자바 v2.18.1 와 같음, started · wait 는 짝 엔진 7.0.1.3602 이상)
14
51
 
15
52
  - ``addNode`` 결과(``ILClusterNodeAddResult``)에 ``started`` · ``wait``(``is_started()``): 자리를 맡은 서비스가 컨트롤러를 **띄웠는가**와
16
53
  안 띄운 까닭(``MANUAL`` - 정의 STARTMODE 가 MANUAL 이라 :meth:`startCluster` 로 띄운다 · ``STOPPED`` - 사용자가 멈춰 둠 · ``FAILED`` -
17
54
  띄우다 실패, ilsvc 로그). 그 전 엔진은 이 칸을 주지 않아 맡았으면 띄운 것으로 본다(종전 동작).
18
- - 문서: 클러스터 팔로워 노드에 보낸 생성 · 변경 · 삭제는 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은 팔로워도 답한다.
55
+ - 문서: **토픽**의 생성 · 변경 · 삭제를 클러스터 팔로워 노드에 보내면 ``MIMQE_OPERATION_DENIED (STANDBY, leader=..)``, 조회 · 목록은
56
+ 팔로워도 답한다. 쿼터 · 디스크 가드 · 클러스터(서비스가 받는 설정)에는 이 거절이 없다(배포 뒤 정정 - 처음에는 네 오브젝트 모두로 잘못 적었다).
19
57
 
20
58
  ## 0.22.0 변경 - 7 신규 오브젝트(쿼터 · 디스크 가드 · 토픽 · 클러스터) 관리를 Property v2(JSON)로 (자바 v2.18.0 와 같음, 짝 엔진 7.0.1.3601 이상)
21
59
 
@@ -1,6 +1,6 @@
1
1
  """iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
2
2
 
3
- __version__ = "0.22.1"
3
+ __version__ = "0.23.0"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -4005,6 +4005,8 @@ class ILAdminQmgr:
4005
4005
  print(q.getName(), q.get_type_string(), q.getDepth())
4006
4006
  """
4007
4007
  try:
4008
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4009
+ return self._queueListV2()
4008
4010
  res_msg = self.service.inquire(self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST)
4009
4011
  if res_msg.getType() == ILC.MIMQ_REPORT_MESSAGE:
4010
4012
  raise ILOperationException(res_msg.getReportMsg().getArg2())
@@ -4028,6 +4030,8 @@ class ILAdminQmgr:
4028
4030
  목록 화면을 주기적으로 갱신할 때처럼 자주 부르는 경우에 쓴다.
4029
4031
  """
4030
4032
  try:
4033
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4034
+ return self._queueMinorListV2(ILQueueMinorProperty)
4031
4035
  if self.revision < 2762:
4032
4036
  props = self.getQueueList()
4033
4037
  return [prop.get_minor_property() for prop in props]
@@ -4053,6 +4057,8 @@ class ILAdminQmgr:
4053
4057
  ILException: 통신 실패.
4054
4058
  """
4055
4059
  try:
4060
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4061
+ return self._queueListV2(ILC.MIMQ_LOCAL_PERSISTENT)
4056
4062
  res_msg = self.service.inquire(
4057
4063
  self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST, str(ILC.MIMQ_LOCAL_PERSISTENT)
4058
4064
  )
@@ -4075,6 +4081,8 @@ class ILAdminQmgr:
4075
4081
  ILException: 통신 실패.
4076
4082
  """
4077
4083
  try:
4084
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4085
+ return self._queueMinorListV2(ILLocalQueueMinorProperty, ILC.MIMQ_LOCAL_PERSISTENT)
4078
4086
  if self.revision < 2762:
4079
4087
  props = self.getLocalQueueList()
4080
4088
  return [prop.get_minor_property() for prop in props]
@@ -4106,6 +4114,8 @@ class ILAdminQmgr:
4106
4114
  ILException: 통신 실패.
4107
4115
  """
4108
4116
  try:
4117
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4118
+ return self._queueListV2(ILC.MIMQ_REMOTE_QUEUE)
4109
4119
  res_msg = self.service.inquire(
4110
4120
  self.qmgrName, ILC.MIMQ_GET_QUEUE_LIST, str(ILC.MIMQ_REMOTE_QUEUE)
4111
4121
  )
@@ -4128,6 +4138,8 @@ class ILAdminQmgr:
4128
4138
  ILException: 통신 실패.
4129
4139
  """
4130
4140
  try:
4141
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4142
+ return self._queueMinorListV2(ILRemoteQueueMinorProperty, ILC.MIMQ_REMOTE_QUEUE)
4131
4143
  if self.revision < 2762:
4132
4144
  props = self.getRemoteQueueList()
4133
4145
  return [prop.get_minor_property() for prop in props]
@@ -4158,6 +4170,8 @@ class ILAdminQmgr:
4158
4170
  ILException: 통신 실패.
4159
4171
  """
4160
4172
  try:
4173
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4174
+ return self._queueListV2(ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
4161
4175
  res_msg = self.service.inquire(
4162
4176
  self.qmgrName,
4163
4177
  ILC.MIMQ_GET_QUEUE_LIST,
@@ -4185,6 +4199,8 @@ class ILAdminQmgr:
4185
4199
  깊이만 주기적으로 보며 **전송 적체**를 감시할 때 적합하다.
4186
4200
  """
4187
4201
  try:
4202
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4203
+ return self._queueMinorListV2(ILXmitQueueMinorProperty, ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
4188
4204
  if self.revision < 2762:
4189
4205
  props = self.getXmitQueueList()
4190
4206
  return [prop.get_minor_property() for prop in props]
@@ -4284,6 +4300,9 @@ class ILAdminQmgr:
4284
4300
  **그 값들은 무시된다** - 설정해도 반영되지 않는다.
4285
4301
  """
4286
4302
  try:
4303
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4304
+ self.createQueueWithResult(prop)
4305
+ return
4287
4306
  self.service.apply(
4288
4307
  self.qmgrName,
4289
4308
  ILC.MIMQ_CREATE_QUEUE_REQUEST,
@@ -4349,6 +4368,9 @@ class ILAdminQmgr:
4349
4368
 
4350
4369
  """
4351
4370
  try:
4371
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4372
+ self.removeQueueWithResult(queueName)
4373
+ return
4352
4374
  self.service.request(
4353
4375
  self.qmgrName,
4354
4376
  ILC.MIMQ_REMOVE_QUEUE,
@@ -4571,6 +4593,123 @@ class ILAdminQmgr:
4571
4593
  except Exception as exc:
4572
4594
  raise ILException(exc) from exc
4573
4595
 
4596
+ # ── 다음 판 Property v2 (B) Queue(엔진 P3, 설계 §14) ── 상대가 7 이면 JSON, 6.x 면 기존 블롭(구버전 호환 용도로만, U7)
4597
+
4598
+ #: LIST 로 전체 속성을 받을 때의 _KEYS(설정 키 전부 + CURDEPTH). 없으면 엔진은 NAME · TYPE · CURDEPTH · MAXDEPTH 만 준다
4599
+ _QUEUE_LIST_KEYS = [k for k, _ in ILQueueProperty._PV2_KEYS.values()] + ["CURDEPTH"]
4600
+
4601
+ def _queueV2(self) -> bool:
4602
+ return _propv2.peer_speaks_v2(self.version)
4603
+
4604
+ def _queueReq(self, code: int, body: dict) -> dict:
4605
+ # 관리 연결이라 대상 큐 관리자 이름을 실어 ilsvc 가 중계한다(토픽과 같다)
4606
+ return _propv2.request(self.service, self.qmgrName, code, dict({"_TYPE": "QUEUE"}, **body))
4607
+
4608
+ def _queueItems(self, obj: dict) -> list:
4609
+ items = obj.get("_ITEMS", []) or []
4610
+ if not isinstance(items, list) or any(not isinstance(e, dict) for e in items):
4611
+ raise _propv2.PropV2Error("_ITEMS must be ARRAY of OBJ")
4612
+ return [ILQueueProperty()._pv2_from_body(e) for e in items]
4613
+
4614
+ def _queueListV2(self, qtype: int | None = None) -> list:
4615
+ # 종류 거르기는 클라가 한다(옛 3016 arg 의 엔진 거르기와 같은 결과)
4616
+ qs = self._queueItems(self._queueReq(_propv2.PROP_LIST, {"_KEYS": ILAdminQmgr._QUEUE_LIST_KEYS}))
4617
+ return [q for q in qs if qtype is None or q.type == qtype]
4618
+
4619
+ def _queueMinorListV2(self, cls, qtype: int | None = None) -> list:
4620
+ out = []
4621
+ for q in self._queueItems(self._queueReq(_propv2.PROP_LIST, {})):
4622
+ if qtype is None or q.type == qtype:
4623
+ m = cls()
4624
+ m.name, m.type, m.depth = q.name, q.type, q.depth
4625
+ out.append(m)
4626
+ return out
4627
+
4628
+ def _queueGetV2(self, queueName: str, qtype: int | None = None) -> ILQueueProperty:
4629
+ q = ILQueueProperty()._pv2_from_body(self._queueReq(_propv2.PROP_GET, {"NAME": queueName}))
4630
+ if qtype is not None and q.type != qtype:
4631
+ # 옛 3018 종류 거르기와 같은 사유(엔진 ConfigHelper GetQueueProperty)
4632
+ raise ILOperationException("MIMQE_OBJECT_NOT_FOUND (%s : TYPE_NOT_MATCHED)" % queueName)
4633
+ return q
4634
+
4635
+ def createQueueWithResult(self, prop: ILQueueProperty) -> ILPropertyResult:
4636
+ """:meth:`createQueue` 와 같고, 엔진이 무엇을 적용 · 무시했는지 돌려준다(다음 판).
4637
+
4638
+ Args:
4639
+ prop (ILQueueProperty): 만들 큐.
4640
+
4641
+ Returns:
4642
+ ILPropertyResult: 적용(``applied``) · 무시(``ignored``) 목록. **6.x 엔진이면 빈 결과**다(옛 와이어에는 결과가 없다).
4643
+
4644
+ Raises:
4645
+ ILOperationException: 엔진이 거절했을 때(사유 그대로).
4646
+ ILException: 통신 실패.
4647
+ """
4648
+ try:
4649
+ if not self._queueV2():
4650
+ self.createQueue(prop)
4651
+ return ILPropertyResult({})
4652
+ res = ILPropertyResult(self._queueReq(_propv2.PROP_CREATE, prop._pv2_create_body()))
4653
+ prop._pv2_clear()
4654
+ return res
4655
+ except _PASSTHROUGH_EXCEPTIONS:
4656
+ raise
4657
+ except Exception as exc:
4658
+ raise ILException(exc) from exc
4659
+
4660
+ def setQueuePropertyWithResult(self, prop: ILQueueProperty) -> ILPropertyResult:
4661
+ """:meth:`setQueueProperty` 와 같고, 엔진이 무엇을 적용 · 무시했는지 돌려준다(다음 판).
4662
+
4663
+ 엔진 7 에는 **세터 · 대입으로 바꾼 칸만** 보낸다(ALTER patch). 바꾼 것이 없으면 보내지 않고 빈 결과를 돌려준다.
4664
+
4665
+ Args:
4666
+ prop (ILQueueProperty): 바꿀 큐(이름으로 찾는다).
4667
+
4668
+ Returns:
4669
+ ILPropertyResult: 적용 · 무시 목록. **6.x 엔진이면 빈 결과**다.
4670
+
4671
+ Raises:
4672
+ ILOperationException: 엔진이 거절했을 때(사유 그대로).
4673
+ ILException: 통신 실패.
4674
+ """
4675
+ try:
4676
+ if not self._queueV2():
4677
+ self.setQueueProperty(prop)
4678
+ return ILPropertyResult({})
4679
+ body = prop._pv2_patch_body()
4680
+ if not body:
4681
+ return ILPropertyResult({})
4682
+ res = ILPropertyResult(self._queueReq(_propv2.PROP_ALTER, body))
4683
+ prop._pv2_clear()
4684
+ return res
4685
+ except _PASSTHROUGH_EXCEPTIONS:
4686
+ raise
4687
+ except Exception as exc:
4688
+ raise ILException(exc) from exc
4689
+
4690
+ def removeQueueWithResult(self, queueName: str) -> ILPropertyResult:
4691
+ """:meth:`removeQueue` 와 같고 엔진 결과를 돌려준다(다음 판). **6.x 엔진이면 빈 결과**다.
4692
+
4693
+ Args:
4694
+ queueName (str): 지울 큐 이름.
4695
+
4696
+ Returns:
4697
+ ILPropertyResult: 엔진 결과.
4698
+
4699
+ Raises:
4700
+ ILOperationException: 엔진이 거절했을 때(비어 있지 않은 큐 등, 사유 그대로).
4701
+ ILException: 통신 실패.
4702
+ """
4703
+ try:
4704
+ if not self._queueV2():
4705
+ self.removeQueue(queueName)
4706
+ return ILPropertyResult({})
4707
+ return ILPropertyResult(self._queueReq(_propv2.PROP_DELETE, {"NAME": queueName}))
4708
+ except _PASSTHROUGH_EXCEPTIONS:
4709
+ raise
4710
+ except Exception as exc:
4711
+ raise ILException(exc) from exc
4712
+
4574
4713
  def _queueBlob(self, prop: ILQueueProperty) -> bytes:
4575
4714
  """큐 속성을 **붙어 있는 엔진이 이해하는 레이아웃**으로 직렬화한다.
4576
4715
 
@@ -4638,6 +4777,8 @@ class ILAdminQmgr:
4638
4777
  print(q.getDepth(), "/", q.getMaxDepth())
4639
4778
  """
4640
4779
  try:
4780
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4781
+ return self._queueGetV2(queueName)
4641
4782
  res_msg = self.service.inquire(
4642
4783
  self.qmgrName, ILC.MIMQ_GET_QUEUE_PROPERTY, queueName
4643
4784
  )
@@ -4663,6 +4804,8 @@ class ILAdminQmgr:
4663
4804
  ILException: 통신 실패.
4664
4805
  """
4665
4806
  try:
4807
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4808
+ return self._queueGetV2(queueName, ILC.MIMQ_LOCAL_PERSISTENT)
4666
4809
  res_msg = self.service.inquire(
4667
4810
  self.qmgrName,
4668
4811
  ILC.MIMQ_GET_QUEUE_PROPERTY,
@@ -4693,6 +4836,8 @@ class ILAdminQmgr:
4693
4836
  ILException: 통신 실패.
4694
4837
  """
4695
4838
  try:
4839
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4840
+ return self._queueGetV2(queueName, ILC.MIMQ_REMOTE_QUEUE)
4696
4841
  res_msg = self.service.inquire(
4697
4842
  self.qmgrName,
4698
4843
  ILC.MIMQ_GET_QUEUE_PROPERTY,
@@ -4722,6 +4867,8 @@ class ILAdminQmgr:
4722
4867
  ILException: 통신 실패.
4723
4868
  """
4724
4869
  try:
4870
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4871
+ return self._queueGetV2(queueName, ILC.MIMQ_CHANNEL_TRANSMISSION_QUEUE)
4725
4872
  res_msg = self.service.inquire(
4726
4873
  self.qmgrName,
4727
4874
  ILC.MIMQ_GET_QUEUE_PROPERTY,
@@ -4781,6 +4928,9 @@ class ILAdminQmgr:
4781
4928
  **그 값들은 무시된다** - 설정해도 반영되지 않는다.
4782
4929
  """
4783
4930
  try:
4931
+ if self._queueV2(): # 다음 판(엔진 P3): 7 이면 JSON, 6.x 면 아래 블롭
4932
+ self.setQueuePropertyWithResult(prop)
4933
+ return
4784
4934
  self.service.apply(
4785
4935
  self.qmgrName,
4786
4936
  ILC.MIMQ_SET_QUEUE_PROPERTY,
@@ -5831,8 +5981,9 @@ class ILAdminQmgr:
5831
5981
  timeout (int): 최대 대기 **초**.
5832
5982
 
5833
5983
  Returns:
5834
- str: 최종 상태 문자열(``"RUNNING"`` / ``"EXCEPTION"`` 등, 시간이
5835
- 다하면 그 시점의 상태). **예외가 아니라 문자열로 결과를 알리므로**
5984
+ str: 최종 상태 문자열(``"RUNNING"`` / ``"EXCEPTION"`` / ``"STANDBY"`` 등, 시간이
5985
+ 다하면 그 시점의 상태). ``"STANDBY"`` 는 리더에서만 일하는 채널이 팔로워에서 대기에 든 것이라
5986
+ 기다리지 않고 곧바로 돌려준다. **예외가 아니라 문자열로 결과를 알리므로**
5836
5987
  값을 반드시 확인하라.
5837
5988
 
5838
5989
  Raises:
@@ -5856,7 +6007,9 @@ class ILAdminQmgr:
5856
6007
  status_str = ""
5857
6008
  for _ in range(timeout):
5858
6009
  status_str = self.getChannelProperty(channelName).get_status_string()
5859
- if status_str in (ILC.MIMQ_RUNNING_STR, ILC.MIMQ_ERROR_STR):
6010
+ # 채널 상태 문자열은 오류를 "EXCEPTION" 으로 낸다(자바 · ilsc 는 "ERROR") - 둘 다 끝으로 본다.
6011
+ # 전에는 "ERROR" 만 봐서 채널 오류에서 시한까지 기다렸다
6012
+ if status_str in (ILC.MIMQ_RUNNING_STR, ILC.MIMQ_ERROR_STR, "EXCEPTION", "STANDBY"):
5860
6013
  break
5861
6014
  time.sleep(1)
5862
6015
  return status_str
@@ -5912,7 +6065,7 @@ class ILAdminQmgr:
5912
6065
  status_str = ""
5913
6066
  for _ in range(timeout):
5914
6067
  status_str = self.getChannelProperty(channelName).get_status_string()
5915
- if status_str in (ILC.MIMQ_STOPPED_STR, ILC.MIMQ_ERROR_STR):
6068
+ if status_str in (ILC.MIMQ_STOPPED_STR, ILC.MIMQ_ERROR_STR, "EXCEPTION"):
5916
6069
  break
5917
6070
  time.sleep(1)
5918
6071
  return status_str
@@ -5929,7 +6082,7 @@ class ILAdminQmgr:
5929
6082
  Args:
5930
6083
  channelName (str): 채널 이름.
5931
6084
  status (ILChannelStatus): 기다릴 목표 상태
5932
- (``RUNNING`` / ``STOPPED`` / ``STARTING`` / ``STOPPING`` / ``EXCEPTION``).
6085
+ (``RUNNING`` / ``STOPPED`` / ``STARTING`` / ``STOPPING`` / ``EXCEPTION`` / ``STANDBY``).
5933
6086
  timeout (int): 최대 대기 **초**.
5934
6087
 
5935
6088
  Returns:
@@ -7117,7 +7270,7 @@ class ILAdminQmgr:
7117
7270
  # (CSV / epoch / 노드 / 확장 - 줄바꿈 구분)로, 옛 엔진은 arg2 를 안 읽고 종전 REPORT 로 답한다 - 둘 다 받는다.
7118
7271
  res = self.service.inquire_data_or_report(
7119
7272
  self.qmgrName, ILC.MIMQ_CLUSTER_NODE_STATUS, None,
7120
- ILC.MIMQ_COORD_OBSERVER, ILC.MIMQ_CLUSTER_STATUS_EXT_MARK, "")
7273
+ "", ILC.MIMQ_CLUSTER_STATUS_EXT_MARK, "")
7121
7274
  if res.getType() == ILC.MIMQ_LONG_REPORT_MESSAGE:
7122
7275
  body = res.getDataMsg().getData().decode("utf-8", "replace")
7123
7276
  lines = body.split("\n", 3)
@@ -409,8 +409,8 @@ class ILC:
409
409
 
410
410
  # 클러스터(HA) - 클라이언트 페일오버 지원
411
411
  MIMQ_CLUSTER_NODE_STATUS = 3370
412
- #: 3370 요청 arg1 = 관측 표시(엔진 r3500 부터는 읽지 않는다 - 옛 엔진에 리스를 건드리지 않는 값).
413
- MIMQ_COORD_OBSERVER = "O"
412
+ # 다음 판: 3370 요청 arg1 관측 표시 MIMQ_COORD_OBSERVER("O", 판사 시절)를 없앴다 - arg1 은 빈칸이다.
413
+ # 엔진 r3486 부터 이 칸을 읽지 않고 r3603 부터 엔진 C++ API 도 빈칸으로 보낸다(getClusterRole 은 원래 빈칸).
414
414
  #: 3370 요청 arg2 = 확장 응답 요청. 엔진 r3500 부터 LONG_REPORT 4줄로 답한다(옛 엔진은 무시하고 REPORT).
415
415
  MIMQ_CLUSTER_STATUS_EXT_MARK = "X"
416
416
  MIMQ_CLUSTER_CLIENT_INFO = 3373
@@ -484,14 +484,8 @@ class ILC:
484
484
  # 노드(큐관리자)에게 묻는 런타임 관측 리포트 (OBS-1). TEXT | JSON
485
485
  MIMQ_GET_CLUSTER_RUNTIME = 3381
486
486
 
487
- # 클러스터 속성 블롭 레이아웃 (C++ ClusterProperty.hpp 정본)
488
- # 고정부(768) + 노드수(5) + 노드 x 384 - **가변 길이**라 고정폭 리스트 파서를 쓸 수 없다.
489
- # 판 이력: 256 -> 512(CLSTOPO-1, 3-서비스 토폴로지) -> 768(컴트롤러 정족수).
490
- # ★ 768 판부터는 블롭 앞머리에 판 표시가 있다(:data:`ilink.properties.CLUSTER_LAYOUT_MARK`).
491
- # 그 전 판은 표시가 없어 **레거시로 보고 거절**한다 - 길이로는 못 가른다
492
- # (512+5+256 과 768+5+0 이 둘 다 773 이다).
493
- MIMQ_VO_CLUSTER_LEN = 768
494
- MIMQ_VO_CLUSTER_NODE_LEN = 384
487
+ # 0.22.3: 클러스터 속성의 옛 고정폭 블롭(768 + 5 + 384 x N) 상수 MIMQ_VO_CLUSTER_LEN / MIMQ_VO_CLUSTER_NODE_LEN 을 없앴다 -
488
+ # 엔진 r3601 이 클러스터를 Property v2(JSON) 전용으로 바꾸며 그 형식을 지웠다.
495
489
  MIMQ_LIST_SIZE_LENGTH = 5
496
490
 
497
491
  # ------------------------------------------------------------------
@@ -983,8 +977,8 @@ class ILC:
983
977
  #: 능력 선언의 최대 길이(접두 포함). 넘으면 **자르지 않고 통째로 버린다** -
984
978
  #: 자르면 ``clsblob=2`` 가 ``clsblob=`` 가 되어 **읽히는데 뜻이 다른** 값이 된다.
985
979
  MIMQ_CLIENT_CAPS_MAX = 63
986
- #: 이 클라가 읽고 쓰는 클러스터 블롭 판. :data:`ilink.properties.CLUSTER_LAYOUT_MARK`
987
- #: 와 능력 선언이 **모두 이 값에서 나온다** - 판 번호를 두 곳에 적지 않는다.
980
+ #: 능력 선언(``CAP=clsblob=2``)의 클러스터 블롭 판. 0.22.3 부터 클라는 클러스터를 JSON 으로만 주고받지만(옛 블롭 코덱 제거)
981
+ #: 접속 능력 선언 토큰은 바꾸지 않는다 - 엔진이 핸드셰이크에서 읽는 값이다.
988
982
  MIMQ_CLUSTER_BLOB_VERSION = 2
989
983
  MIMQ_SESSION_STATUS_DEAD = 0
990
984
  MIMQ_SESSION_STATUS_IDLE = 1
@@ -82,7 +82,10 @@ class ILException(Exception):
82
82
  cause = self.__cause__ or (self.args[0] if self.args else None)
83
83
  # 0.18.1: 시간 초과도 코드만으로는 **무엇이 얼마나 걸렸고 마지막에 무슨 답을 받았나**가 안 보인다 -
84
84
  # 발행 시간 초과를 "내부 오류" 로 오독한 일이 있었다(회귀 · 엔진). 원인 문구를 붙인다
85
- if isinstance(cause, (ILDeserializeException, ILTimeoutException)):
85
+ # 다음 판: Property v2 본문 규칙 위반(모르는 열거 문자열 · 값 종류 · 깨진 JSON)도 원인이 코드로 안 담긴다 - 전에는
86
+ # "MIMQE_INTERNAL_ERROR" 만 보였다
87
+ from ._propv2 import PropV2Error
88
+ if isinstance(cause, (ILDeserializeException, ILTimeoutException, PropV2Error)):
86
89
  detail = str(cause).strip()
87
90
  if detail and detail not in base:
88
91
  return f"{base} {detail}"