四、自定义sink
1.自定义sink
package code.book.stream.customsinkandsource.jdbc.java;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class StudentSinkToMysql extends RichSinkFunction<Student> {
private Connection connection = null;
private PreparedStatement ps = null;
/**
* 一、open()方法中建立连接,这样不用每次invoke的时候都要建立连接和释放连接。
*/
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://qingcheng11:3306/flinktest";
String username = "root";
String password = "qingcheng";
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
String sql = "insert into Student(stuid,stuname,stuaddr,stusex)values(?,?,?,?);";
ps = connection.prepareStatement(sql);
}
/**
* 二、每个元素的插入都要调用一次invoke()方法,这里主要进行插入操作
*/
@Override
public void invoke(Student student) throws Exception {
try {
ps.setInt(1, student.getStuid());
ps.setString(2, student.getStuname());
ps.setString(3, student.getStuaddr());
ps.setString(4, student.getStusex());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void close() throws Exception {
super.close();
if (connection != null) {
connection.close();
}
if (ps != null) {
ps.close();
}
}
}
2.sink测试程序
package code.book.stream.customsinkandsource.jdbc.java;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class StudentSinkToMysqlTest {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Student> students = env.fromElements(
new Student(11, "zhangsan", "beijing biejing", "female"),
new Student(12, "lisi", "tainjing tianjin", "male ")
);
students.addSink(new StudentSinkToMysql());
env.execute();
}
}
3.sink测试效果
在mysql中能够查询到,flink写入的数据。