本文整理汇总了Python中synergy.db.dao.unit_of_work_dao.UnitOfWorkDao.insert方法的典型用法代码示例。如果您正苦于以下问题:Python UnitOfWorkDao.insert方法的具体用法?Python UnitOfWorkDao.insert怎么用?Python UnitOfWorkDao.insert使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类synergy.db.dao.unit_of_work_dao.UnitOfWorkDao
的用法示例。
在下文中一共展示了UnitOfWorkDao.insert方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: create_and_insert_unit_of_work
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import insert [as 别名]
def create_and_insert_unit_of_work(process_name, start_id, end_id, state=unit_of_work.STATE_REQUESTED,
timeperiod='INVALID_TIMEPERIOD'):
""" method creates and inserts a unit_of_work into DB
:return id of the created object in the db"""
uow = create_unit_of_work(process_name, start_id, end_id, timeperiod, state)
logger = get_logger(process_name)
uow_dao = UnitOfWorkDao(logger)
uow_id = uow_dao.insert(uow)
return uow_id
示例2: AbstractStateMachine
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import insert [as 别名]
class AbstractStateMachine(object):
""" Abstract state machine used to govern all processes and their states """
def __init__(self, logger, timetable, name):
self.name = name
self.logger = logger
self.publishers = PublishersPool(self.logger)
self.timetable = timetable
self.uow_dao = UnitOfWorkDao(self.logger)
self.job_dao = JobDao(self.logger)
def __del__(self):
try:
self.logger.info('Closing Flopsy Publishers Pool...')
self.publishers.close()
except Exception as e:
self.logger.error('Exception caught while closing Flopsy Publishers Pool: %s' % str(e))
def _log_message(self, level, process_name, timeperiod, msg):
""" method performs logging into log file and Timetable's tree node"""
self.timetable.add_log_entry(process_name, timeperiod, msg)
self.logger.log(level, msg)
@with_reconnect
def _insert_uow(self, process_name, start_timeperiod, end_timeperiod, start_id, end_id):
"""creates unit_of_work and inserts it into the DB
:raise DuplicateKeyError: if unit_of_work with given parameters already exists """
uow = UnitOfWork()
uow.process_name = process_name
uow.timeperiod = start_timeperiod
uow.start_id = str(start_id)
uow.end_id = str(end_id)
uow.start_timeperiod = start_timeperiod
uow.end_timeperiod = end_timeperiod
uow.created_at = datetime.utcnow()
uow.source = context.process_context[process_name].source
uow.sink = context.process_context[process_name].sink
uow.state = unit_of_work.STATE_REQUESTED
uow.unit_of_work_type = TYPE_MANAGED
uow.number_of_retries = 0
uow.arguments = context.process_context[process_name].arguments
uow.db_id = self.uow_dao.insert(uow)
msg = 'Created: UOW %s for %s in timeperiod [%s:%s).' \
% (uow.db_id, process_name, start_timeperiod, end_timeperiod)
self._log_message(INFO, process_name, start_timeperiod, msg)
return uow
def _publish_uow(self, uow):
mq_request = SynergyMqTransmission(process_name=uow.process_name, unit_of_work_id=uow.db_id)
publisher = self.publishers.get(uow.process_name)
publisher.publish(mq_request.document)
publisher.release()
msg = 'Published: UOW %r for %r in timeperiod %r.' % (uow.db_id, uow.process_name, uow.start_timeperiod)
self._log_message(INFO, uow.process_name, uow.start_timeperiod, msg)
def insert_and_publish_uow(self, process_name, start_timeperiod, end_timeperiod, start_id, end_id):
""" method creates and publishes a unit_of_work. it also handles DuplicateKeyError and attempts recovery
:return: tuple (uow, is_duplicate)
:raise UserWarning: if the recovery from DuplicateKeyError was unsuccessful
"""
is_duplicate = False
try:
uow = self._insert_uow(process_name, start_timeperiod, end_timeperiod, start_id, end_id)
except DuplicateKeyError as e:
is_duplicate = True
msg = 'Catching up with latest unit_of_work %s in timeperiod %s, because of: %r' \
% (process_name, start_timeperiod, e)
self._log_message(WARNING, process_name, start_timeperiod, msg)
uow = self.uow_dao.recover_from_duplicatekeyerror(e)
if uow is None:
msg = 'MANUAL INTERVENTION REQUIRED! Unable to locate unit_of_work for %s in %s' \
% (process_name, start_timeperiod)
self._log_message(WARNING, process_name, start_timeperiod, msg)
raise UserWarning(msg)
# publish the created/caught up unit_of_work
self._publish_uow(uow)
return uow, is_duplicate
def shallow_state_update(self, uow):
""" method does not trigger any new actions
if applicable, it will update job_record state and Timetable tree node state
:assumptions: uow is either in STATE_CANCELED or STATE_PROCESSED """
pass
def _process_state_embryo(self, job_record):
""" method that takes care of processing job records in STATE_EMBRYO state"""
pass
def _process_state_in_progress(self, job_record):
""" method that takes care of processing job records in STATE_IN_PROGRESS state"""
pass
def _process_state_final_run(self, job_record):
"""method takes care of processing job records in STATE_FINAL_RUN state"""
pass
#.........这里部分代码省略.........
示例3: StateMachineFreerun
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import insert [as 别名]
class StateMachineFreerun(object):
""" State Machine to handle freerun jobs/triggers """
def __init__(self, logger, name=STATE_MACHINE_FREERUN):
self.name = name
self.logger = logger
self.mq_transmitter = MqTransmitter(self.logger)
self.uow_dao = UnitOfWorkDao(self.logger)
self.sfe_dao = FreerunProcessDao(self.logger)
@with_reconnect
def _log_message(self, level, freerun_entry, msg):
""" method performs logging into log file and the freerun_entry """
self.logger.log(level, msg)
assert isinstance(freerun_entry, FreerunProcessEntry)
event_log = freerun_entry.event_log
if len(event_log) > MAX_NUMBER_OF_EVENTS:
del event_log[-1]
event_log.insert(0, msg)
self.sfe_dao.update(freerun_entry)
@with_reconnect
def _insert_uow(self, freerun_entry):
""" creates unit_of_work and inserts it into the DB
:raise DuplicateKeyError: if unit_of_work with given parameters already exists """
current_timeperiod = time_helper.actual_timeperiod(QUALIFIER_REAL_TIME)
process_entry = context.process_context[freerun_entry.process_name]
uow = UnitOfWork()
uow.process_name = freerun_entry.schedulable_name
uow.timeperiod = current_timeperiod
uow.start_id = 0
uow.end_id = 0
uow.start_timeperiod = current_timeperiod
uow.end_timeperiod = current_timeperiod
uow.created_at = datetime.utcnow()
uow.submitted_at = datetime.utcnow()
uow.source = process_entry.source if hasattr(process_entry, 'source') else None
uow.sink = process_entry.sink if hasattr(process_entry, 'sink') else None
uow.state = unit_of_work.STATE_REQUESTED
uow.unit_of_work_type = unit_of_work.TYPE_FREERUN
uow.number_of_retries = 0
uow.arguments = freerun_entry.arguments
uow.db_id = self.uow_dao.insert(uow)
msg = 'Created: UOW {0} for {1}@{2}.' \
.format(uow.db_id, freerun_entry.schedulable_name, current_timeperiod)
self._log_message(INFO, freerun_entry, msg)
return uow
def _publish_uow(self, freerun_entry, uow):
self.mq_transmitter.publish_freerun_uow(freerun_entry, uow)
msg = 'Published: UOW {0} for {1}.'.format(uow.db_id, freerun_entry.schedulable_name)
self._log_message(INFO, freerun_entry, msg)
def insert_and_publish_uow(self, freerun_entry):
try:
uow = self._insert_uow(freerun_entry)
except DuplicateKeyError as e:
msg = 'Duplication of UOW found for {0}. Error msg: {1}'.format(freerun_entry.schedulable_name, e)
self._log_message(WARNING, freerun_entry, msg)
uow = self.uow_dao.recover_from_duplicatekeyerror(e)
if uow is not None:
# publish the created/caught up unit_of_work
self._publish_uow(freerun_entry, uow)
freerun_entry.related_unit_of_work = uow.db_id
self.sfe_dao.update(freerun_entry)
else:
msg = 'PERSISTENT TIER ERROR! Unable to locate UOW for {0}' \
.format(freerun_entry.schedulable_name)
self._log_message(WARNING, freerun_entry, msg)
def _process_state_embryo(self, freerun_entry):
""" method creates unit_of_work and associates it with the FreerunProcessEntry """
self.insert_and_publish_uow(freerun_entry)
def _process_state_in_progress(self, freerun_entry, uow):
""" method that takes care of processing unit_of_work records in STATE_REQUESTED or STATE_IN_PROGRESS states"""
self._publish_uow(freerun_entry, uow)
def _process_terminal_state(self, freerun_entry, uow):
""" method that takes care of processing unit_of_work records in
STATE_PROCESSED, STATE_NOOP, STATE_INVALID, STATE_CANCELED states"""
msg = 'UOW for {0} found in state {1}.'.format(freerun_entry.schedulable_name, uow.state)
self._log_message(INFO, freerun_entry, msg)
self.insert_and_publish_uow(freerun_entry)
def manage_schedulable(self, freerun_entry):
""" method main duty - is to _avoid_ publishing another unit_of_work, if previous was not yet processed
In case the Scheduler sees that the unit_of_work is pending it will fire another WorkerMqRequest """
assert isinstance(freerun_entry, FreerunProcessEntry)
if freerun_entry.related_unit_of_work is None:
uow = None
else:
uow = self.uow_dao.get_one(freerun_entry.related_unit_of_work)
try:
#.........这里部分代码省略.........
示例4: AbstractStateMachine
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import insert [as 别名]
class AbstractStateMachine(object):
""" Abstract state machine used to host common logic for the rest of registered State Machines """
def __init__(self, logger, timetable, name):
self.name = name
self.logger = logger
self.mq_transmitter = MqTransmitter(self.logger)
self.timetable = timetable
self.uow_dao = UnitOfWorkDao(self.logger)
self.job_dao = JobDao(self.logger)
@property
def run_on_active_timeperiod(self):
"""
:return: True if given State Machine allows execution on *live* timeperiod, as opposed to the finished one
"""
raise NotImplementedError('property run_on_active_timeperiod must be implemented by {0}'
.format(self.__class__.__name__))
def _log_message(self, level, process_name, timeperiod, msg):
""" method performs logging into log file and Timetable's tree node"""
self.timetable.add_log_entry(process_name, timeperiod, msg)
self.logger.log(level, msg)
@with_reconnect
def _insert_uow(self, process_name, timeperiod, start_timeperiod, end_timeperiod, start_id, end_id):
"""creates unit_of_work and inserts it into the DB
:raise DuplicateKeyError: if unit_of_work with given parameters already exists """
uow = UnitOfWork()
uow.process_name = process_name
uow.timeperiod = timeperiod
uow.start_id = str(start_id)
uow.end_id = str(end_id)
uow.start_timeperiod = start_timeperiod
uow.end_timeperiod = end_timeperiod
uow.created_at = datetime.utcnow()
uow.submitted_at = datetime.utcnow()
uow.source = context.process_context[process_name].source
uow.sink = context.process_context[process_name].sink
uow.state = unit_of_work.STATE_REQUESTED
uow.unit_of_work_type = unit_of_work.TYPE_MANAGED
uow.number_of_retries = 0
uow.arguments = context.process_context[process_name].arguments
uow.db_id = self.uow_dao.insert(uow)
msg = 'Created: UOW {0} for {1}@{2}.'.format(uow.db_id, process_name, start_timeperiod)
self._log_message(INFO, process_name, start_timeperiod, msg)
return uow
def _publish_uow(self, uow):
self.mq_transmitter.publish_managed_uow(uow)
msg = 'Published: UOW {0} for {1}@{2}.'.format(uow.db_id, uow.process_name, uow.start_timeperiod)
self._log_message(INFO, uow.process_name, uow.start_timeperiod, msg)
def insert_and_publish_uow(self, job_record, start_id, end_id):
""" method creates and publishes a unit_of_work. it also handles DuplicateKeyError and attempts recovery
:return: tuple (uow, is_duplicate)
:raise UserWarning: if the recovery from DuplicateKeyError was unsuccessful
"""
process_name = job_record.process_name
timeperiod = job_record.timeperiod
start_timeperiod = self.compute_start_timeperiod(job_record.process_name, job_record.timeperiod)
end_timeperiod = self.compute_end_timeperiod(job_record.process_name, job_record.timeperiod)
try:
is_duplicate = False
uow = self._insert_uow(process_name, timeperiod, start_timeperiod, end_timeperiod, start_id, end_id)
except DuplicateKeyError as e:
is_duplicate = True
msg = 'Catching up with latest UOW {0}@{1}, because of: {2}' \
.format(process_name, start_timeperiod, e)
self._log_message(WARNING, process_name, start_timeperiod, msg)
uow = self.uow_dao.recover_from_duplicatekeyerror(e)
if not uow:
msg = 'PERSISTENT TIER ERROR! Unable to locate UOW for {0}@{1}' \
.format(process_name, start_timeperiod)
self._log_message(WARNING, process_name, start_timeperiod, msg)
raise UserWarning(msg)
if uow.is_canceled:
# this UOW was marked for re-processing. recycle it
uow.created_at = datetime.utcnow() # reset created_at to bypass GC cancellation logic
uow.submitted_at = datetime.utcnow() # reset submitted_at to allow 1 hour free of GC resubmitting
del uow.started_at
del uow.finished_at
del uow.number_of_aggregated_documents
del uow.number_of_processed_documents
uow.state = unit_of_work.STATE_REQUESTED
self.uow_dao.update(uow)
# publish the created/recovered/recycled unit_of_work
self._publish_uow(uow)
return uow, is_duplicate
def notify(self, uow):
""" method is used by StateMachine's users to provide notifications about change in UOW
if applicable, method will update job_record state and Timetable tree node state
:assumptions: uow is in [STATE_NOOP, STATE_CANCELED, STATE_PROCESSED] """
pass
#.........这里部分代码省略.........
示例5: StateMachineFreerun
# 需要导入模块: from synergy.db.dao.unit_of_work_dao import UnitOfWorkDao [as 别名]
# 或者: from synergy.db.dao.unit_of_work_dao.UnitOfWorkDao import insert [as 别名]
class StateMachineFreerun(object):
""" State Machine to handle freerun jobs/triggers """
def __init__(self, logger, name=STATE_MACHINE_FREERUN):
self.name = name
self.logger = logger
self.publishers = PublishersPool(self.logger)
self.uow_dao = UnitOfWorkDao(self.logger)
self.sfe_dao = FreerunProcessDao(self.logger)
def __del__(self):
try:
self.logger.info('Closing Flopsy Publishers Pool...')
self.publishers.close()
except Exception as e:
self.logger.error('Exception caught while closing Flopsy Publishers Pool: %s' % str(e))
@with_reconnect
def _log_message(self, level, freerun_entry, msg):
""" method performs logging into log file and the freerun_entry """
self.logger.log(level, msg)
assert isinstance(freerun_entry, FreerunProcessEntry)
log = freerun_entry.log
if len(log) > MAX_NUMBER_OF_LOG_ENTRIES:
del log[-1]
log.insert(0, msg)
self.sfe_dao.update(freerun_entry)
@with_reconnect
def _insert_uow(self, freerun_entry):
""" creates unit_of_work and inserts it into the DB
:raise DuplicateKeyError: if unit_of_work with given parameters already exists """
current_timeperiod = time_helper.actual_timeperiod(QUALIFIER_REAL_TIME)
uow = UnitOfWork()
uow.process_name = freerun_entry.schedulable_name
uow.timeperiod = current_timeperiod
uow.start_id = 0
uow.end_id = 0
uow.start_timeperiod = current_timeperiod
uow.end_timeperiod = current_timeperiod
uow.created_at = datetime.utcnow()
uow.source = context.process_context[freerun_entry.process_name].source
uow.sink = context.process_context[freerun_entry.process_name].sink
uow.state = unit_of_work.STATE_REQUESTED
uow.unit_of_work_type = TYPE_FREERUN
uow.number_of_retries = 0
uow.arguments = freerun_entry.arguments
uow.db_id = self.uow_dao.insert(uow)
msg = 'Created: UOW %s for %s in timeperiod %s.' \
% (uow.db_id, freerun_entry.schedulable_name, current_timeperiod)
self._log_message(INFO, freerun_entry, msg)
return uow
def _publish_uow(self, freerun_entry, uow):
mq_request = SynergyMqTransmission(process_name=freerun_entry.process_name,
entry_name=freerun_entry.entry_name,
unit_of_work_id=uow.db_id)
publisher = self.publishers.get(freerun_entry.process_name)
publisher.publish(mq_request.document)
publisher.release()
msg = 'Published: UOW %s for %s.' % (uow.db_id, freerun_entry.schedulable_name)
self._log_message(INFO, freerun_entry, msg)
def insert_and_publish_uow(self, freerun_entry):
try:
uow = self._insert_uow(freerun_entry)
except DuplicateKeyError as e:
msg = 'Duplication of unit_of_work found for %s. Error msg: %r' % (freerun_entry.schedulable_name, e)
self._log_message(WARNING, freerun_entry, msg)
uow = self.uow_dao.recover_from_duplicatekeyerror(e)
if uow is not None:
# publish the created/caught up unit_of_work
self._publish_uow(freerun_entry, uow)
freerun_entry.related_unit_of_work = uow.db_id
self.sfe_dao.update(freerun_entry)
else:
msg = 'SYSTEM IS LIKELY IN UNSTABLE STATE! Unable to locate unit_of_work for %s' \
% freerun_entry.schedulable_name
self._log_message(WARNING, freerun_entry, msg)
def manage_schedulable(self, freerun_entry):
""" method main duty - is to _avoid_ publishing another unit_of_work, if previous was not yet processed
In case the Scheduler sees that the unit_of_work is pending it will fire another WorkerMqRequest """
assert isinstance(freerun_entry, FreerunProcessEntry)
if freerun_entry.related_unit_of_work is None:
uow = None
else:
uow = self.uow_dao.get_one(freerun_entry.related_unit_of_work)
try:
if uow is None:
self._process_state_embryo(freerun_entry)
#.........这里部分代码省略.........