欢迎来到【源码天空视频调色】【rip路由协议源码】【车到加油源码】booking源码-皮皮网网站!!!

皮皮网

【源码天空视频调色】【rip路由协议源码】【车到加油源码】booking源码-皮皮网 扫描左侧二维码访问本站手机端

【源码天空视频调色】【rip路由协议源码】【车到加油源码】booking源码

2024-12-22 22:17:21 来源:{typename type="name"/} 分类:{typename type="name"/}

1.说下你可能没用过的EventBus
2.用C语言开发简单的应用系统程序,源代码不得少于150行
3.「译」Spring 事务管理:@Transactional 深度解析|by MarcoBehler.md
4.什么是KNOX
5.我的电脑为什么网页显示不全?

booking源码

说下你可能没用过的EventBus

       最近在Code Review过程中,我发现了一个业务场景:业务处理完成后,需要通知审核人员,通知方式包括短信和邮件。代码如下:

       这个方法对吗?

       针对这种常见的源码天空视频调色业务场景,我们首先会考虑同步或异步发送的问题。

       如果选择同步,会对接口的响应时间产生影响,并且与业务逻辑紧密耦合,这显然不是好的做法。

       一般情况下,我们会选择异步方式,使用消息队列(MQ)进行消息的发送和消费,或者使用线程池来处理,这样不会影响主业务逻辑,rip路由协议源码可以提高性能,并且实现了解耦。

       此外,我们还需要考虑数据一致性的问题,邮件是否一定要发送成功?

       大多数情况下,我们并不要求邮件必须%发送成功,失败了就失败了,只要监控告警的失败率不超过阈值即可。同时,消息服务一旦收到请求,应该自行保证消息的投递。

       因此,总的来说,使用MQ发送消息并自行处理,或者使用线程池进行异步处理,车到加油源码最后自行处理补偿逻辑,就能解决这类问题。

       那么,今天要介绍的是这两种解决方案之外的处理方式。对于这种场景,我们可以使用EventBus来解决。

       EventBus是事件总线的意思,它是Google Guava库的一个工具,基于观察者模式,可以在进程内实现代码的解耦。

       以上面的例子来说,引入MQ可能会有些过于复杂,其实使用EventBus也能达到相同的效果。与MQ相比,EventBus只能提供进程内的简单网页的源码消息事件传递,但对于我们的业务场景来说,这已经足够了。

       接下来,我们来看一下EventBus的使用方法。首先,创建一个EventBus实例。

       第二步,创建一个事件消息订阅者,处理方式非常简单,只需在希望处理事件的方法上添加@Subscribe注解即可。

       形参只能有一个,如果定义0个或多个,运行时将会报错。

       第三步,注册事件。flask框架源码详解

       第四步,发送事件。

       这就是EventBus使用的最简单例子。下面我们看看如何结合开头的例子进行处理。

       比如上面提到的案例,比如注册和用户下单的场景,都需要发送消息和邮件给用户。

       EventBus并不强制要求我们使用单例模式,因为其创建和销毁成本较低,所以更多是根据我们的业务场景和上下文来选择。

       在业务逻辑处理完成后,分别注册了邮件和短信两个事件订阅者。

       最后,我们发送事件,用户注册时发送一个用户ID,下单成功时发送一个订单ID。

       然后写一个测试类进行测试,分别创建两个service,然后分别调用方法。

       执行测试类,我们可以看到输出,分别执行了事件订阅的方法。

       使用起来你会发现非常简单,对于希望轻量级简单地实现解耦,使用EventBus非常合适。

       注意,例子中的参数都是Long类型。如果事件的参数是其他类型,那么消息是无法接收到的。比如,如果我们将下单中发送的订单ID改为String类型,会发现没有消费。因为我们没有定义一个参数类型为String的方法。

       去EmailMsgHandler和SmsMsgHandler都新增一个接收String类型的订阅方法,这样就可以接收到了。

       除此之外,我们还可以定义一个DeadEvent来处理这种情况,它相当于是一个默认的处理方式。当没有匹配的事件类型参数时,就会默认发送一个DeadEvent事件。

       定义一个默认处理器。

       给BookingService新增一个pay()支付方法,下单完成后去支付,注册我们的默认事件。

       执行测试bookingService.pay(),看到输出结果:

       OK,简单的介绍就到这里。到目前为止,我们所说的都是同步调用,这并不符合我们的要求。我们当然希望使用异步处理更好。

       那就看看源码它是如何实现的。

       identifier是一个名字,标记,默认是default。

       executor是执行器,默认创建一个MoreExecutors.directExecutor(),事件订阅者根据你提供的executor来决定如何执行事件订阅的处理方式。

       exceptionHandler是异常处理器,默认创建的就是打点日志。

       subscribers是我们的消费者,订阅者。

       dispatcher用来做事件分发。

       默认创建的executor是一个MoreExecutors.directExecutor(),看到command.run()你就会发现这其实是同步执行。

       同步执行并不太好。我们希望不仅解耦,还要异步执行。EventBus提供了AsyncEventBus,我们可以自己传入executor。

       上面的代码我们改成异步的,这样不就好起来了嘛。实际上,我们可以结合自己的线程池来处理。

       OK,这个说清楚了。我们可以顺便再看看事件分发的处理。看到DeadEvent了吗?没有当前事件的订阅者,就会发送一个DeadEvent事件,bingo!

       OK,这个使用和源码都比较简单,有兴趣的同学可以自己去看看,花不了多少功夫。

       总的来说,EventBus提供了一个更优雅的代码解耦方式,你在实际工作中的业务中肯定能用得上它!

用C语言开发简单的应用系统程序,源代码不得少于行

       火车站售票查询系统:

       #include <conio.h>

       #include <stdio.h>

       #include <stdlib.h>

       #include <string.h>

       int shoudsave=0 ;

       int count1=0,count2=0,mark=0,mark1=0 ;

       /*定义存储火车信息的结构体*/

       struct train

       {

        char num[];/*列车号*/

        char city[];/*目的城市*/

        char takeoffTime[];/*发车时间*/

        char receiveTime[];/*到达时间*/

        int price;/*票价*/

        int bookNum ;/*票数*/

       };

       /*订票人的信息*/

       struct man

       {

        char num[];/*ID*/

        char name[];/*姓名*/

        int bookNum ;/*需求的票数*/

       };

       /*定义火车信息链表的结点结构*/

       typedef struct node

       {

        struct train data ;

        struct node * next ;

       }Node,*Link ;

       /*定义订票人链表的结点结构*/

       typedef struct people

       {

        struct man data ;

        struct people*next ;

       }bookMan,*bookManLink ;

       /* 初始界面*/

       void printInterface()

       {

        puts("