sycommon-python-lib 0.1.20__py3-none-any.whl → 0.1.21__py3-none-any.whl

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.

Potentially problematic release.


This version of sycommon-python-lib might be problematic. Click here for more details.

@@ -517,7 +517,9 @@ class RabbitMQClient:
517
517
  logger.debug("已经在消费中,返回现有consumer_tag")
518
518
  if self._consumer_tag:
519
519
  return self._consumer_tag
520
- raise Exception("消费已启动但未获取到consumer_tag")
520
+ # 如果_is_consuming为True但无consumer_tag,重置状态并重新启动
521
+ logger.warning("检测到消费状态异常(无consumer_tag),重置状态后重试")
522
+ self._is_consuming = False # 重置状态
521
523
 
522
524
  if not self.is_connected:
523
525
  await self.connect()
@@ -532,16 +534,21 @@ class RabbitMQClient:
532
534
  logger.info(f"开始消费队列: {self.actual_queue_name}")
533
535
 
534
536
  try:
537
+ # 调用队列的consume方法,确保获取到consumer_tag
535
538
  self._consumer_tag = await self.queue.consume(
536
539
  self._message_wrapper,
537
540
  no_ack=False # 手动确认消息
538
541
  )
539
542
 
543
+ # 确保consumer_tag有效
544
+ if not self._consumer_tag:
545
+ raise Exception("未能获取到有效的consumer_tag")
546
+
540
547
  logger.info(
541
548
  f"消费者已启动,队列: {self.actual_queue_name}, tag: {self._consumer_tag}")
542
549
  return self._consumer_tag
543
550
  except Exception as e:
544
- self._is_consuming = False
551
+ self._is_consuming = False # 异常时重置状态
545
552
  logger.error(f"启动消费失败: {str(e)}", exc_info=True)
546
553
  raise
547
554
 
@@ -97,10 +97,10 @@ class RabbitMQService:
97
97
  password=cls._config.get('password', ""),
98
98
  virtualhost=cls._config.get('virtual-host', "/"),
99
99
  connection_pool_size=cls._config.get(
100
- 'connection_pool_size', 2), # 连接池大小
100
+ 'connection_pool_size', 5), # 连接池大小
101
101
  channel_pool_size=cls._config.get(
102
102
  'channel_pool_size', 10), # 通道池大小
103
- heartbeat=cls._config.get('heartbeat', 10),
103
+ heartbeat=cls._config.get('heartbeat', 30),
104
104
  app_name=cls._config.get("APP_NAME", "")
105
105
  )
106
106
 
@@ -116,9 +116,6 @@ class RabbitMQService:
116
116
 
117
117
  @classmethod
118
118
  async def _create_client(cls, queue_name: str, **kwargs) -> RabbitMQClient:
119
- """
120
- 创建RabbitMQ客户端实例(基于连接池)
121
- """
122
119
  if not cls._connection_pool:
123
120
  # 等待连接池初始化
124
121
  start_time = asyncio.get_event_loop().time()
@@ -150,8 +147,9 @@ class RabbitMQService:
150
147
  f"允许创建: {create_if_not_exists}"
151
148
  )
152
149
 
153
- return RabbitMQClient(
154
- connection_pool=cls._connection_pool, # 传入连接池实例
150
+ # 创建客户端实例
151
+ client = RabbitMQClient(
152
+ connection_pool=cls._connection_pool,
155
153
  exchange_name=cls._config.get(
156
154
  'exchange_name', "system.topic.exchange"),
157
155
  exchange_type=kwargs.get('exchange_type', "topic"),
@@ -172,6 +170,10 @@ class RabbitMQService:
172
170
  'consumption_stall_threshold', 10)
173
171
  )
174
172
 
173
+ # 使用declare_queue控制是否声明队列(发送器不声明,监听器声明)
174
+ await client.connect(declare_queue=not is_sender)
175
+ return client
176
+
175
177
  @classmethod
