22"""
33Entrypoint for starting the application.
44"""
5+ import os
56import logging
7+
8+
69import time
710import threading
811from contextlib import contextmanager
912
10- import daemon as pydaemon
11- import pid
13+ is_nt = os .name == 'nt'
14+
15+ if not is_nt :
16+ import daemon as pydaemon
17+ import pid
18+ else :
19+ pydaemon = pid = None
20+
1221import click
1322
1423from coilmq .config import config as global_config , init_config , init_logging , resolve_name
@@ -61,13 +70,13 @@ def server_from_config(config=None, server_class=None, additional_kwargs=None):
6170
6271 queue_store_factory = resolve_name (config .get ('coilmq' , 'qstore.factory' ))
6372 subscriber_scheduler_factory = resolve_name (config .get (
64- 'coilmq' , 'scheduler.subscriber_priority_factory' ))
73+ 'coilmq' , 'scheduler.subscriber_priority_factory' ))
6574 queue_scheduler_factory = resolve_name (config .get (
66- 'coilmq' , 'scheduler.queue_priority_factory' ))
75+ 'coilmq' , 'scheduler.queue_priority_factory' ))
6776
6877 if config .has_option ('coilmq' , 'auth.factory' ):
6978 authenticator_factory = resolve_name (
70- config .get ('coilmq' , 'auth.factory' ))
79+ config .get ('coilmq' , 'auth.factory' ))
7180 authenticator = authenticator_factory ()
7281 else :
7382 authenticator = None
@@ -120,13 +129,13 @@ def context_serve(context, configfile, listen_addr, listen_port, logfile,
120129
121130 if debug :
122131 poll_interval = float (global_config .get (
123- 'coilmq' , 'debug.stats_poll_interval' ))
132+ 'coilmq' , 'debug.stats_poll_interval' ))
124133 if poll_interval : # Setting poll_interval to 0 effectively disables it.
125134 def diagnostic_loop (server ):
126135 log = logger
127136 while True :
128137 log .debug (
129- "Stats heartbeat -------------------------------" )
138+ "Stats heartbeat -------------------------------" )
130139 store = server .queue_manager .store
131140 for dest in store .destinations ():
132141 log .debug ("Queue %s: size=%s, subscribers=%s" % (
@@ -137,7 +146,7 @@ def diagnostic_loop(server):
137146 time .sleep (poll_interval )
138147
139148 diagnostic_thread = threading .Thread (
140- target = diagnostic_loop , name = 'DiagnosticThread' , args = (server ,))
149+ target = diagnostic_loop , name = 'DiagnosticThread' , args = (server ,))
141150 diagnostic_thread .daemon = True
142151 diagnostic_thread .start ()
143152
@@ -146,7 +155,7 @@ def diagnostic_loop(server):
146155 except (KeyboardInterrupt , SystemExit ):
147156 logger .info ("Stomp server stopped by user interrupt." )
148157 raise SystemExit ()
149- except Exception as e : # pragma: no cover
158+ except Exception as e :
150159 logger .error ("Stomp server stopped due to error: %s" % e )
151160 logger .exception (e )
152161 raise SystemExit ()
@@ -169,13 +178,16 @@ def _main(config=None, host=None, port=None, logfile=None, debug=None,
169178 if port is not None :
170179 global_config .set ('coilmq' , 'listen_port' , str (port ))
171180
181+ if daemon and is_nt :
182+ warnings .warn ("Daemon context is not available for NT platform" )
183+
172184 # in an on-daemon mode, we use a dummy context objectx
173185 # so we can use the same run-server code as the daemon version.
174186 context = pydaemon .DaemonContext (uid = uid ,
175187 gid = gid ,
176188 pidfile = pid .PidFile (pidname = pidfile ) if pidfile else None ,
177189 umask = int (umask , 8 ),
178- working_directory = rundir ) if daemon else contextmanager (lambda : (yield ))()
190+ working_directory = rundir ) if daemon and pydaemon else contextmanager (lambda : (yield ))()
179191
180192 context_serve (context , config , host , port , logfile , debug , daemon , uid , gid , pidfile , umask , rundir )
181193
0 commit comments