|
@@ -3,8 +3,10 @@ import argparse
|
|
|
from functools import wraps
|
|
|
from pynats import NATSClient
|
|
|
from a2s.proto.service_pb2 import NatsRequest, NatsResponse
|
|
|
+from a2s.tools import json_serialize, json_deserialize, get_host_ip
|
|
|
import time
|
|
|
import logging
|
|
|
+import uuid
|
|
|
|
|
|
|
|
|
def callback():
|
|
@@ -18,6 +20,9 @@ def simple_params(func):
|
|
|
parser.add_argument('-host', '--nats_host', type=str, default="192.168.3.240", help='nats主机')
|
|
|
parser.add_argument('-port', '--nats_port', type=int, default=19090, help='nats端口')
|
|
|
parser.add_argument('-subject', '--subject', type=str, default="test", help='监听主题名称')
|
|
|
+ parser.add_argument('-manager_subject', '--manager_subject', type=str, help='监听关闭服务的主题')
|
|
|
+ parser.add_argument('-manager_queue', '--manager_queue', type=str, help='关闭服务的队列名称,推荐使用默认的uuid')
|
|
|
+ parser.add_argument('-server_host', '--server_host', type=str, help='关闭服务的队列名称,推荐使用默认的uuid')
|
|
|
parser.add_argument('-queue', '--queue', type=str, default="main", help='队列名称')
|
|
|
parser.add_argument('-minWorktime', '--min_worktime', type=int, default=0,
|
|
|
help='用于修正超时时间,超时时间-min_worktime为真正的超时时间,减少无用的数据处理')
|
|
@@ -35,17 +40,17 @@ def watch(func):
|
|
|
nats_host = kwargs.get("nats_host")
|
|
|
nats_port = kwargs.get("nats_port")
|
|
|
subject = kwargs.get("subject")
|
|
|
+ manager_subject = kwargs.get("manager_subject")
|
|
|
+ manager_queue = uuid.uuid4().hex if not kwargs.get("manager_queue") else kwargs.get("manager_queue")
|
|
|
queue = kwargs.get("queue")
|
|
|
+ server_host = kwargs.get("server_host", None)
|
|
|
min_worktime = kwargs.get("min_worktime", 0)
|
|
|
call_back = kwargs.get("callback", callback)
|
|
|
+ if manager_subject and not server_host:
|
|
|
+ logging.warning("不知道你是否需要启用监控系统,因为你的server_host没有设置,监控系统将不会启用")
|
|
|
if not (nats_host and nats_port and subject and queue):
|
|
|
- raise Exception("""请检查参数,使用举例:
|
|
|
-1、使用方法
|
|
|
-@watch
|
|
|
-def say_hello(nats_host="192.168.3.109", nats_port=800, subject="text2vec", queue="main",data):
|
|
|
- print(data)
|
|
|
-
|
|
|
-2、建议使用:
|
|
|
+ raise Exception("""
|
|
|
+建议使用:
|
|
|
@simple_params
|
|
|
@watch
|
|
|
def main(data: bytes, *args, **kwargs) -> bytes:
|
|
@@ -53,9 +58,11 @@ def main(data: bytes, *args, **kwargs) -> bytes:
|
|
|
NatsIp = f"nats://{nats_host}:{nats_port}"
|
|
|
ListenSubject = subject + "_req"
|
|
|
PublishSubject = subject + "_resp"
|
|
|
- logging.warning(f"服务启动中>>>>listen::{ListenSubject}:,,publish:{PublishSubject}")
|
|
|
+ logging.warning(
|
|
|
+ f"服务启动中>>>>listen::{ListenSubject}:,,publish:{PublishSubject},queue:{queue},manager:{manager_subject},manager_queue:{manager_queue},server_host:{server_host}")
|
|
|
with NATSClient(NatsIp, name=subject) as nc:
|
|
|
nc.connect()
|
|
|
+ worker_closed = False
|
|
|
|
|
|
def message_handler(msg):
|
|
|
try:
|
|
@@ -74,8 +81,21 @@ def main(data: bytes, *args, **kwargs) -> bytes:
|
|
|
except Exception as e:
|
|
|
logging.warning(e)
|
|
|
|
|
|
+ def nodes_worker_closed(msg):
|
|
|
+ nonlocal worker
|
|
|
+ nonlocal worker_closed
|
|
|
+ close_msg = json_deserialize(msg.payload)
|
|
|
+ host = close_msg.get("host", None)
|
|
|
+ logging.warning(f"关闭服务节点Subject: {msg.subject}:::{msg.payload}::{host}::{server_host}")
|
|
|
+ if not worker_closed and host and host == server_host:
|
|
|
+ nc.unsubscribe(worker)
|
|
|
+ worker_closed = True
|
|
|
+ logging.warning("订阅服务关闭成功......")
|
|
|
+
|
|
|
logging.warning(f"服务启动成功......")
|
|
|
- nc.subscribe(subject=ListenSubject, callback=message_handler, queue=queue)
|
|
|
+ worker = nc.subscribe(subject=ListenSubject, callback=message_handler, queue=queue)
|
|
|
+ if manager_subject:
|
|
|
+ work_manager = nc.subscribe(subject=manager_subject, callback=nodes_worker_closed, queue=manager_queue)
|
|
|
nc.wait()
|
|
|
|
|
|
return wrapper
|