从kafka读取数据并入库(mysql)

层级结构

在这里插入图片描述

主类

@SpringBootApplication
@MapperScan("这里填充该项目mapper的相对路径")  //用来扫描mapper包下的所有mapper
@Slf4j
public class GzBreakDownApplication {

    public static void main(String[] args) {
        SpringApplication.run(GzBreakDownApplication.class, args);
        log.info("程序启动,开始监听kafka消息");
    }

}

配置类(config)

@SpringBootConfiguration
public class KafkaConfig {


    @Autowired
    private KafkaProperties kafkaProperties;
    @Value("${spring.kafka.topics}")
    private String[] topics;
    @Value("${spring.kafka.concurrency}")
    private int concurrency;


    @Autowired
    private MyKafkaMessageListener myListener;

    // 多线程接收多主题多分区,每个主题每个分区一个线程,大大提升收取效率
    @Bean
    public ConcurrentMessageListenerContainer concurrentMessageListenerContainer() {
        ContainerProperties containerProps = new ContainerProperties(topics);
        containerProps.setMessageListener(myListener);

        Map<String, Object> map = kafkaProperties.buildConsumerProperties();
        map.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, RoundRobinAssignor.class.getName());

        DefaultKafkaConsumerFactory<Integer, String> dkConsumerFactory = new DefaultKafkaConsumerFactory<>(map);
        ConcurrentMessageListenerContainer concurrentMessageListenerContainer = new ConcurrentMessageListenerContainer(dkConsumerFactory, containerProps);

        concurrentMessageListenerContainer.setConcurrency(concurrency); // 允许的最大现场数
//        int concurrency = concurrentMessageListenerContainer.getConcurrency();
        return concurrentMessageListenerContainer;
    }
}

监听类(liston)

@Component
@Slf4j
public class MyKafkaMessageListener implements MessageListener {

    // 多线程接收消息 并处理
    @Override
    public void onMessage(Object data) {
        ConsumerRecord consumerRecord= (ConsumerRecord) data;
        StringBuffer stringBuffer=new StringBuffer();
        Object value = consumerRecord.value();
        stringBuffer.append(value);
        String s = stringBuffer.toString();
        //开始处理消息
        ...
       
    }
}

mapper类(mapper)

@Repository
public interface xxxMapper extends BaseMapper<xxxVO> {
}

service

public interface xxxService extends IService<xxxVO> {

    /**
     * 更新并入库
     * @param msg
     */
    void parseMsg(String msg);
}

service的实现类

@Service
@Slf4j
public class xxxServiceImpl extends ServiceImpl<xxxMapper, xxxVO> implements xxxService {
    @Override
    public synchronized void parseMsg(String msg) {
        log.info("数据:"+msg);

        xxxVO xxVO  = JSON.parseObject(msg, xxxVO.class);

        //查找 唯一的id是否已经存入数据库
        QueryWrapper<xxxVO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",xxVO.get.Id());
        xxxVO one = this.getOne(queryWrapper);
        if(one!=null){//存在 ,判断更新时间是否大于数据库存入的更新时间

            //结果是 -1, 负数:表示 time1 小于 time2 如果是正数,则表示大于后者 如果是0:那就表示相等
            if(one.getUpdateTime().compareTo(xxVO.getUpdateTime())<=0){
                log.info("更新时间:"+xxVO.getUpdateTime()+" ,编号:"+xxVO.getId());
                UpdateWrapper<xxxVO> updateWrapper = new UpdateWrapper<>();
                updateWrapper.like("bill_id",xxxVO.getId());
                this.update(xxVO,updateWrapper);
            }
        }else{ //不存在 直接入库
            log.info("数据开始入库");
            this.save(xxVO);
        }
        log.info("入库完成");
    }
}

实体类(vo)

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@TableName(value = "数据库表名")
public class xxxVO {

    @TableField(value = "id")  //映射数据库表字段名
    private String id ;

    @TableField(value = "update_time")
    private String updateTime ;

}

application.properties

#------mysql连接信息------
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=用户名
spring.datasource.password=密码

#-----------mybatis---------
mybatis-plus.configuration.map-underscore-to-camel-case=false

#------Kafka配置信息-------
# kafka集群 三个自己配置的集群xxx
spring.kafka.bootstrap-servers=xxx,xxx,xxx

spring.kafka.consumer.group-id=groupId2

spring.kafka.consumer.auto-offset-reset=earliest

spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer

spring.kafka.consumer.enable-auto-commit=true

spring.kafka.consumer.auto-commit-interval=1000

spring.kafka.topics=自定义消费主题

# max thread size
spring.kafka.concurrency=9


logging.file.name=自定义日志位置
logging.file.max-size=300MB

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink是一个分布式流处理框架,能够处理和分析实时数据流。Kafka是一个分布式流式数据处理平台,能够实时地收集、存储和处理大规模数据流。 在Flink中读取Kafka数据并将其写入MySQL数据库需要以下步骤: 1. 配置Kafka Consumer:通过配置Kafka Consumer相关的属性,如bootstrap.servers(Kafka的地址)、group.id(消费者组标识)、topic(要读取的主题名称)等。 2. 创建Flink Execution Environment:通过创建Flink执行环境,可以定义Flink作业的运行模式和相关配置。 3. 创建Kafka Data Source:使用Flink的Kafka Consumer API创建一个Kafka数据源,通过指定Kafka Consumer的配置和要读取的主题,可以从Kafka中获取数据。 4. 定义数据转换逻辑:根据需要,可以使用Flink提供的转换算子对Kafka数据进行处理,如map、filter、reduce等。 5. 创建MySQL Sink:通过配置MySQL数据库的连接信息,如URL、用户名、密码等,创建一个MySQL数据池。 6. 将数据写入MySQL:通过使用Flink的MySQL Sink API,将经过转换后的数据写入MySQL数据库。可以指定要写入的表名、字段映射关系等。 7. 设置并执行作业:将Kafka数据源和MySQL Sink绑定在一起,并设置作业的并行度,然后执行Flink作业。 通过以上步骤,我们可以将Kafka中的数据读取出来,并经过转换后写入MySQL数据库,实现了从KafkaMySQL数据传输。 需要注意的是,在配置Kafka Consumer和MySQL数据库时,要确保其正确性和可用性,以确保数据的正确读取和写入。同时,在处理大规模数据流时,还需要考虑分布式部署、容错性和高可用性等方面的问题,以保证系统的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值