zvvq技术分享网

publicvoidsendchatrequestorels

作者:zvvq博客网
导读开发者您好。在今天的文章中,我将分享如何花费我一个小时来查找和修复一行代码的故事。让我们开始吧。 该项目最初是在spring boot 2.6.4开发,目前运行在spring boot 3.2.3版本。我将版

开发者你好。在今天的文章中,我将分享怎样耗费我一个钟头来查找和恢复一行代码故事。让我们开始吧。 zvvq.cn

此项目最初要在spring boot 2.6.4开发,目前运行在spring boot 3.2.3版本。我将版本更新到spring boot 3.2.3,由于我遇到了一些难题,各种问题阻拦并延迟了即将推出的作用。我会在另一篇文章中叙述更新之行。请尽快关心以获得相关即将发布的文章的通知。 本文来自zvvq

难题我在一家新公司开始了我的se之行,并加入了一个有趣的项目。此项目包含多个调度程序,每个调度程序以不同的时间运作,比如每 10 秒、30 秒、30 分钟等。如果你有此类项目的经验,那么你已知道发现问题有多么艰难。

copyright zvvq

行吧,使我们直接进耗费我几小时调节的这行。 zvvq好,好zvvq

publicvoidsendchatrequest(longchatid){ 内容来自zvvq,别采集哟

chatservice.findchatbyname("demo-chat").orelse(save(newchat("demo-chat"))); zvvq好,好zvvq

//othercodesommited...

copyright zvvq

} zvvq.cn

你能发觉问题吗? 本文来自zvvq

不管闲聊存不存在,每次都会启用 save() 方式。这是因为 orelse() 方式急切地求值。另一方面,orelseget() 方法是延迟计算的,只有在optional为空时才会实行。

zvvq.cn

为了了解他们之间的差别,请于 ide 中执行下列编码并查看日志。 内容来自zvvq

最先,我们将回到空的optional,看看结论会是什么。 内容来自zvvq

