mns/subscription.py (100 lines of code) (raw):
#coding=utf-8
# Copyright (C) 2015, Alibaba Cloud Computing
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
import time
from .mns_client import MNSClient
from .mns_request import *
from .mns_exception import *
class Subscription:
def __init__(self, topic_name, subscription_name, mns_client, debug=False):
self.topic_name = topic_name
self.subscription_name = subscription_name
self.mns_client = mns_client
self.debug = debug
def set_debug(self, debug):
self.debug = debug
def subscribe(self, subscription_meta, req_info=None):
""" 创建订阅
@type subscription_meta: SubscriptionMeta object
@param subscription_meta: SubscriptionMeta对象,指定订阅的属性
@type req_info: RequestInfo object
@param req_info: 透传到MNS的请求信息
@rtype: string
@return 新创建订阅的URL
@note: Exception
:: MNSClientParameterException 参数格式异常
:: MNSClientNetworkException 网络异常
:: MNSServerException mns处理异常
"""
req = SubscribeRequest(self.topic_name,
self.subscription_name,
subscription_meta.endpoint,
subscription_meta.notify_strategy,
subscription_meta.notify_content_format,
subscription_meta.filter_tag)
req.set_req_info(req_info)
resp = SubscribeResponse()
self.mns_client.subscribe(req, resp)
self.debuginfo(resp)
return resp.subscription_url
def get_attributes(self, req_info=None):
""" 获取订阅属性
@type req_info: RequestInfo object
@param req_info: 透传到MNS的请求信息
@rtype: SubscriptionMeta object
@return 订阅的属性
@note: Exception
:: MNSClientNetworkException 网络异常
:: MNSServerException mns处理异常
"""
req = GetSubscriptionAttributesRequest(self.topic_name, self.subscription_name)
req.set_req_info(req_info)
resp = GetSubscriptionAttributesResponse()
self.mns_client.get_subscription_attributes(req, resp)
subscription_meta = SubscriptionMeta()
self.__resp2meta__(subscription_meta, resp)
self.debuginfo(resp)
return subscription_meta
def set_attributes(self, subscription_meta, req_info=None):
""" 设置订阅的属性
@type subscription_meta: SubscriptionMeta object
@param subscription_meta: 新设置的订阅属性
@type req_info: RequestInfo object
@param req_info: 透传到MNS的请求信息
@note: Exception
:: MNSClientParameterException 参数格式异常
:: MNSClientNetworkException 网络异常
:: MNSServerException mns处理异常
"""
req = SetSubscriptionAttributesRequest(self.topic_name,
self.subscription_name,
subscription_meta.endpoint,
subscription_meta.notify_strategy)
req.set_req_info(req_info)
resp = SetSubscriptionAttributesResponse()
self.mns_client.set_subscription_attributes(req, resp)
self.debuginfo(resp)
def unsubscribe(self, req_info=None):
""" 删除订阅
@type req_info: RequestInfo object
@param req_info: 透传到MNS的请求信息
@note: Exception
:: MNSClientNetworkException 网络异常
:: MNSServerException mns处理异常
"""
req = UnsubscribeRequest(self.topic_name, self.subscription_name)
req.set_req_info(req_info)
resp = UnsubscribeResponse()
self.mns_client.unsubscribe(req, resp)
self.debuginfo(resp)
def debuginfo(self, resp):
if self.debug:
print("===================DEBUG INFO===================")
print("RequestId: %s" % resp.header["x-mns-request-id"])
print("================================================")
def __resp2meta__(self, subscription_meta, resp):
subscription_meta.topic_owner = resp.topic_owner
subscription_meta.topic_name = resp.topic_name
subscription_meta.subscription_name = resp.subscription_name
subscription_meta.endpoint = resp.endpoint
subscription_meta.filter_tag = resp.filter_tag
subscription_meta.notify_strategy = resp.notify_strategy
subscription_meta.notify_content_format = resp.notify_content_format
subscription_meta.create_time = resp.create_time
subscription_meta.last_modify_time = resp.last_modify_time
class SubscriptionMeta:
def __init__(self, endpoint = "", notify_strategy = "", notify_content_format = "", filter_tag = ""):
""" Subscription属性
@note: 设置属性
:: endpoint: 接收端地址, HttpEndpoint, MailEndpoint or QueueEndpoint
:: filter_tag: 消息过滤使用的标签
:: notify_strategy: 向Endpoint推送消息错误时的重试策略
:: notify_content_format: 向Endpoint推送的消息内容格式
@note: 不可设置属性
:: topic_owner: Subscription订阅的Topic的Owner
:: topic_name: Subscription订阅的Topic名称
:: subscription_name: 订阅名称
:: create_time: Subscription的创建时间,从1970-1-1 00:00:00 000到现在的秒值
:: last_modify_time: 修改Subscription属性信息最近时间,从1970-1-1 00:00:00 000到现在的秒值
"""
self.endpoint = endpoint
self.filter_tag = filter_tag
self.notify_strategy = notify_strategy
self.notify_content_format = notify_content_format
self.topic_owner = ""
self.topic_name = ""
self.subscription_name = ""
self.create_time = -1
self.last_modify_time = -1
def set_endpoint(self, endpoint):
self.endpoint = endpoint
def set_filter_tag(self, filter_tag):
self.filter_tag = filter_tag
def set_notify_strategy(self, notify_strategy):
self.notify_strategy = notify_strategy
def set_notify_content_format(self, notify_content_format):
self.notify_content_format = notify_content_format
def __str__(self):
meta_info = {"TopicOwner": self.topic_owner,
"TopicName": self.topic_name,
"SubscriptionName": self.subscription_name,
"Endpoint": self.endpoint,
"FilterTag": self.filter_tag,
"NotifyStrategy": self.notify_strategy,
"NotifyContentFormat": self.notify_content_format,
"CreateTime": time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(self.create_time)),
"LastModifyTime": time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(self.last_modify_time))}
return "\n".join(["%s: %s" % (k.ljust(30),v) for k,v in meta_info.items()])
class SubscriptionNotifyStrategy:
BACKOFF = "BACKOFF_RETRY"
EXPONENTIAL = "EXPONENTIAL_DECAY_RETRY"
class SubscriptionNotifyContentFormat:
XML = "XML"
SIMPLIFIED = "SIMPLIFIED"
JSON = "JSON"