sqlalchemy中使用event设置条件触发短信与邮件通知
一.原因
近期在做短信与邮件通知系统。使用到了这一块。例如,当订单完成以后进行邮件短信的通知。虽然可以采用直接调用接口的方式实现,但有几个原因让我希望使用条件触发的方式
1.由于系统中支持线上线下以及代充值等多种方式,所以在多个地方订单改变状态。这样就让触发通知的代码凌乱分布。
2.系统将来扩建,需要新增加接口。则需要新增加调用的代码。
总而言之,直接调用将会增加维护难度。因此准备在订单的状态首次被置为支付成功时候进行短信与邮件的通知。
二.模块需求
短信与邮件的通知不能影响内部系统的运行,但由于是远程调用,时间是未知的。为了满足需求,模块必须满足以下条件
1.短信,邮件的发送使用线程
2.触发必须在数据库事务完成的状态下进行。
三.sqlalchemy的监听类型
sqlalchemy是我们采取的数据库后台python接口。它的事务触发机制包括
1.orm中的字段改变触发
2.orm对象状态改变触发
3.session改变触发
4.连接池事件,连接事件
四.具体实现
1.方式一
一开始我采用了倾听字段改变的事件
@event.listens_for(Order.status,"set",retval=True)
def pay_success_reminder(target, value, oldvalue, initiator):
'''
已经充值成功,给用户发送提醒
:return:
'''
if value==oldvalue:return value
if value=="pay_success":#支付成功
try:
......
pass
except Exception as e:
pass
return value
这个事件在订单状态改变的时候就会触发,不幸的事,他触发在事务当中,当然,如果在其中另外线程去执行发送短信与邮件应该也无妨。但处于某些原因我希望在事务处理完成之后调用。
2.方式二
另外一种方式,监听对象的更新事件,并在更新事件处理中监听这个session commit事件。这样就能够完成commit之后对该对象的处理。
def pay_success_reminder2(order_no):
def func(session):
try:
......
pass
except Exception as e:
pass
return True
return func @event.listens_for(Order, 'after_insert',raw=True)
@event.listens_for(Order, 'after_update',raw=True)
def pay_success_reminder1(mapper, connection, target):#
'''
已经充值成功,给用户发送提醒
:return:
'''
if target.dict["status"]!=target.committed_state["status"] and target.dict["status"]=="pay_success":
event.listen(target.session,"after_commit",pay_success_reminder2(target.dict["order_no"]) )
如果需要将某些信息传递给session状态监听处理函数,则在需要使用函数包装的方式传递变量。
sqlalchemy中使用event设置条件触发短信与邮件通知的更多相关文章
- IOS中调用系统的电话、短信、邮件、浏览功能
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...
- iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话,iTunes,iBooks )
在网上找到了下在记录下来以后方便用 在程序中调用系统自带的应用,比如我进入程序的时候,希望直接调用safar来打开一个网页,下面是一个简单的使用:
- ios 设置亮度、声音;调用发短信、邮件、打电话
一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...
- zabbix实现电话、短信、邮件报警
该报警方式提前说明:(1)该方式可以实现zabbix免费电话报警以及微信.短信.邮件报警,但有数量限制.详见如下:如数量不能满足需要以及人员需要,可以考虑购买收费版.(2)毕竟是免费版,电话通知要省着 ...
- MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等
本文体验在MVC中使用ASP.NET Identity 2.0,体验与用户身份安全有关的功能: →install-package Microsoft.AspNet.Identity.Samples - ...
- HTML5的头部、拨号、短信、邮件(转)
HTML5[语法要点] 一.头部设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!--页面窗口自动调整到设备 ...
- iOS学习笔记28-系统服务(一)短信和邮件
一.系统应用 在开发某些应用时,我们可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,或者直接调用安装的第三方应用,这个要怎么实现呢? 这里统一使用UIApplication的一个对象方法 ...
- ios开发——实用技术篇Swift篇&地址薄、短信、邮件
//返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(tru ...
- Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
结果: 1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧. 2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教). 3.project -->opti ...
随机推荐
- 知方可补不足~Sqlserver中的几把锁和.net中的事务级别 回到目录
当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOCK(不加锁 ...
- spring4-5-事务管理
1.简单介绍 事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的 ...
- Ubuntu14.04下opencv卸载与重装
参考链接:http://askubuntu.com/questions/334158/installing-opencv http://stackoverflow.com/questions/1313 ...
- JAVA 上加密算法的实现用例,MessageDigest介绍
第 1 章基础知识 1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密. 通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快 ...
- 没有Reduce的MapReduce(一)
尝试了一个没有Reduce的MapReduce. [应用场景]: 从Hbase的A表中进行数据抽样,直接输出到B表中. 这种场景下,相当于只进行了一个数据检索,本来是用Hive就可以实现,但是考虑到业 ...
- [原创]SOUI GDI+渲染引擎下的字体特效,抛砖引玉
由于SOUI是一种双渲染引擎的DUI库,默认在SKIA渲染引擎下是支持特效字体的,具体请参考DEMO中的源码. 但是使用GDI+渲染时是没有这些特效的,着实比较苦恼,此代抛砖引玉,细节实现 请自己再去 ...
- Go 笔记和疑问?
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- 编写高质量代码改善C#程序的157个建议——建议83:小心Parallel中的陷阱
建议83:小心Parallel中的陷阱 Parallel的For和ForEach方法还支持一些相对复杂的应用.在这些应用中,它允许我们在每个任务启动时执行一些初始化操作,在每个任务结束后,又执行一些后 ...
- Hortonwork Ambari配置Hive集成Hbase的java开发maven配置
集群环境 ambari 2.7.3 hdp/hortonwork 2.6.0.3 maven <dependency> <groupId>org.apache.hive< ...
- 阿里云云主机添加swap分区与swap性能优化
1.swap的功能与相应内核参数 Linux 将物理内存分为内存段的部分被称作“页面”.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存.物理内存和交换空间 ...