import com.flinkRisk.config.FlinkConfig;
import com.flinkRisk.model.VehicleGroup;
import com.flinkRisk.rule.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* 自定义Mysql Source,每隔 secondInterval 秒从Mysql中获取一次配置
*/
@Slf4j
public class MysqlRuleSource extends RichSourceFunction<BaseRule> {
private String user;
private String passwd;
private String url;
private volatile boolean isRunning = true;
private Connection connection;
private ParameterTool parameterTool;
/**
* 开始时, 在open()方法中建立连接
*
* @param parameters
* @throws Exception
*/
@Override
public void open(Configuration parameters) throws Exception {
parameterTool = (ParameterTool) getRuntimeContext().getExecutionConfig().getGlobalJobParameters();
url = parameterTool.getRequired("mysql.url");
user = parameterTool.getRequired("mysql.user");
passwd = parameterTool.getRequired("mysql.password");
connection = getConnection();
super.open(parameters);
}
/**
* 执行完,调用close()方法关系连接,释放资源
*
* @throws Exception
*/
@Override
public void close() throws Exception {
super.close();
//关闭连接和释放资源
if (connection != null) {
connection.close();
}
super.close();
}
/**
* 调用run()方法定时获取报警规则,报警配置等信息
*
* @param ctx
*/
@Override
public void run(SourceContext<BaseRule> ctx) {
try {
while (isRunning) {
//定时获取报警规则
log.info("每隔{}秒定时获取报警规则信息", 600);
UpdateAllRuleOpt startUpdate=new UpdateAllRuleOpt();
startUpdate.setRuleTheme(555);
ctx.collect(startUpdate);
//更新普通规则
FlinkConfig.updateGeneralRule(connection,ctx,null,null);
//更新线路和区域规则
FlinkConfig.updatePathAndAreaRule(connection,ctx,null,null);
//更新道路规则
FlinkConfig.updateRoadRule(connection,ctx,null,null);
// 粤标规则
FlinkConfig.updateGeneralRuleYb(connection, ctx, null, null);
UpdateAllRuleOpt finishUpdate=new UpdateAllRuleOpt();
finishUpdate.setRuleTheme(666);
// 更新第三方超速报警规则
FlinkConfig.initThirdPartyRule(false,parameterTool,null,new ThirdPartyOverSpeedRule(),null,null ,null, null, ctx);
// 更新车组缓存
FlinkConfig.initGroupCache(false,parameterTool,ctx);
VehicleGroup updateGroup = new VehicleGroup();
updateGroup.setRuleTheme(888);
updateGroup.setUpdateFlag(1);
ctx.collect(finishUpdate);
//每隔多少秒执行一次查询
Thread.sleep(600 * 1000);
}
}catch{
log.error("从Mysql获取配置异常...", ex);
}
}
/**
* 取消时,会调用此方法
*/
@Override
public void cancel() {
isRunning = false;
}
private Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
//注意,替换成自己本地的 mysql 数据库地址和用户名、密码
con = DriverManager.getConnection(url, user, passwd);
} catch (Exception e) {
log.error("-----------mysql get connection has exception , msg = {}", e.getMessage());
}
return con;
}
}
获取mysql规则流
最新推荐文章于 2024-07-18 20:04:15 发布