どのように計算するために使用される方法を実行することをもつれないでください、この事はあなたを助けることができます

序文

あなたはこのような要望をお持ちの場合:

特定のメソッドを使用するときに自分の春のプロジェクトを計算したいの実行、および各出力が自動的に実行されます

さて、このフレームワークは、あなたのために非常に適しており、そして今、このフレームワークのタイミングは次のような利点があります。

  • 有効にするには、ノートのラインを使用するのは簡単
  • サポート高度にカスタマイズ出力フォーマット
  • 非侵襲的な方法
  • 選択の自由は、コンソールに出力を記録したり、

実際には、これは完全にオープンソースプロジェクトが取り組む、私自身の小さなフレームワークであり、GitHubの-mayoi7 /タイマ、ブランチが現在開発中であり1.x、最新バージョンです1.2.0-RELEASE

ユースケース

依存性の導入

まず、簡単なWebプロジェクトを作成します

そして、pom.xml導入はを必要としている私たちのプロジェクトに依存しています:

    <properties>
        <java.version>1.8</java.version>
        <timer.version>1.2.0-RELEASE</timer.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 计时器的依赖 -->
        <dependency>
            <groupId>com.github.mayoi7</groupId>
            <artifactId>timer</artifactId>
            <version>${timer.version}</version>
        </dependency>
    </dependencies>
复制代码

基本的な構造を作成します

次に、その後、新しいプロファイルを作成しますapplication.ymlが、ここではに何かを書き込むことはできません

その後、我々はメソッドを追加する新しいコントローラーを作成します。

import com.github.mayoi7.timer.anno.Timer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping("hi")
    @Timer
    public void hello() {
        try {
            Thread.sleep(826);
        } catch (Exception ignore) {}

        System.out.println("Hello World...");
    }
}

复制代码

ここでは、我々が取る必要があることに注意しなければならないcom.github.mayoi7でスキャンし、このパッケージのクラスを、その次の設定オプションが用意されています。

@SpringBootApplication
// 下面两种配置任选一(com.example.demo是当前项目的源码包根目录)
// @ComponentScan(basePackages = "com.*")
@ComponentScan(basePackages = {"com.example.demo.*", "com.github.mayoi7.*"})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

复制代码

注釈を追加するタイマーを使って

さて、その後、上のメインイベントに、このカウント方法はどのようにしますか?私たちは、直接注釈が十分にある依存関係を導入しているので:

import com.github.mayoi7.timer.anno.Timer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @RequestMapping("hi")
    @Timer
    public void hello() {
        try {
            Thread.sleep(826);
        } catch (Exception ignore) {}

        System.out.println("Hello World...");
    }
}

复制代码

テスト

私たちは、サーバー、アクセスを開始しlocalhost:8080/hi、結果をプリントアウトしますコンソールを見つけます:

Hello World...

