pika的阻塞式使用
[root@cloudplatform ELK]# cat startIncHouTai.py
import os # 杀掉内存中的进程
cmd='pgrep -f PutDataToKafkaInc.py | xargs kill -9 '
os.system(cmd) # 后台启动进程
cmd='nohup /usr/bin/python3 -u /usr/local/software/ELK/PutDataToKafkaInc.py >nohup.log 2>&1 &'
os.system(cmd) print('增量脚本启动成功')
增量.py
import os
import sys # pip install kafka-python
sys.path.append("/usr/local/software/ELK")
from Util.DateEncoder import *
from kafka import KafkaProducer
from Util.TextUtil import *
from Util.MySQLHelper import *
from Util.GetAreaPartionIdUtil import *
from Util.RabbitMqUtil import * # 区域码
AreaCode = mysql_AreaCode
MemoryDict = [] # 处理某张表中ID的数据变更
def doAction(sql):
while True:
try:
dt = db.query(sql)
if len(dt) > 0:
# 将字段大写转为小写
for row in dt:
new_dics = {}
for k, v in row.items():
new_dics[k.lower()] = v
jstr = json.dumps(new_dics, cls=DateEncoder)
logInfo('准备上报kafka,数据:'+jstr)
# 声明Kafka生产者
producer = KafkaProducer(bootstrap_servers=kafka_servers)
producer.send(topic=topicName, partition=partitionId, value=jstr.encode('utf-8'))
# 提交一下
producer.flush()
# 关闭kafkaProducer
producer.close()
logInfo('成功完成上报工作!')
break
except Exception as err:
logInfo('是不是没有连接上kafka??将休息3秒...'+str(err))
time.sleep(3) # 通过表名,找到对应的配置文件,读取这个表的PK是什么
def GetPk(table):
file = os.getcwd().replace('\\', '/') + '/Sql/' + table + '.json'
if os.path.exists(file):
jsonStr = ReadContent(file)
obj = json.loads(jsonStr)
# 主键
pk = obj['pk']
return pk
else:
logInfo('文件:' + file + "不存在,程序无法继续!")
sys.exit() # 通过表名和PK的真实值,拼接出SQL语句
def GetSql(table, id):
file = os.getcwd().replace('\\', '/') + '/Sql/' + table + '.json'
if os.path.exists(file):
jsonStr = ReadContent(file)
obj = json.loads(jsonStr)
# 主键
pk = obj['pk']
sql = str(obj['sql']).replace('>', '=')
sql = sql.replace("#area_code#", AreaCode).replace("order by t1.#pk#", "").replace("order by t2.#pk#",
"").replace(
"order by t3.#pk#", "").replace("order by t4.#pk#", "").replace("order by #pk#", "").replace("#pk#",
pk).replace(
"#id#", str(id)).replace("#limit#", "")
return sql
else:
logInfo('文件:' + file + "不存在,程序无法继续!")
sys.exit() # 解析rabbitmq中的json数据,知道当前变化的是哪个ID
def RabbitMqId(dataJson, pk):
if dataJson['event'] == 'insert':
return int(dataJson['columns'][pk]['value'])
elif dataJson['event'] == 'update':
return int(dataJson['before']['columns'][pk]['value'])
else:
logInfo('不是insert也不是update,这是不行的,程序无法执行!')
return 0 # 黄海定义的输出信息的办法,带当前时间
def logInfo(msg):
i = datetime.datetime.now()
print(" %s %s" % (i, msg)) if __name__ == '__main__':
logInfo('开始获取主机对应的PartitionId...')
partitionId = GetAreaPartitionId()
logInfo('成功获取主机的对应PartitionId=' + str(partitionId))
# 队列名
queue_Name = 'kafka_queue'
# 交换机名
switch_Name = 'elk_switch'
# 声明mysql数据库
db = MySQLHelper() # 统一的topic名称
topicName = 'dsideal_db' while True:
try:
# 准备连接到Rabbitmq
logInfo("正在连接到RabbitMQ...")
credentials = pika.PlainCredentials(RabbitMq_User, RabbitMq_Password)
connection = pika.BlockingConnection(pika.ConnectionParameters(RabbitMq_IP, int(RabbitMq_Port), '/', credentials))
channel = connection.channel()
logInfo("成功连接到RabbitMQ!正在阻塞等待消息..")
for method_frame, properties, body in channel.consume(queue_Name):
# 阻塞式获取消息
# 将body转为json
logInfo("发现RabbiMQ中的消息!正在处理...")
dataJson = json.loads(body.decode(encoding='utf-8').lower())
logInfo('dataJson='+str(dataJson)) tableName = str(dataJson['table'])
event = str(dataJson['event'])
# 1、获取pk是什么字段名称
pk = GetPk(tableName)
logInfo("成功获取PK="+pk) # 2、解析rabbitmq中的json数据,知道这个主键的对应真实值是什么?
id = RabbitMqId(dataJson, pk)
logInfo("成功获取ID="+str(id)) # 3、组装查询的sql
sql = GetSql(tableName, id)
# 4、处理这个表中ID的数据变更
logInfo("成功获取SQL="+sql)
# 成功处理
doAction(sql)
logInfo('成功处理' + tableName + '中' + event + "事件一条!id=" + str(id)) # 确认收到这条消息
channel.basic_ack(method_frame.delivery_tag)
logInfo("成功设置ACK标识!")
break
requeued_messages = channel.cancel()
connection.close()
except Exception as err:
logInfo("发生了异常:"+str(err)+",将休息10秒...")
time.sleep(10000)
pika的阻塞式使用的更多相关文章
- PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法
如今在电商行业里,秒杀抢购活动已经是商家常用促销手段.但是库存数量有限,而同时下单人数超过了库存量,就会导致商品超卖甚至库存变负数的问题. 又比如:抢购火车票.论坛抢楼.抽奖乃至爆红微博评论等也会引发 ...
- 并发式IO的解决方案:多路非阻塞式IO、多路复用、异步IO
在Linux应用编程中的并发式IO的三种解决方案是: (1) 多路非阻塞式IO (2) 多路复用 (3) 异步IO 以下代码将以操作鼠标和键盘为实例来演示. 1. 多路非阻塞式IO 多路非阻塞式IO访 ...
- Swing做的非阻塞式仿飞秋聊天程序
采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...
- 阻塞式和非阻塞式IO
有很多人把阻塞认为是同步,把非阻塞认为是异步:个人认为这样是不准确的,当然从思想上可以这样类比,但方式是完全不同的,下面说说在JAVA里面阻塞IO和非阻塞IO的区别 在JDK1.4中引入了一个NIO的 ...
- Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- Java IO(3)非阻塞式输入输出(NIO)
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...
- JAVA NIO学习三:NIO 的非阻塞式网络通信
紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...
- Java IO(2)阻塞式输入输出(BIO)
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- 【Java】同步阻塞式(BIO)TCP通信
TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...
随机推荐
- 添加dubbo.xsd的方法
整合dubbo-spring的时候,配置文件会报错 因为 阿里关闭在线的域名了.需要本地下载xsd文件 所以,需要下载本地引入. 解决方式: 在dubbo的开源项目上找到xsd文件: htt ...
- pyppeteer 报错-无法连接到浏览器
问题 程序报错: Failed to connect to browser port: http://127.0.0.1:57899/json/version 原因 虽然pyppeteer在首次启动时 ...
- Hbase记录-Hbase基础概念
HBase是什么? HBase是建立在Hadoop文件系统之上的分布式面向列的数据库.它是一个开源项目,是横向扩展的. HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数 ...
- 缓存穿透、雪崩、热点与Redis
(拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防 ...
- ASP.NET MVC中的Session设置
最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...
- Redis 主从 keepalived高可用 实现 VIP 自动漂移
Redis 多主写多从度 配置启动OK :直接配 keepalived 相关配置: redis 默认路径 :/usr/local/redis keepalived 默认路径 :/etc/keepal ...
- MySQL 之 数据库自动生成ID格式化编号(字符串格式化填充/拼接/时间)
# 用户账号:1-4位:入职年份:5-6位:入职月份:7-11位:员工入职顺序号 select concat( date_format(now(),'%Y'), date_format(now(),' ...
- luogu P1268 树的重量
一开始把这题想复杂了,,, 这里记\(di[i][j]\)表示\(i\)到\(j\)的距离 首先如果\(n=2\),答案显然为\(di[1][2]\) 如果\(n=3\) 懒得画图了盗图过来 那么3号 ...
- SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解
1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...
- POST 上传 JSON 数据
// // ViewController.m // 03-post上传json // // Created by jerry on 15/10/10. // Copyright (c) 2015年 j ...