Flink 系例 之 Connectors 连接 RabbitMq

通过使用 Flink DataStream Connectors 数据流连接器连接到 RabbitMq 消息队列中间件,并提供数据流输入与输出操作;

示例环境

java.version: 1.8.x
flink.version: 1.11.1
rabbitMq:3.5.7

示例数据源 (项目码云下载)

Flink 系例 之 搭建开发环境与数据

示例模块 (pom.xml)

Flink 系例 之 DataStream Connectors 与 示例模块

数据流输入

DataStreamSource.java

package com.flink.examples.rabbitmq;

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.rabbitmq.RMQSource;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;

/**
 * @Description 从MQ中获取数据并输出到DataStream流中
 */publicclassDataStreamSource{

    /**
     * 官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.11/zh/dev/connectors/rabbitmq.html
     */publicstatic void main(String[] args) throwsException {
        finalStreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
                .setHost("127.0.0.1")
                .setPort(5672)
                .setUserName("admin")
                .setPassword("admin")
                .setVirtualHost("datastream")
                .build();

        finalDataStream<String> stream = env
                .addSource(new RMQSource<String>( connectionConfig, "test", true, new SimpleStringSchema()))
                .setParallelism(1);

        stream.print();
        env.execute("flink rabbitMq source");
    }
}

数据流输出

DataStreamSink.java

package com.flink.examples.rabbitmq;

import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.rabbitmq.RMQSink;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;

/**
 * @Description 将DataStream流中的数据输出到rabbitMq队列中
 */publicclassDataStreamSink{

    /**
     * 官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.11/zh/dev/connectors/rabbitmq.html
     */publicstaticvoidmain(String[] args)throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
                .setHost("127.0.0.1")
                .setPort(5672)
                .setUserName("admin")
                .setPassword("admin")
                .setVirtualHost("datastream")
                .build();

        String [] words = new String[]{"props","student","build","name","execute"};
        final DataStream<String> stream = env.fromElements(words);
        stream.addSink(new RMQSink<String>(connectionConfig,"test",new SimpleStringSchema()));
        env.execute("flink rabbitMq sink");
    }
}

数据展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个Flink SQL WebSocket连接器,需要遵循以下步骤: 1. 创建一个WebSocket连接器类,继承Flink SQL的TableSource接口,用于从WebSocket中读取数据。 ``` public class WebSocketTableSource implements StreamTableSource<Row> { private final String url; private final String[] fieldNames; private final TypeInformation<?>[] fieldTypes; public WebSocketTableSource(String url, String[] fieldNames, TypeInformation<?>[] fieldTypes) { this.url = url; this.fieldNames = fieldNames; this.fieldTypes = fieldTypes; } @Override public DataStream<Row> getDataStream(StreamExecutionEnvironment env) { // 创建WebSocket连接 WebSocketClient client = new WebSocketClient(); final List<Row> rows = new ArrayList<>(); client.connect(new WebSocketAdapter() { @Override public void onTextMessage(WebSocket websocket, String message) throws Exception { // 从WebSocket中读取数据 ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(message); Object[] values = new Object[fieldTypes.length]; for (int i = 0; i < fieldTypes.length; i++) { values[i] = objectMapper.convertValue(jsonNode.get(fieldNames[i]), fieldTypes[i].getTypeClass()); } rows.add(Row.of(values)); } }, new URI(url)); // 将数据转换为数据流 TypeInformation<Row> rowType = Types.ROW_NAMED(fieldNames, fieldTypes); return env.fromCollection(rows, rowType); } @Override public TableSchema getTableSchema() { return new TableSchema(fieldNames, fieldTypes); } @Override public String explainSource() { return "WebSocket(" + url + ")"; } } ``` 2. 在Flink SQL中使用WebSocket连接器,例如: ``` CREATE TABLE websocket_table ( field1 STRING, field2 INT, field3 BOOLEAN ) WITH ( 'connector' = 'websocket', 'url' = 'ws://localhost:8080', 'format' = 'json' ); SELECT * FROM websocket_table; ``` 这将创建一个WebSocket连接器,并将从WebSocket中读取的数据作为Flink SQL的表。需要注意的是,WebSocket连接器需要异步处理事件,因此需要使用非阻塞式的WebSocket客户端库,例如Jetty WebSocket客户端库。同时,需要指定数据的格式,例如JSON格式,以便正确解析数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值