Flink程序加载数据源(4)从RabbitMQ中加载数据源

(1)自定义数据源说明

与上文一样,要实现自定义和数据源必须实现Flink内置的数据源接口或者集成内置数据源抽象类

  • SourceFunction: 非并行数据源(并行度只能=1)

  • RichSourceFunction: 多功能非并行数据源(并行度只能=1)

  • ParallelSourceFunction: 并行数据源(并行度能够>=1)

  • RichParallelSourceFunction: 多功能并行数据源(并行度能够>=1)

(2)RabbitMQ中加载数据源

有时候,我们flink计算程序需要从RabbitMQ中加载数据源,然后进行数据计算处理

下边进行数据加载演示

(1)添加依赖

要从rabbitMq中加载数据,我们需要在rabbitMq原有依赖基础上添加一个rabbitMq连接器依赖

<!--rabbitMQ连接器-->
<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-rabbitmq_2.12</artifactId>
    <version>${flink.version}</version>
</dependency>

(2)自定义RabbitMQ数据源

我们自定义的RabbitMQ数据源类要继承上方依赖包提供的RMQSources

package com.leilei.source.rabbit;

import com.rabbitmq.client.AMQP;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.connectors.rabbitmq.RMQSource;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @author lei
 * @version 1.0
 * @desc
 * @date 2021-03-15 17:27
 */
public class FlinkRabbitMqSource extends RMQSource {

    public String exchangeName;

    /**
     *
     * @param rmqConnectionConfig rabbitMQ的连接器配置(ip 端口 账号 密码等)
     * @param queueName 监听的队列名
     * @param exchangeName 队列绑定的交换机名
     * 注:此设置后如果监听的队列不存在,其会自动创建,并与指定的交换机进行绑定
     */
    public FlinkRabbitMqSource(RMQConnectionConfig rmqConnectionConfig, String queueName,
                               String exchangeName) {
        super(rmqConnectionConfig, queueName, new SimpleStringSchema(StandardCharsets.UTF_8));
        this.exchangeName = exchangeName;
    }

    /**
     * 设置消息队列 队列绑定到交换机
     * @throws IOException
     */
    @Override
    protected void setupQueue() throws IOException {
        AMQP.Queue.DeclareOk result = channel.queueDeclare(queueName, true, false, false, null);
        channel.queueBind(result.getQueue(), exchangeName, "*");
    }
}

(3)RabbitMQ连接器配置

同上方代码注释,我们需要配置RabbitMQ的连接器信息 包括但不限于 RabbitMQ所在的IP 端口 账号 密码等…

RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
    .setHost("10.50.40.116")
    .setPort(5673)
    .setUserName("admin")
    .setPassword("admin")
    .setVirtualHost("/")
    .build();

(4)加载自定义RabbitMQ数据源

使用当前flink计算环境,加载自定义RabbitMQ数据源

我自定义的FlinkRabbitMqSource有三个参数 :RabbitMQ的连接器配置、队列名、交换机名

        DataStreamSource dataStreamSource = env.addSource(new FlinkRabbitMqSource(connectionConfig,
                "leilei",
                "paas-trans-enterprise-platform-data.fanout.location_test"));

(5)运行Flink程序

package com.leilei.source.rabbit;


import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.rabbitmq.common.RMQConnectionConfig;

/**
 * @author lei
 * @version 1.0
 * @desc
 * @date 2021-03-15 17:31
 */
public class FlinkSourceByRabbitMq {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        RMQConnectionConfig connectionConfig = new RMQConnectionConfig.Builder()
                .setHost("10.50.40.116")
                .setPort(5673)
                .setUserName("admin")
                .setPassword("admin")
                .setVirtualHost("/")
                .build();
        DataStreamSource dataStreamSource = env.addSource(new FlinkRabbitMqSource(connectionConfig,
                "leilei",
                "paas-trans-enterprise-platform-data.fanout.location_test"));
        dataStreamSource.print();
        env.execute();
    }
}

(6)测试

Flink程序启动后,查看RabbitMQ控制台,看到我自定义的队列leilei 与交换机paas-trans-enterprise-platform-data.fanout.location_test 进行了绑定

交换机

image-20210407220438317

队列

image-20210407220645043

模拟生产者发送消息到交换机

image-20210407220943234

Flink计算程序收到MQ队列leilei中的消息

image-20210407221041261

image-20210407221111458

结语

经测试,Flink程序可以拿到RabbitMQ中的数据源进行数据处理计算,Flink程序demo整合RabbitMQ 完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值