publicclassorelseandorelsegetmethods{

本文来自zvvq

recordchat(stringname){ zvvq.cn

} 本文来自zvvq

classchatservice{

zvvq好,好zvvq

publicoptionalfindchatbyname(stringname){ copyright zvvq

returnoptional.empty(); zvvq

}

zvvq好,好zvvq

} copyright zvvq

privatefinalchatservicechatservice=newchatservice(); copyright zvvq

publicstaticvoidmain(string[]args){

内容来自zvvq,别采集哟

varmain=neworelseandorelsegetmethods(); 内容来自zvvq,别采集哟

main.testorelse(); 本文来自zvvq

system.out.println("");

内容来自samhan666

main.testorelseget();

zvvq

}

内容来自zvvq

publicvoidtestorelse() { zvvq好,好zvvq

system.out.println("testing orelse() method");

zvvq好,好zvvq

chatservice.findchatbyname("demo-chat") zvvq好,好zvvq

.orelse(save(newchat("demo-chat"))); 本文来自zvvq

}

copyright zvvq

publicvoidtestorelseget() { 本文来自zvvq

system.out.println("testing orelseget() method");

内容来自zvvq,别采集哟

chatservice.findchatbyname("demo-chat") 内容来自zvvq

.orelseget(()->save(newchat("demo-chat")));

copyright zvvq

} copyright zvvq

publicchatsave(chatchat){ zvvq.cn

system.out.println("saving"+chat); 本文来自zvvq

//savingchattodatabase

内容来自zvvq

returnchat;

内容来自samhan666

}

内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

以上代码片段输出具体如下: 内容来自zvvq

testing orelse() method 本文来自zvvq

savingchat[name=demo-chat]

copyright zvvq

本文来自zvvq

testing orelseget() method

内容来自zvvq

savingchat[name=demo-chat] 本文来自zvvq

如同你在上边看见的,在两个方法(orelse() 和 orelseget())里都执行了 save() 方式。 zvvq好,好zvvq

让我们看看假如optional 不以空会发生什么。 内容来自samhan

publicclassorelseandorelsegetmethods{ zvvq

recordchat(stringname){

内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

classchatservice{ zvvq.cn

publicoptionalfindchatbyname(stringname){

zvvq.cn

//searchinginsidedb

zvvq

varfoundedchat=newchat(name); 内容来自zvvq

returnoptional.of(foundedchat);

本文来自zvvq

}

zvvq.cn

}

内容来自samhan666

privatefinalchatservicechatservice=newchatservice(); zvvq.cn

publicstaticvoidmain(string[]args){ zvvq好,好zvvq

varmain=neworelseandorelsegetmethods();

内容来自samhan666

main.testorelse();

内容来自zvvq,别采集哟

system.out.println(""); 内容来自samhan666

main.testorelseget(); 本文来自zvvq

} zvvq.cn

publicvoidtestorelse() { 内容来自samhan666

system.out.println("testing orelse() method"); 本文来自zvvq

chatservice.findchatbyname("demo-chat")

zvvq

.orelse(save(newchat("demo-chat")));

本文来自zvvq

}

zvvq好,好zvvq

publicvoidtestorelseget() {

zvvq

system.out.println("testing orelseget() method"); 内容来自zvvq,别采集哟

chatservice.findchatbyname("demo-chat")

内容来自zvvq,别采集哟

.orelseget(()->save(newchat("demo-chat"))); zvvq

} 内容来自samhan666

publicchatsave(chatchat){

内容来自zvvq

system.out.println("saving"+chat); copyright zvvq

//savingchattodatabase

zvvq好,好zvvq

returnchat;

内容来自samhan666

} 内容来自samhan666

}

内容来自samhan666

上边的全部代码片段与以往同样,仅有第 11 行不同。返回的不是optional.empty(),而是optional.of(foundedchat)。 内容来自zvvq,别采集哟

来看看结果吧

本文来自zvvq

testing orelse() method copyright zvvq

savingchat[name=demo-chat]

内容来自samhan666

本文来自zvvq

testing orelseget() method

内容来自zvvq,别采集哟

如同你在导出中看见的,在实施 orelse() 方法时调用了 save() 方式,可是,这并没有发生在 orelseget() 方法上。

内容来自zvvq

为何要花这么多时间来测试和解决问题?我没有看到一些突发情况,但 20 分钟我意识到,数据库里的闲聊要求比预期的需多。当时是测试环境,当时我的队友已经服务器上工作。但他们告诉我她们那天没有碰服务器上的其他东西。

本文来自zvvq

调节对话开始了,有两件事让我很挣脱。 内容来自zvvq

调度程序太多。 内容来自zvvq,别采集哟

欠缺日志纪录,特别是产生变更的方式。 内容来自samhan666

针对这种情况,我将方式从 orelse() 更改为 orelseget()。该问题之后项目的改进第一个改善是把调度程序数量从 5 个降低到 1 个。我观察并发现这种调度程序几乎具有相同的目地,因而能将他们合并到一个调度程序操作中。此外,其中一篇已落伍并立即删除。

zvvq

第二个改善要在方式中添加了尽人皆知的日志句子,以便于调节过程。 内容来自samhan

该问题之后的经验教训当问题根源寻找时,我意识到我已看了这个类2次但第一次找不上。这是因为我很着急并试图妥善解决难题。但是,这花了我更多时间来找到问题所在。

本文来自zvvq

下次遇到这种问题时,大声读每一行或是喃喃自语,那样编码就会变得更清楚。当你开始将上述对策运用到你的工作里时,你会发现很多问题或写的不好代码。这将使您有优点寻找必须重构的区域。 内容来自samhan666

这是以上实例: 内容来自zvvq,别采集哟

-You:Okay,inthefirstlineofthemethod,itdonullchecks

内容来自zvvq

-You:ifitisnull,thenreturnimmediately,otherwise

本文来自zvvq

-You:sendthemethodparametertomethodfindByName() 内容来自samhan666

-You:andfindByName()returnsOptional. 内容来自samhan

你明白这个想法。当你做到之上时,别着急,否则不会有那么大的危害。多点耐心,慢慢来。 本文来自zvvq

文章告一段落,喜欢文章得话别忘记分享和评论哦

内容来自samhan666

如果你有任何疑问,能通过 linkedin 联系我。

copyright zvvq

最终在 github 上带来了编码。 zvvq.cn

以上就是一行代码花了我一个小时来修复的详细内容,大量请关注其他类似文章!

内容来自zvvq