きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaで現在行を取得する

Javaで現在行を取得する方法を記載します。

環境

  • Java
    • 17

対応

現在スレッドのlineNumberを取得すれば、現在行が取得できます。

return Thread.currentThread().getStackTrace()[2].getLineNumber();
  • 0番目
    • Threadクラス
  • 1番目
    • この処理している行
  • 2番目
    • 呼び出し元の行

他にも、クラス名getClassName()、メソッド名getMethodNameも取得できるので、デバッグ文言を加工したいときは利用できます。

テストクラス

実装クラスは、interfaceのdefaultメソッド、staticメソッドの両方とも用意しました。

public interface Debug {
  default int getLineNo() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
  }
}
public class DebugUtil {
  public static int getLineNo() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
  }
}

interfaceのテストはインスタンス化しないといけないので、ちょっとだけ工夫が必要です。

class DebugTests {
  public class TestClass implements Debug {
  }

  @Nested
  class LineNo {
    @Test
    void test_01() {
      assertThat(
          new TestClass().getLineNo()
      ).isEqualTo(18);
    }

    @Test
    void test_02() {
      assertThat(
          DebugUtil.getLineNo()
      ).isEqualTo(25);
    }
  }
}

ソースコード

終わりに

あまり使用する機会のない処理ではあります。

業務上、1000行近くの処理、10個くらいif文で処理をしなければいけない分岐ロジックを作ったのですが…。障害発生したときに、非常に処理を追うのがたいへんで心が折れてました。

この現在行もデバッグログに吐かせることで、どの処理分岐に入ったかを一目瞭然にできるようになりました。30分くらいかけて分岐を確認していたのが、10秒で済むようになって非常に楽になりました。

こういう運用面にもつながるようなログを出せる癖は身につけていきたいです。

JMeterでproxyを経由したくない(no proxy, non_proxy)

JMeterでproxy設定をする記事は見つかりましたが、proxyを経由しない設定が公式マニュアルを見ないと見つからなかったので、記事にします。

環境

  • JMeter
    • 5.5

      対応

      CLIでの設定

起動時のオプションで-Nを付与すると、proxyを経由しなくなります。

jmeter -N *.apache.org|localhost
# 負荷をかけたいIPやドメインを設定します。
# 複数の場合は | で区切ります。

propertiesでの設定

私は試していませんが、ヘルプによるとpropertiesでも設定できるようです。負荷先のIPやドメインをpropertiesで設定していることが多いので、propertiesで設定しても良さそうですね。

起動時のオプションだとhttpとhttpsのどちらもnpn_proxy設定をするので、それを意図的に分けたい時には使えそうですね。

http.nonProxyHosts=*.apache.org|localhost
https.nonProxyHosts=*.apache.org|localhost

終わりに

負荷試験でJMeterを使用しているのですが、地味に日本語だと情報が出てこなくて困りました。「jmeter no proxy」等々で調べれば英語で見つかるかと思ったのですが…。「jmeter non proxy」じゃないと引っかからないようですね。ネットワークでプロキシ設定したくない場合は「no_proxy」だったので、ハマりました。

結局、普通に公式ヘルプ探した方がよかったです。

参考情報

SpringのInterceptorでGETメソッド以外を拒否するようにコードで表現する

※ 特に見どころはありません。


業務都合にて、「アプリケーションをメンテナンスモードに切り替えても、参照系APIだけは参照できるようにしたい。更新系APIは拒否したい。」との要望が出てきました。

そもそも、「そんなこと可能?」ということを素振りしただけの記事です。

環境

  • Java
    • 17
  • SpringBoot
    • 2.6.4

前提

既にInterceptorは実装されている前提で進めます。Interceptorの実装、テストに関しては当記事を参照してください。

実装

AsyncHandlerInterceptor#preHandleメソッドの第1引数のHttpServletRequestにリクエストに関する情報が設定されています。

getMethodにて、HttpメソッドがGETメソッドであることを判定すれば、完了です。

public class MaintenanceInterceptor implements AsyncHandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    if (HttpMethod.GET.name().equals(request.getMethod())) {
      return true;
    }
    
    return false;
  }

他にもpathInfo, requestURI等に実行対象のURLが載っていたりするので、エンドポイントごとに規制する、規制しないというのも可能そうです。

特に、死活監視用のエンドポイントである/actuator/healthだけはInterceptorしない等々もできると思います。(spring-actuatorでできるかは未検証)

ソースコード

終わりに

過去のブログ記事 + αなので、大した内容ではありませんが、こうして疑問に思ったことを素振りして、期待通りにできたというメモを残しておきます。

類似記事