[(date=2019-06-08 22:22:31, name=825608c3, duration=830 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]
复制代码

私たちは(あまりにも多くのカードのクラッシュを開設される前に、スラグのコンピュータ比較、)1000件のスレッド1000サイクルを開いたと同時に、ここでJMeterのテストの同時実行時で表され、短い出力の傍受は、[1] は、

[(date=2019-06-08 22:36:08, name=0753f926, duration=826 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]

[(date=2019-06-08 22:36:08, name=a0a242cd, duration=826 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]
Hello World...

[(date=2019-06-08 22:36:08, name=96b67174, duration=827 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]
Hello World...
Hello World...

[(date=2019-06-08 22:36:08, name=26676684, duration=827 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]

[(date=2019-06-08 22:36:08, name=fc283e48, duration=827 ms, classInfo=com.example.demo.controller.DemoController, methodInfo=hello)]
复制代码

結果の出力で見つけることができます正確でした

チュートリアル

出力属性の意味

現在利用可能な5つの出力属性、すなわち、それらだけで出力があります。

  • DATE:メソッド完了し、実行時間、結果が出力時間であります
  • 名前:タイマーの名前が自分の上に設けられていてもよい、設定されていない使用する場合はランダムな文字列8
  • DURATION:メソッドがで実行され
  • CLASSINFO情報クラスのメソッド場所:
  • METHODINFO:メソッド情報

これらのプロパティのほとんどは、我々は次を説明しますカスタマイズする方法にとして、限定的に変更することができます

構成アイテム

CIは、構成ファイル構成に分割することができ、かつ構成がの面で離れて私たちを注釈します

プロファイル

設定ファイルがしますtimer、我々は二つのカテゴリーがあり、設定項目をタイマ接頭辞、timer.formatそしてtimer.mode一人で私たちのために、

timer.formatこのような構成は、出力フォーマット、高い自由度を設定するために使用されるので含む、一緒に統一されます。

  • timer.format.fileFormat:ファイルの拡張子を含むログファイル名、(ログに出力しないが無効な場合)
  • timer.format.logPath:ログ出力の絶対パス、つまり、「/」現在のディスクのルートディレクトリとして、(そうでない場合は、ログに出力は無効)
  • timer.format.dateFormat:日付の出力形式、フォーム"YYYY-MM-DD HH: MM:SS" SimpleFormatter一貫
  • timer.format.formatterPath:フォーマッタクラスから定義されたフル・パス(たとえばと呼ぶことにします)

timer.modeのクラス構成はそうであって、一緒に統一され、列挙型であり、出力モード選択の数のために確立されています。

  • timer.mode.timeMode:タイム出力、現在のところ唯一のsimple一つのフォーマット
  • timer.mode.unit:時間単位選択範囲TimeUnitのすべての列挙クラスの
  • timer.mode.methodMode:出力メソッド名、そこsimpleparam二つの方法、すなわち、唯一のメソッド名の出力、メソッド名とパラメータと出力で
  • timer.mode.classMode:クラス名出力、そこfullsimple二つの方法、すなわち、完全な出力タイプのパス、および出力のみの単純な名前に

ここではサンプルの設定ファイルは、(一時的にカスタムフォーマッタを設定しない)です。

timer:
  format:
    file-format: timer-demo.log
    log-path: /
    date-format: yyyy-MM-dd HH:mm:ss
  mode:
    time-mode: simple
    unit: milliseconds
    method-mode: param
    class-mode: full
复制代码

Notes構成

@Timer注釈、現在有効な設定は次のとおりです。

  • 名前:設定されていない場合は、タイマーの名前は、デフォルトでは8つのランダムに生成された文字列になります
  • 単位:デフォルトでは、ミリ秒単位の時間の単位、ここで設定するには、設定ファイルよりも優先されます
  • フォーマッタ:定義されたパスからフォーマッタクラス、プロファイルよりも高い優先度
  • 位置:出力結果の位置、オプションがありますResultPosition.CONSOLEし、ResultPosition.LOGコンソールへのデフォルトの出力

次のように設定例を示します。

@Timer(name = "timer1", unit = TimeUnit.SECONDS, position = ResultPosition.LOG)
复制代码

カスタマイズ

ただ、これらの構成は、あなたのニーズを満たすことができない場合は、カスタム設定の自由度の高いもあって、

出力形式をカスタマイズします

デフォルトの出力形式は良い見ていませんか?出力形式をカスタマイズする方法をお教えになりました、それは問題ではありません。

まず、パッケージ内のタイマーを作成し、呼ばれる、パッケージ内のクラスを構築しMyFormatter、その後、継承、AbstractFormatter間違ったリードパックに注意を払っていません、:

import com.github.mayoi7.timer.format.AbstractFormatter;
import com.github.mayoi7.timer.props.TimerOutputSource;
import com.github.mayoi7.timer.props.TimerProperties;

public class MyFormatter extends AbstractFormatter {

    public MyFormatter(TimerProperties properties, TimerOutputSource source) {
        super(properties, source);
    }
}
复制代码

ここでは、私は最初の2つのオブジェクトを説明コンストラクタproperties、我々が設定された構成であるsource私たちのタイマーの出力があるが、我々は手動で設定する必要はありませんどの

そして、私たちは、クラスを定義するMyRecevier内部クラス[2] 必要性の上書き出力属性、取得するためのoutput()方法および当社のカスタムMyFormatterフォーマッタクラスの書き換えgetInfoReceiver()方法は、私たちの返すMyReceiverオブジェクトを:

import com.github.mayoi7.timer.format.AbstractFormatter;
import com.github.mayoi7.timer.props.TimerOutputSource;
import com.github.mayoi7.timer.props.TimerProperties;

public class MyFormatter extends AbstractFormatter {

    public MyFormatter(TimerProperties properties, TimerOutputSource source) {
        super(properties, source);
    }

    private static class MyReceiver extends InfoReceiver {
    
        @Override
        public String output() {
            return "\n[myFormatter]" + date + "-" + duration;
        }
    }
    
    @Override
    public InfoReceiver getInfoReceiver() {
        return new MyReceiver();
    }
}
复制代码

output()方法は、(から入手可能な以下の5つの属性があるInfoReceiverのは):

    class InfoReceiver {
        /** 日期 */
        protected String date;
        /** 名称 */
        protected String name;
        /** 执行时间 */
        protected String duration;
        /** 类信息 */
        protected String classInfo;
        /** 方法信息 */
        protected String methodInfo;

        // ...
    }
复制代码

最後に、最も重要なステップが来て、取ったMyFormatter通知タイマーのクラスへのパスを、二つの方法で構成されたコンフィギュレーションファイルと注釈があり、私は注釈を設定するにはここです:

@Timer(formatter = "com.example.demo.timer.MyFormatter")
复制代码

そして、あなたが私たちの出力の結果を見つけるだろう、テストを実行コンフィギュレーションの変更形式は次のとおりです。

Hello World...

[myFormatter]2019-06-08 23:34:20-828 ms
复制代码

詳細については、

もちろん、フォーマットの変更のみでは、あなたがより多くの情報を取得したいと、彼らはおよそタイミング法のクラスである場合、我々はまた、自己定義の手段を提供し、十分ではありません

たとえば、あなたが出力する情報の種類でFULLより多くのコンテンツのモードを取得するために、我々はに戻る必要がMyFormatterクラス、内部に再びクラスを追加し、[3] MyClassFormatterおよび継承ClassFormatter、選択メソッドをオーバーライドしています:

import com.github.mayoi7.timer.format.AbstractFormatter;
import com.github.mayoi7.timer.props.TimerOutputSource;
import com.github.mayoi7.timer.props.TimerProperties;

public class MyFormatter extends AbstractFormatter {

    // ...
    
    private static class MyClassFormatter extend ClassFormatter {

        @Override
        public String formatInFull(Class clazz) {
            return clazz.getName() + "-" + clazz.getTypeName();
        }
    } 
}
复制代码

そして、最も重要な点は、この新しいカテゴリは、コンストラクタで対応するプロパティの声明を与えられるということです。

public class MyFormatter extends AbstractFormatter {

    public MyFormatter(TimerProperties properties, TimerOutputSource source) {
        // ...
        
        classFormatter = new MyClassFormatter();
    }
复制代码

同様に、我々はまた、対応する情報のための方法を提供するMethodFormatterクラスとmethodFormatter基本的に同一の、さらなる実証を使用し、属性

私たちは、クラス情報の出力開く場合は、この構成では、完成されたFULLモードをちょうど、我々は特定のコンテンツを変更した後はもはやテストで、あなたは自分の関心に試すことができませんプロパティのプロパティMyReceiverclassInfo

注意事項

  • 開けないようにしてください@ComponentScan設定は、取らなければならないどんなに、ノートをcom.github.mayoi7.*スキャンするすべてのクラスを中
  • ノートの構成は、そのファイルよりも優先されますが、注釈内の設定時間単位はミリ秒である場合、優先度が最小化されます
  • 現在のプロジェクトのインパクトが不安定な段階にまだある、メソッドの実行時間は、いくつかの約束を持っていること
  • フレームワークは、タイミングに基づくものであるspring-aop豆に作用するだけバネが、クラスは、通常の下で使用することができないように、

終了

あなたがメールを送信することができます任意の質問がある場合、これは、チュートリアルフレームワーク全体が完全に完了しました[email protected]

最後に、プロジェクトが取り組むGitHubの-mayoi7 /タイマーは、興味のある友人は星を指すことができます


  1. 結果は、遅い応答時間後に重合レポートのメモの追加を示したが、エラー率が低い、それは仕方のテストに問題がある可能性があり、私はJMeterのためにあまりにも熟練していないを使用し、この報告書は、保持するための当面のための基準値ではありません↩︎

  2. このクラスの宣言が限定されるものでは推奨されませんが、カスタムフォーマッタは、クラス内で宣言します↩︎

  3. 同様に、この位置が限定されるものではなく、クラス宣言↩︎

ます。https://juejin.im/post/5cfbbaf86fb9a07eab687322で再現

おすすめ

転載: blog.csdn.net/weixin_34391854/article/details/91477698