消息队列在VFP中的应用

2021-08-16 14:21:46 浏览数 (1)

业务场景

会员注册成功之后,发送成功的短信邮件,传统的做法就是在会员注册成功的程序上面做一个发送短信的代码,增加发送邮件的代码,

假设会员注册的执行需要1秒,发送短信1秒,发送邮件1秒,那么会员注册总共需3秒

为了增加更大的并发量,我们引入消息队列,会员注册成功之后,就将成功的消息写入消息队列,比如手机号等等. 然后分别做一个发送短信的和发送邮箱的

服务程序,这样就可以将程序的时间节省到 1 1秒.

有人说了,存到数据库也可以啊,当然可以,只是这个消息不需要长期存储,用完就清掉了,没必要做存到数据库啊.

应对秒杀的场景,秒杀是突然好几倍的流量进来,数据库就会承担不了,那么就可以用消息队列来存储秒杀数据,然后订单系统再按串行处理秒杀数据,保证

数据库不崩溃.限制抢购的数量,也可以用消息队列来做,1000商品=1000消息队列,之后的就可以不用查询数据库,直接返回无货.

消息队列的产品很多,这次我们来学习一下微软的产品MSMQ吧.

1

安装消息队列

2

消息队列是什么

消息队列就是信息的队伍,排先进先出顺序排序的

可以有多少队列,每个队列有多条消息

3 VFP创建一个消息队列

lcQueueName = "MyQueue1" &&消息队列的名字

oQueueInfo = CreateObject("msmq.msmqqueueinfo")

*--私有队列 工作组模式可用 .Private$

*--公有队列 .

oQueueInfo.Pathname = ".Private$" lcQueueName &&must be unique

oQueueInfo.Label = lcQueueName

oQueueInfo.Create &&消息队列不可以重复创建

可以打开计算机管理,查看到我们刚刚创建的消息队列

3

写入一条消息

*发送消息

lcQueueName = "MyQueue1" &&消息队列的名字

oQueueInfo = CreateObject("msmq.msmqqueueinfo")

oQueueInfo.Pathname = ".Private$" lcQueueName &&must be unique

oQueueInfo.Label = lcQueueName

* 以下第一个参数为,打开队列的访问(send、peek、receive)模式。

*!*MQ_RECEIVE_ACCESS 1

*!*MQ_SEND_ACCESS 2

*!*MQ_PEEK_ACCESS 32

*!*MQ_ADMIN_ACCESS 128

oSendQueue= oQueueInfo.Open(2, 0)

*创建消息

oMsg = create("msmq.msmqmessage")

oMsg.Label = "我是第一条消息"

oMsg.Body = "我是第一条内容"

oMsg.Send(oSendQueue)

4

读取消息

oMsg = Create("msmq.msmqmessage")

lcQueueName = "myQueue1"

oQueueInfo = Createobject("msmq.msmqqueueinfo")

oQueueInfo.Pathname = ".Private$" lcQueueName

&&接收模式

oSendQueue= oQueueInfo.Open(1, 0)

oMsg = oSendQueue.Receive(,,,100) &&得到消息

If Isnull(oMsg)

Return

Endif

Messagebox(oMsg.Body, 0, oMsg.Label)

5

删除队列

lcQueueName = "myQueue1"

oQueueInfo = create("msmq.msmqqueueinfo")

oQueueInfo.Pathname = ".Private$" lcQueueName

oQueueInfo.Delete

6

接收消息但不删除

oSendQueue.Peek(,,,100) &&接收消息但不删除

0 人点赞