びっくり!Hutoolツールクラスで「バグ」を見つけました


前言
Hutoolは小さくて完全なJavaツールクラスライブラリで、それは私たちがすべての行のコードを簡略化することを助けて、繰り返し車輪を作ることを避けて、仕事の効率を高めて、Javaに関数式言語のような優雅さを持って、Java言語も
「甘い」.
最近、Hutoolツールクラスのメールで送信されたツールクラスを使用して、小さな問題が発生しました.この問題によって、Hutoolツールクラスの1つが見つかりました.
“bug” .
記事の主線:
1、Hutoolのメール送信ツールクラスを使用したときに発生した問題を紹介する.
2、問題の調査の過程について話します.
問題の説明
発生した問題を説明する前に、問題が発生した場合の項目を簡単に紹介します.
プロジェクトの状況:
このプロジェクトはウェブプロジェクトで、いくつかのフロントページ、例えばメール構成ページがあり、このページでメール送信のパラメータを構成し、送信者メールボックス、パスワード、受信者メールボックスなどのデータを構成し、データベーステーブルに格納します.
プログラム内では、メールを送信するたびに、データベースにメール構成パラメータを再読み込みし、新しい構成パラメータを使用してメールを送信します.
しかし、ここで問題が発生しました.最初にアラームメールを送信したとき、構成された受信者は1つで、その後、受信者のパラメータを2人に変更してからアラームメールを送信したとき、前に構成された受信者だけがメールを受信することができ、新しい構成の別の受信者はメールを受信しませんでした.どうして?
送信メールの疑似コード:
//              
MailConfigBean mailConfigBean = DaoUtil.getConfigBean();
//         
MailAccount account = new MailAccount();
account.setHost(mailConfigBean.getHost());
account.setPort(mailConfigBean.getPort());
account.setAuth(mailConfigBean.isIfAuth());
account.setFrom(mailConfigBean.getFrom());
account.setUser(mailConfigBean.getFrom());
account.setPass(mailConfigBean.getPassword());
//     
MailUtil.send(account, CollUtil.newArrayList("[email protected]"), "  ", "Hutool  ", false);

以上のコードは
Hutool公式サイトで直接持ってきて使っていますが、本来なら何の問題もないはずです.
チェックプロセス
上記のように、最初は確かに問題の原因がよく分からなかったが、ゆっくりと考えてから、次のように調べ始めた.
自作コードチェック:
この問題に直面して私はまず自分のコードに問題があるかどうか、自分がメールの構成パラメータを修正した後、プログラムが構成を再読み込みしなかったかどうかを疑問に思っていますが、debugを通じて自分のコードに問題がないことに気づきました.
メールツールクラスのソース:
そしてこのツールクラスのソースコードを見て問題点を発見しました.
このツールクラスには「isUseGlobalSession」(グローバルセッションを使用するかどうか)というパラメータがあり、ツールクラスコードの「send()」メール送信方法の「isUseGlobalSession=true」はデフォルトで使用されるため、変更されたメール構成を再読み込みしても使用される以前の構成パラメータになります.
ソース表示プロセス:
①、下記メールで送信されたsendをクリックする方法:
//     
MailUtil.send(account, CollUtil.newArrayList("[email protected]"), "  ", "Hutool  ", false);

②、sendメソッド内に入る:
public static void send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) {
        Mail.create(mailAccount).setTos((String[])tos.toArray(new String[tos.size()])).setTitle(subject).setContent(content).setHtml(isHtml).setFiles(files).send();
    }

③、mail.createts()をクリックし、createtsメソッド内に入る:
public static Mail create(MailAccount mailAccount) {
        return new Mail(mailAccount);
}

④、最後にMailの構造方法に入る:
public Mail(MailAccount mailAccount) {
    //     useGlobalSession   true,               
   this.useGlobalSession = true;
   mailAccount = null != mailAccount?mailAccount:GlobalMailAccount.INSTANCE.getAccount();
   this.mailAccount = mailAccount.defaultIfEmpty();
}

解決策
問題が見つかったら、問題の原因に基づいて解決策を実現する必要があります.この問題は、デフォルトのグローバルセッションが使用されているため、sendメソッドを書き換えるだけで、グローバルセッションを使用しないように設定すればよい.
具体的な手順:
①、「SendMailUtil」ツールクラスを新規作成し、Hutoolの「MailUtil」クラスを継承する.
②、「send()」メソッドを書き換え、sendメソッドではデフォルトでグローバルセッションは使用されません.
③、アラームメール送信時にこの書き換えsendメソッドを呼び出せばよい.
コード:
public class SendMailUtil extends MailUtil{
 
    /**
     *    send           
     *
     *  setUseGlobalSession(false);            false
     */
    public static void send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) {
        Mail.create(mailAccount).setTos((String[])tos.toArray(new String[tos.size()])).setTitle(subject).setContent(content).setHtml(isHtml).setUseGlobalSession(false).setFiles(files).send();
    }
 
}

end..本文は終わりました;本文を通じて、みんなに1つの提案をあげたいです:多くソースコードを読んで、とても役に立ちます.
❤あなたの学习の足迹を残しておくことを忘れないでください
すべての文章を読んでほめないのはすべて“ごろつきをします”で、へへへヾ(◍°∇°◍)ノ!冗談を言って、あなたの小さな手を動かして、いいねを押して終わりました.あなたは一人一人が力を出して(いいね+評論)もっと多くの学習者を参加させます!ありがとうございます! ̄ω ̄=;最后にVXは【木子雷】のある众号を検索して、いっしょに勉强します!