Canal安装部署

1.下载安装包解压

2.mysql配置

2.1 启动binlog功能

  • 查看是否启动
show variables like 'binlog_format%'
  • 修改my.cnf配置
log-bin=mysql-bin #添加这一行就 ok   
binlog-format=ROW #选择 row 模式    
server_id=1       #配置 mysql replaction 需要定义,不能和canal的slaveId重复

2.2 赋权限

CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';    
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;    
FLUSH PRIVILEGES;

3.修改配置

  • conf/example/instance.properties
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=
  • bin/startup.cmd
set CANAL_OPTS= -DappName=otter-canal -Dlogback.configurationFile="D:\Code\Canal\conf\logback.xml" -Dcanal.conf="%canal_conf%"

4.启动

启动startup.cmd

5.使用

  • pom.xml
<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>
  • application.yml
canal:
  server: 127.0.0.1:11111
  destination: example
logging:
  level:
    root: info
    top:
      javatool:
        canal:
          client:
            client:
              AbstractCanalClient: error
  • 实体类
@Setter
@Getter
@Table(name = "t_order_info")
public class OrderInfo implements Serializable {
    public static final Integer STATUS_ARREARAGE = 0;//未付款
    public static final Integer STATUS_ACCOUNT_PAID = 1;//已付款
    public static final Integer STATUS_CANCEL = 2;//手动取消订单
    public static final Integer STATUS_TIMEOUT = 3;//超时取消订单
    public static final Integer STATUS_REFUND = 4;//已退款
    public static final int PAYTYPE_ONLINE = 0;//在线支付
    public static final int PAYTYPE_INTERGRAL = 1;//积分支付
    @Column(name = "order_no")
    private String orderNo;//订单编号
    @Column(name = "user_id")
    private Long userId;//用户ID
    @Column(name = "product_id")
    private Long productId;//商品ID
    @Column(name = "delivery_addr_id")
    private Long deliveryAddrId;//收货地址
    @Column(name = "product_name")
    private String productName;//商品名称
    @Column(name = "product_img")
    private String productImg;//商品图片
    @Column(name = "product_count")
    private Integer productCount;//商品总数
    @Column(name = "product_price")
    private BigDecimal productPrice;//商品原价
    @Column(name = "seckill_price")
    private BigDecimal seckillPrice;//秒杀价格
    @Column(name = "intergral")
    private Long intergral;//消耗积分
    @Column(name = "status")
    private Integer status = STATUS_ARREARAGE;//订单状态
    @Column(name = "create_date")
    private Date createDate;//订单创建时间
    @Column(name = "pay_date")
    private Date payDate;//订单支付时间
    @Column(name = "pay_type")
    private Integer payType;//支付方式 1-在线支付 2-积分支付
    @Column(name = "seckill_date")
    private Date seckillDate;//秒杀的日期
    @Column(name = "seckill_time")
    private Integer seckillTime;// 秒杀场次
    @Column(name = "seckill_id")
    private Long seckillId;//秒杀商品ID

    @Override
    public String toString() {
        return "OrderInfo{" +
                "orderNo='" + orderNo + '\'' +
                ", userId=" + userId +
                ", productId=" + productId +
                ", deliveryAddrId=" + deliveryAddrId +
                ", productName='" + productName + '\'' +
                ", productImg='" + productImg + '\'' +
                ", productCount=" + productCount +
                ", productPrice=" + productPrice +
                ", seckillPrice=" + seckillPrice +
                ", intergral=" + intergral +
                ", status=" + status +
                ", createDate=" + createDate +
                ", payDate=" + payDate +
                ", payType=" + payType +
                ", seckillDate=" + seckillDate +
                ", seckillTime=" + seckillTime +
                ", seckillId=" + seckillId +
                '}';
    }
}
  • 监听类
@Slf4j
@Component
@CanalTable(value = "t_order_info")
public class OrderaInfoHandler implements EntryHandler<OrderInfo> {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public void insert(OrderInfo orderInfo) {
        log.info("当有数据插入的时候会触发这个方法");
        System.out.println(orderInfo);
    }

    @Override
    public void update(OrderInfo before, OrderInfo after) {
        log.info("当有数据更新的时候会触发这个方法");
        System.out.println(before);
        System.out.println(after);
    }

    @Override
    public void delete(OrderInfo orderInfo) {
        log.info("当有数据删除的时候会触发这个方法");
    }
}
posted @ 2023-07-18 20:25  lwx_R  阅读(117)  评论(0编辑  收藏  举报