00:00
好,那接下来我们应该去写一个生产者,而且是带这个拦截器的生产者,对吧?啊,带拦截器的生产者,那我们再来一个什么。这块呢,我们写一下,嗯,叫。不到不丢可以吧。Pro。Produce doc。为。好,那前面这一堆呢,我就直接干什么。拿一下对吧,啊拿一下。把这个给他拿过来啊,一直。到这个里边,那包里边给他拿。在这。这个东西应该大家比较熟了吧,啊直接复制一下,诶这块啊,我上午掉了一个get,它是不是有异常啊。还有一场。呃,多删了一个括号是么?多删了一括啊,那这块要用,那接下来的问题是我们应该要添加拦截器是不是。
01:00
啊,添加拦截器,同样的道理,这个拦截器呢,跟分区器一样,在这块就添加啊,那我们之前所提到的拦截器。序列化器分区器都是在哪啊?在这的只不过说你当中的分区器和拦截器是可选的。可选的组件你可以没有对吧,可以没有,但是序列化这个东西呢,它是必要的啊,它是必要的啊,也就当是三个你都写上也可以啊,三个都写上也可以啊,那这块呢,我们应该叫添加。拦截器,而且呢,我们还有多个是不是啊拦截器好,那同样道理,还是pop点铺的,然后铺的什么东西我不太清楚。对吧,啊,我们不太清楚,那我们同样的是不是应该进到这个,你们去找一下呀,Producer,那既然你是拦截器,那应该这个属性里面会带你对吧,会有这个词是不是an in the。
02:02
哎,其实我们看到就是这个吧。跟partition有区别了,Partition就叫part的点,Class这个地方他直接告诉你了,In the same.class对吧,人家官方定义的是很标准的,也就是说这块可以干什么多个,那问题来了,这多个怎么加呢?是我一个一个的加,哎,也就是在这我写两行代码,输了一次,然后CTRLD,然后再一个。如果说两个东西,那不就覆盖掉了是吧?啊,那就覆盖掉了,应该在一个时候把它生成出来啊,那看一下它这个地方说了是一个什么。一个list是谁的list,一个class的一个list啊,一个集合,那同样的道理,配置文件里面,那你想想看,这个集合里面应该放什么东西呢?
03:01
全类名啊,还是一样的,还是放全类名跟我们之前所学的一样的啊,那所以这块说了,那这天来系首先没一个list对吧?啊,既然放在全类名这个泛型应该是three嘛,啊,应该是three,因为你要放全类名嘛,好这个地方呢,叫int cep tos in塞斯给这个in特塞斯是不是I的它的一个three。然后看着D再来一份吧,把我们时间拦截器。往那一放对吧,还有一个什么奇数的拦截器,往这一放,这两个拦截器谁先掉谁后掉有区别吗。先加时间后计数对吧?啊,其实还好啊,从业务上如果说你的需求是先加A,先添加一个A。然后在的前面添加一个B。
04:02
那你这两个就不能干什么。写反了啊,就不能写反了这个意思好,接下来呢,我们put这个地方呢,是producer con点。叫in class对吧,等会然后把这个in给它放进去啊,放一个集合进去,这个意思,放一个集合,人家告诉你的一个list啊,一个集合,OK,那这块呢,经过我们一个拦截器,那我们同样的做一个测试,对吧?啊做个测试来。这块呢,我们去开启一个。消费者代码。卡不卡对吧,然后刚刚。好吧,幺八号2181刚尬,还是用这个first可以吧,啊用first走。好,这边呢,监控到了,然后呢,我们来开启一下这个数据。走一下。
05:03
成功十个错误零个对吧,啊错误连个来看一下这。加了什么时间戳,而且由于是批量提交的,你看这个时间戳大家很多都大家都一样吧,同一时刻提交过去了啊,同一时刻只不过说诶他是不是稍微早一点。对吧,启动过程当中可能就经过了一毫秒启动,你每次起的时候,可能这个都会有一点变化啊,就有可能两个,因为它是。一毫秒嘛,对吧,啊,他一毫秒这个这个一毫秒这个事情啊,是差距很大的啊,看提交的那个时间是不是经到你拦截器的这个时间啊,对吧?啊拦截器整个处理的速度也是非常快的啊,也是非常快的,那在同一时间处理完就差不多了,但是有时候是不是也会出现诶三五个一样的啊,有可能出现这种情况,这是有可能的啊好,那还有一个问题在这。之前我们在讲普通的一个生产者的时候,我们是不是把这个关掉了。这个关掉了。
06:02
他不会经过一毫秒对吧,不会经过一毫秒。也就是说没有触发他这个提交。没有触发他这个提交,那问题来了,这个东西没有提交,那拦截器肯定是不一定的吧。提交都没有提交对吧,啊,整个的没有提交过去。接下来如果说这样,我做一个这个事啊来嗯。在哪呢?在啊啊就这个这这个我先不先测一下,测一下吧,啊直接走一下。这个压根就没有数据过去对吧。不会打印吗?不会打印没有数据吗?数据都没发,那你那个说成功和失败没有意义是吧,啊根本走不了,好那这个问题呢,这样我做个这事。是不是我们之前做过测试,这个东西能接收到数据吗?可以吧,我们跑一把。多少条啊,二条这是第一次的,这是第二次的,对吧?啊第二次的,因为我们跑了三回,第一次是不是这个十条。
07:08
第二次我们测的过程当中没有加。点sleep也没有close没有提交成功,对吧,压根就没有啊,第二次呢,是一个空的,这个是刚才我们做的什么测试的数据。啊,测试数据好,这个数据明明都发过来了,但是你看。对吧,我发过去了。啊,那是因为close方法没人调。那你说是不是这个等于这个C方法没执行。一旦这个方法执行了,就会干什么,就一定会去打印的。对吧,哪怕打的是初始化的值呢。对吧,你初始化是零嘛,哪怕打的是两个零呢,对吧,总会打印的,也就是说这个方法没掉啊,也就是说我们之前所讲的close这一块。
08:03
他是谁掉的,是这个方法里面掉的。他去做收尾工作,他不光要把当前这个生产者里面缓存的东西给他清干净,还要需要把什么。其他的跟它相关的,假如说你分区器里边,假如说有有close,他要把分区器里边资源去关一关,拦截器里边有资源也要去关一关,能听懂啊,也就是说这个close方法做的这个事儿啊,Close方法做的这个事。啊,可方法哎,这块我们可以做这个事啊,来这个呢,让他多睡一会儿对吧。这五秒。然后接下来。嗯,这样。走一下。在这个之后吧。是不是这个之后还有什么代码呀。
09:02
就剩一个close了吧,啊,就剩一个close了啊,所以呢,那个close是这个里边,所以说这块又反面证明了这个东西一定要切记生长环境当中给他干什么。关一下啊,给它关一下,假如说你这个东西呃,输出完了,当然生产环境当中有很多时候是不需要关这个东西的啊,为什么呢这样,因为咱们当前是不是发送十条数据。但是生产环境当中,你这个生产者其实跟那个消费者一样。能听懂吗?一直要干什么?去拉取出去往那发啊往那发,那我们要关这个东西,假如说写的是一个外钥处,就是刚才那个地方,我们看到是一个外钥处,这个东西应该怎么关呢?假如说它它它出问题了。那怎么调这个close方法呀?注意。对它进行整个的一个。Try finally或者try catch finally能听懂啊,把这个关闭放在什么?
10:03
在那里啊,放放在那里,最后呢去关一下啊,最后就关一下,最后呢直行道关一下,因为正常情况下,其其实这个地方你不关。你不关其实也还好,因为深圳不像我们这儿吧,我们这儿自己写代码一定要干什么。关一下,要不然你不关第一你这不写睡眠。数据发都发不过去吧,啊,数据发都发不过去,或者说你不关,就算你睡了,数据发出去了,但是拦截器里边方法没人调。对吧,啊,没人掉,最后你想打印的东西还是出不来,所以呢,这个资源呢,该关的还是要关一下,是这个意思。
我来说两句