我有一个Python脚本,该脚本可以无限期地连接到SQL Server和ActiveMQ服务器,并且我正在尝试构建可以分别处理两者断开连接的内容。每当连接断开时,我都想重新连接到服务器。但是,ActiveMQ连接断开连接的频率比SQL连接断开的频率要高得多,我不想因为ActiveMQ连接断开而多次重新连接到SQL Server。
这是我到目前为止所拥有的:
def connectSQL(host, port):
try:
time.sleep(5)
connSQL = pyodbc.connect(driver='{ODBC Driver 17 for SQL Server}',
server=sqlserver,
database=sqldb,
uid=sqluser,pwd=sqlpassword)
cursor = connSQL.cursor()
def connectActiveMQ(host, port):
try:
time.sleep(5)
conn = stomp.Connection(host_and_ports = [(host, port)],heartbeats=(1000, 1000))
conn.set_listener('', MyListener(conn))
connect_and_subscribe(conn)
print("Deployed ActiveMQ listener ...")
while True:
time.sleep(10)
except:
print("ActiveMQ connection broke, redeploying listener")
connectActiveMQ(host, port)
connectActiveMQ(host,port)
#Here is a ValueError representing a SQL disconnect
raise ValueError('SQL connection broke')
except:
print("SQL connection broke, reconnecting to SQL")
connectSQL(host, port)
connectSQL(host,port)
这非常适合于重新连接到ActiveMQ,但不适用于SQL。一旦它已经连接到SQL,由于ActiveMQ循环,任何错误都变得不可访问(如果两个连接都经过一会儿,在此代码中,raise ValueError“ SQL连接中断”将变得不可访问)。我需要连接无限期地运行,但是我不知道我还能在哪里放置while:True等待语句。
如何重写此代码,以便可以无限期并行捕获ActiveMQ和SQL断开连接?
快速修复:使用线程或多处理。这是一个使用线程的代码段。
import threading
def connectSQL(host, port):
try:
time.sleep(5)
connSQL = pyodbc.connect(driver='{ODBC Driver 17 for SQL Server}',
server=sqlserver,
database=sqldb,
uid=sqluser,pwd=sqlpassword)
cursor = connSQL.cursor()
raise ValueError('SQL connection broke')
except:
print("SQL connection broke, reconnecting to SQL")
connectSQL(host, port)
def connectActiveMQ(host, port):
try:
time.sleep(5)
conn = stomp.Connection(host_and_ports = [(host, port)],heartbeats=(1000, 1000))
conn.set_listener('', MyListener(conn))
connect_and_subscribe(conn)
print("Deployed ActiveMQ listener ...")
while True:
time.sleep(10)
except:
print("ActiveMQ connection broke, redeploying listener")
connectActiveMQ(host, port)
t1 = threading.Thread(target=connectActiveMQ, args=(host, port))
t2 = threading.Thread(target=connectSQL, args=(host, port))
t1.start()
t2.start()
P.S。有了该快速修复程序,您绝对应该研究以上注释,以重构各个功能connectSQL
和connectActiveMQ
。如果需要在方法之间共享数据,请查看here。