(self, non_stop = False, interval = 0, timeout = None, long_polling_timeout = None,
logger_level=logging.ERROR, allowed_updates=None)
| 1235 | return handled |
| 1236 | |
| 1237 | def __threaded_polling(self, non_stop = False, interval = 0, timeout = None, long_polling_timeout = None, |
| 1238 | logger_level=logging.ERROR, allowed_updates=None): |
| 1239 | if (not logger_level) or (logger_level < logging.INFO): |
| 1240 | warning = "\n Warning: this message appearance will be changed. Set logger_level=logging.INFO to continue seeing it." |
| 1241 | else: |
| 1242 | warning = "" |
| 1243 | #if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error |
| 1244 | logger.info('Started polling.' + warning) |
| 1245 | self.__stop_polling.clear() |
| 1246 | error_interval = 0.25 |
| 1247 | |
| 1248 | polling_thread = util.WorkerThread(name="PollingThread") |
| 1249 | or_event = util.OrEvent( |
| 1250 | polling_thread.done_event, |
| 1251 | polling_thread.exception_event, |
| 1252 | self.worker_pool.exception_event |
| 1253 | ) |
| 1254 | |
| 1255 | while not self.__stop_polling.wait(interval): |
| 1256 | or_event.clear() |
| 1257 | try: |
| 1258 | polling_thread.put(self.__retrieve_updates, timeout, long_polling_timeout, allowed_updates=allowed_updates) |
| 1259 | or_event.wait() # wait for polling thread finish, polling thread error or thread pool error |
| 1260 | polling_thread.raise_exceptions() |
| 1261 | self.worker_pool.raise_exceptions() |
| 1262 | error_interval = 0.25 |
| 1263 | except apihelper.ApiException as e: |
| 1264 | handled = self._handle_exception(e) |
| 1265 | if not handled: |
| 1266 | if logger_level and logger_level >= logging.ERROR: |
| 1267 | logger.error("Threaded polling exception: %s", self.__hide_token(str(e))) |
| 1268 | if logger_level and logger_level >= logging.DEBUG: |
| 1269 | logger.error("Exception traceback:\n%s", self.__hide_token(traceback.format_exc())) |
| 1270 | if not non_stop: |
| 1271 | self.__stop_polling.set() |
| 1272 | # if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error |
| 1273 | logger.info("Exception occurred. Stopping." + warning) |
| 1274 | else: |
| 1275 | # if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error |
| 1276 | logger.info("Waiting for {0} seconds until retry".format(error_interval) + warning) |
| 1277 | time.sleep(error_interval) |
| 1278 | if error_interval * 2 < 60: |
| 1279 | error_interval *= 2 |
| 1280 | else: |
| 1281 | error_interval = 60 |
| 1282 | else: |
| 1283 | # polling_thread.clear_exceptions() |
| 1284 | # self.worker_pool.clear_exceptions() |
| 1285 | time.sleep(error_interval) |
| 1286 | polling_thread.clear_exceptions() #* |
| 1287 | self.worker_pool.clear_exceptions() #* |
| 1288 | except KeyboardInterrupt: |
| 1289 | # if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error |
| 1290 | logger.info("KeyboardInterrupt received." + warning) |
| 1291 | self.__stop_polling.set() |
| 1292 | break |
| 1293 | except Exception as e: |
| 1294 | handled = self._handle_exception(e) |
no test coverage detected