176
178
  async def get_client(
177
179
  cls,
@@ -572,11 +574,31 @@ class RabbitMQService:
572
574
  # 确保连接有效
573
575
  if not sender.is_connected:
574
576
  logger.info(f"发送器 '{queue_name}' 连接已关闭,尝试重新连接")
575
- try:
576
- await sender.connect(force_reconnect=True)
577
- except Exception as e:
578
- logger.error(f"发送器 '{queue_name}' 重新连接失败: {str(e)}")
579
- raise
577
+ max_retry = 3 # 最大重试次数
578
+ retry_count = 0
579
+ last_exception = None
580
+
581
+ while retry_count < max_retry:
582
+ try:
583
+ # 尝试重连,每次重试间隔1秒
584
+ await sender.connect(force_reconnect=True, declare_queue=False)
585
+ logger.info(
586
+ f"发送器 '{queue_name}' 第 {retry_count + 1} 次重连成功")
587
+ break # 重连成功则退出循环
588
+ except Exception as e:
589
+ last_exception = e
590
+ retry_count += 1
591
+ logger.warning(
592
+ f"发送器 '{queue_name}' 第 {retry_count} 次重连失败: {str(e)}"
593
+ )
594
+ if retry_count < max_retry:
595
+ await asyncio.sleep(1) # 重试前等待1秒
596
+
597
+ # 所有重试都失败则抛出异常
598
+ if retry_count >= max_retry and not sender.is_connected:
599
+ error_msg = f"发送器 '{queue_name}' 经过 {max_retry} 次重连仍失败"
600
+ logger.error(f"{error_msg}: {str(last_exception)}")
601
+ raise Exception(error_msg) from last_exception
580
602
 
581
603
  try:
582
604
  # 处理消息数据
@@ -2,10 +2,32 @@ import uuid
2
2
 
3
3
 
4
4
  class Snowflake:
5
+ """基于UUID生成兼容Java long类型的唯一ID"""
6
+ _MAX_JAVA_LONG = 9223372036854775807 # Java long最大值(18位)
7
+
5
8
  @staticmethod
6
- def next_id():
7
- hex = uuid.uuid4().hex
8
- uuid_int = int(hex, 16)
9
- uuid_str = str(uuid_int).zfill(32)
10
- id_str = uuid_str[:19]
11
- return str(int(id_str))
9
+ def next_id() -> str:
10
+ """生成不超过Java long最大值的唯一ID字符串(18位以内)"""
11
+ while True:
12
+ # 生成UUID并转换为整数
13
+ uuid_int = int(uuid.uuid4().hex, 16)
14
+
15
+ # 取低63位,并强制限制不超过Java long最大值
16
+ id_num = uuid_int & ((1 << 63) - 1) # 取低63位
17
+ id_num = min(id_num, Snowflake._MAX_JAVA_LONG) # 强制限制最大值
18
+
19
+ # 转换为字符串并验证长度(确保18位以内)
20
+ id_str = str(id_num)
21
+ if len(id_str) <= 18:
22
+ return id_str
23
+
24
+
25
+ # 使用示例
26
+ if __name__ == "__main__":
27
+ # 生成1000个ID并验证
28
+ for _ in range(1000):
29
+ id_str = Snowflake.next_id()
30
+ id_num = int(id_str)
31
+ print(f"ID: {id_str} (长度: {len(id_str)})")
32
+ assert len(id_str) <= 18, f"ID长度超过18位: {id_str}"
33
+ assert id_num <= Snowflake._MAX_JAVA_LONG, f"ID超过Java long最大值: {id_num}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.1.20
3
+ Version: 0.1.21
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -34,9 +34,9 @@ sycommon/models/mqlistener_config.py,sha256=PPwhAVJ2AWvVAvNox_1t0fuBKTyRH3Ui9cuu
34
34
  sycommon/models/mqmsg_model.py,sha256=cxn0M5b0utQK6crMYmL-1waeGYHvK3AlGaRy23clqTE,277
35
35
  sycommon/models/mqsend_config.py,sha256=NQX9dc8PpuquMG36GCVhJe8omAW1KVXXqr6lSRU6D7I,268
36
36
  sycommon/models/sso_user.py,sha256=i1WAN6k5sPcPApQEdtjpWDy7VrzWLpOrOQewGLGoGIw,2702
37
- sycommon/rabbitmq/rabbitmq_client.py,sha256=XWAzQ2A6AxTwISin2biqAzbGnN6XA9T25UX0iXdxb9s,26677
37
+ sycommon/rabbitmq/rabbitmq_client.py,sha256=Grjl_vDFe8fzyjw-bjOE_0keQwi-MQgB_GejCcBssTQ,27099
38
38
  sycommon/rabbitmq/rabbitmq_pool.py,sha256=_NMOO4CZy-I_anMqpzfYinz-8373_rg5FM9eqzdjGyU,3598
39
- sycommon/rabbitmq/rabbitmq_service.py,sha256=lpYSavAwl-UOmz5gTgS3yj2ulfF-s7boL3lsMibN-JM,28881
39
+ sycommon/rabbitmq/rabbitmq_service.py,sha256=NWoMtRhvLjEsIX3sMgaSkrguE3gT5wLYj0u7laWZh8c,29997
40
40
  sycommon/sse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  sycommon/sse/event.py,sha256=k_rBJy23R7crtzQeetT0Q73D8o5-5p-eESGSs_BPOj0,2797
42
42
  sycommon/sse/sse.py,sha256=__CfWEcYxOxQ-HpLor4LTZ5hLWqw9-2X7CngqbVHsfw,10128
@@ -45,10 +45,10 @@ sycommon/synacos/feign.py,sha256=qALBl3YwVGvAzgx6tvwW84GptfS1u8WpapTRTygZROM,212
45
45
  sycommon/synacos/nacos_service.py,sha256=WylpKPd6Q7xsqcvxWWwsLTauuQ1H94p596IQZVT429k,33863
46
46
  sycommon/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  sycommon/tools/docs.py,sha256=OPj2ETheuWjXLyaXtaZPbwmJKfJaYXV5s4XMVAUNrms,1607
48
- sycommon/tools/snowflake.py,sha256=rc-VUjBMMpdAvbnHroVwfVt1xzApJbTCthUy9mglAuw,237
48
+ sycommon/tools/snowflake.py,sha256=DdEj3T5r5OEvikp3puxqmmmz6BrggxomoSlnsRFb5dM,1174
49
49
  sycommon/tools/timing.py,sha256=OiiE7P07lRoMzX9kzb8sZU9cDb0zNnqIlY5pWqHcnkY,2064
50
- sycommon_python_lib-0.1.20.dist-info/METADATA,sha256=XzvaWcMuGVeU3zRoPoG6p0Vci9X_n9nhE68mVonmrsE,7038
51
- sycommon_python_lib-0.1.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- sycommon_python_lib-0.1.20.dist-info/entry_points.txt,sha256=q_h2nbvhhmdnsOUZEIwpuoDjaNfBF9XqppDEmQn9d_A,46
53
- sycommon_python_lib-0.1.20.dist-info/top_level.txt,sha256=98CJ-cyM2WIKxLz-Pf0AitWLhJyrfXvyY8slwjTXNuc,17
54
- sycommon_python_lib-0.1.20.dist-info/RECORD,,
50
+ sycommon_python_lib-0.1.21.dist-info/METADATA,sha256=vKk2qu8-OnQz-uQ_L215FTYtyJnvfD2noOfJjO4jfH4,7038
51
+ sycommon_python_lib-0.1.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
+ sycommon_python_lib-0.1.21.dist-info/entry_points.txt,sha256=q_h2nbvhhmdnsOUZEIwpuoDjaNfBF9XqppDEmQn9d_A,46
53
+ sycommon_python_lib-0.1.21.dist-info/top_level.txt,sha256=98CJ-cyM2WIKxLz-Pf0AitWLhJyrfXvyY8slwjTXNuc,17
54
+ sycommon_python_lib-0.1.21.dist-info/RECORD,,