16 # import standard library |
16 # import standard library |
17 import atexit |
17 import atexit |
18 import logging |
18 import logging |
19 logger = logging.getLogger('PyAMS (scheduler') |
19 logger = logging.getLogger('PyAMS (scheduler') |
20 |
20 |
|
21 import sys |
|
22 |
21 # import interfaces |
23 # import interfaces |
22 from pyams_scheduler.interfaces import SCHEDULER_HANDLER_KEY, SCHEDULER_NAME |
24 from pyams_scheduler.interfaces import SCHEDULER_HANDLER_KEY, SCHEDULER_NAME |
23 from pyams_utils.interfaces import PYAMS_APPLICATION_SETTINGS_KEY, PYAMS_APPLICATION_DEFAULT_NAME |
25 from pyams_utils.interfaces import PYAMS_APPLICATION_SETTINGS_KEY, PYAMS_APPLICATION_DEFAULT_NAME |
24 from pyams_utils.interfaces.zeo import IZEOConnection |
26 from pyams_utils.interfaces.zeo import IZEOConnection |
25 from zope.interface.interfaces import ComponentLookupError |
27 from zope.interface.interfaces import ComponentLookupError |
27 # import packages |
29 # import packages |
28 from pyams_scheduler.process import SchedulerProcess, SchedulerMessageHandler |
30 from pyams_scheduler.process import SchedulerProcess, SchedulerMessageHandler |
29 from pyams_utils.registry import set_local_registry, query_utility |
31 from pyams_utils.registry import set_local_registry, query_utility |
30 from pyams_utils.zodb import get_connection_from_settings |
32 from pyams_utils.zodb import get_connection_from_settings |
31 from pyams_zmq.process import process_exit_func |
33 from pyams_zmq.process import process_exit_func |
32 from zmq.error import ZMQError |
|
33 |
34 |
34 |
35 |
35 def include_package(config): |
36 def include_package(config): |
36 """Pyramid package include""" |
37 """Pyramid package include""" |
37 |
38 |
44 except ImportError: |
45 except ImportError: |
45 config.scan(ignore='pyams_scheduler.zmi') |
46 config.scan(ignore='pyams_scheduler.zmi') |
46 else: |
47 else: |
47 config.scan() |
48 config.scan() |
48 |
49 |
49 start_handler = config.registry.settings.get(SCHEDULER_HANDLER_KEY, False) |
50 # Check for upgrade mode |
|
51 if sys.argv[0].endswith('pyams_upgrade'): |
|
52 return |
|
53 |
|
54 settings = config.registry.settings |
|
55 start_handler = settings.get(SCHEDULER_HANDLER_KEY, False) |
50 if start_handler: |
56 if start_handler: |
51 # create scheduler process |
|
52 process = SchedulerProcess(start_handler, SchedulerMessageHandler, config.registry) |
|
53 # get database connection |
57 # get database connection |
54 connection = get_connection_from_settings(config.registry.settings) |
58 connection = get_connection_from_settings(settings) |
55 root = connection.root() |
59 root = connection.root() |
56 # get application |
60 # get application |
57 application_name = config.registry.settings.get(PYAMS_APPLICATION_SETTINGS_KEY, |
61 application_name = settings.get(PYAMS_APPLICATION_SETTINGS_KEY, PYAMS_APPLICATION_DEFAULT_NAME) |
58 PYAMS_APPLICATION_DEFAULT_NAME) |
|
59 application = root.get(application_name) |
62 application = root.get(application_name) |
60 if application is not None: |
63 if application is not None: |
61 sm = application.getSiteManager() |
64 sm = application.getSiteManager() |
62 set_local_registry(sm) |
65 set_local_registry(sm) |
63 try: |
66 try: |
67 except ComponentLookupError: |
70 except ComponentLookupError: |
68 pass |
71 pass |
69 else: |
72 else: |
70 zeo_connection = query_utility(IZEOConnection, name=zeo_connection_name) |
73 zeo_connection = query_utility(IZEOConnection, name=zeo_connection_name) |
71 if zeo_connection is not None: |
74 if zeo_connection is not None: |
|
75 # create scheduler process |
|
76 process = SchedulerProcess(start_handler, SchedulerMessageHandler, config.registry) |
72 # load tasks |
77 # load tasks |
73 for task in scheduler_util.values(): |
78 for task in scheduler_util.values(): |
74 trigger = task.get_trigger(config.registry) |
79 trigger = task.get_trigger(config.registry) |
75 logger.debug("Adding scheduler job for task '{0.name}'".format(task)) |
80 logger.debug("Adding scheduler job for task '{0.name}'".format(task)) |
76 process.scheduler.add_job(task, trigger, |
81 process.scheduler.add_job(task, trigger, |
77 id=str(task.internal_id), |
82 id=str(task.internal_id), |
78 name=task.name, |
83 name=task.name, |
79 kwargs={'zeo_settings': zeo_connection.get_settings(), |
84 kwargs={'zeo_settings': zeo_connection.get_settings(), |
80 'registry': config.registry}) |
85 'registry': config.registry}) |
81 logger.debug("Starting tasks scheduler {0!r}".format(process)) |
|
82 # start process |
86 # start process |
|
87 logger.debug("Starting tasks scheduler {0!r}...".format(process)) |
83 process.start() |
88 process.start() |
84 if process.is_alive(): |
89 if process.is_alive(): |
85 atexit.register(process_exit_func, process=process) |
90 atexit.register(process_exit_func, process=process) |
86 finally: |
91 finally: |
87 if not process.is_alive(): |
92 if not process.is_alive(): |