X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_common%2Fmsglocal.py;h=b0abb895ce623291af5ff4ab4e13cbbb413d3bd8;hb=refs%2Fchanges%2F46%2F6746%2F1;hp=75fc71718473b485b988ac099e0e58010b52de6d;hpb=ebbf35359cebd00c42afc93f0d65ab61b38ad70a;p=osm%2Fcommon.git diff --git a/osm_common/msglocal.py b/osm_common/msglocal.py index 75fc717..b0abb89 100644 --- a/osm_common/msglocal.py +++ b/osm_common/msglocal.py @@ -1,9 +1,27 @@ +# -*- coding: utf-8 -*- + +# Copyright 2018 Telefonica S.A. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import logging import os import yaml import asyncio from osm_common.msgbase import MsgBase, MsgException from time import sleep +from http import HTTPStatus __author__ = "Alfonso Tierno " @@ -37,7 +55,7 @@ class MsgLocal(MsgBase): except MsgException: raise except Exception as e: # TODO refine - raise MsgException(str(e)) + raise MsgException(str(e), http_code=HTTPStatus.INTERNAL_SERVER_ERROR) def disconnect(self): for f in self.files_read.values(): @@ -65,7 +83,7 @@ class MsgLocal(MsgBase): yaml.safe_dump({key: msg}, self.files_write[topic], default_flow_style=True, width=20000) self.files_write[topic].flush() except Exception as e: # TODO refine - raise MsgException(str(e)) + raise MsgException(str(e), HTTPStatus.INTERNAL_SERVER_ERROR) def read(self, topic, blocks=True): """ @@ -96,9 +114,9 @@ class MsgLocal(MsgBase): return None sleep(2) except Exception as e: # TODO refine - raise MsgException(str(e)) + raise MsgException(str(e), HTTPStatus.INTERNAL_SERVER_ERROR) - async def aioread(self, topic, loop): + async def aioread(self, topic, loop=None, callback=None, aiocallback=None, **kwargs): """ Asyncio read from one or several topics. It blocks :param topic: can be str: single topic; or str list: several topics @@ -109,12 +127,17 @@ class MsgLocal(MsgBase): while True: msg = self.read(topic, blocks=False) if msg: - return msg + if callback: + callback(*msg, **kwargs) + elif aiocallback: + await aiocallback(*msg, **kwargs) + else: + return msg await asyncio.sleep(2, loop=loop) except MsgException: raise except Exception as e: # TODO refine - raise MsgException(str(e)) + raise MsgException(str(e), HTTPStatus.INTERNAL_SERVER_ERROR) async def aiowrite(self, topic, key, msg, loop=None): """