Wire Mock で NoClassDefFoundError が発生する
エラー Spring Boot3 で WireMock を導入しようとしたら以下のエラーが出た。 1 2 3 4 5 6 7 8 9 Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/DispatcherType at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:375) at com.github.tomakehurst.wiremock.jetty9.JettyHttpServerFactory.getServerConstructor(JettyHttpServerFactory.java:37) at com.github.tomakehurst.wiremock.jetty9.JettyHttpServerFactory.<clinit>(JettyHttpServerFactory.java:30) at com.github.tomakehurst.wiremock.core.WireMockConfiguration.<init>(WireMockConfiguration.java:94) at com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig(WireMockConfiguration.java:135) at com.github.tomakehurst.wiremock.core.WireMockConfiguration.options(WireMockConfiguration.java:139) at com.github.tomakehurst.wiremock.junit5.WireMockExtension.<clinit>(WireMockExtension.java:40) 対処法 以下を 1 2 3 4 5 6 <dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-jre8</artifactId> <version>2.35.0</version> <scope>test</scope> </dependency> に変えた。 1 2 3 4 5 6 <dependency> <groupId>com.github.tomakehurst</groupId> <artifactId>wiremock-jre8-standalone</artifactId> <version>2.35.0</version> <scope>test</scope> </dependency> References
azure-sdk-bom と spring-cloud-dependencies のバージョンを合わせる
初めに 今開発している Maven プロジェクトでは、基本は spring-cloud-dependencies を使って spring-cloud-azure の依存関係を管理しているが、ピュアな azure-sdk を使わなければいけない場面があったので共存させる場合のバージョンを調査した。 結論 spring-cloud-azure と ピュア azure-sdk の共存には以下のサイトを見てバージョンを合わせましょう https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Versions-Mapping 経緯 1 2 3 4 5 <dependency> <groupId>com.azure</groupId> <artifactId>azure-storage-blob</artifactId> <version>${azure-storage-blob.version}</version> </dependency> 当初 pom には上記のように依存関係を追加していたが、azure-core にある jackson のバージョンと前述の spring-cloud-dependencies が競合してしまっていた。 検索するとこちらが最初に引っかかるがこれだけでは知りたいことがわからず。 結論にも書いたこちらのサイトで最新の Spring Boot3 には 1.2.8 を使えばいいことがわかった。 最終的に以下のようになった。(一部抜粋) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!...
Java CompletableFuture
CompletableFuture とは Java8 で導入された Java の並行処理 API CompletableFuture は関数型プログラミングスタイルを使用した非同期処理とリアクティブ API が実行できる Future / CompletionStage を継承した便利クラス Reactive Programming と CompletableFuture Reactive Programming とは データをストリームとして認識 データを受け取るたびにプログラムが反応して処理を行うこと 必要なデータを自ら取得して処理をするスタイルではない データの生産側はデータの消費側がどういう処理をしているのか意識しない データの消費側の処理を待つ必要がなくなる→非同期 データを通知した後はすぐに別の次の処理を行うことができる→ノンブロッキング データの消費者の負荷状況に関わらず一方的にデータを通知し続ける状況への対応手段の提供→バックプレッシャー リアクティブシステムの性質 Reactive API のようなリアクティブシステムには以下4つの性質がある(Reactive manifesto) Responsive(即応性) 基本的に非同期 リクエストはすぐ呼び出され、データが利用可能な時に呼び出し側へレスポンスが返される Resilient(耐障害性) システムは例外やエラーなどの障害に直面しても即応性を保ち続ける 耐障害性は、レプリケーション・封じ込め・隔離・移譲によって実現される Elastic(弾力性) システムはワークロードが変動しても即応性を保ち続ける リアクティブシステムは入力の提供に割り当てるリソースを増加あるいは減少させることで入力量の変化に反応する これは、システムの中に競合する場所や中心的なボトルネックが存在しないように設計し、シャーディングしたりレプリケーションしたコンポーネント間に入力を分散させることを意味する Message Driven(メッセージ駆動) リアクティブシステムは非同期なメッセージパッシングによってコンポーネント間の境界を確立する これによって疎結合性・隔離性・位置透過性を保証するとともに、エラーをメッセージとして移譲する手段を確保する システム内にメッセージキューを作成して監視し、必要ならバックプレッシャーを適用することでフロー制御が可能になる CompletableFuture API CompletableFuture クラスのメソッドは三つのカテゴリに分けられる Factory メソッド 非同期計算を開始する Completion Stage メソッド 非同期計算を実現するために使用される 例外メソッド 例外を処理する supplyAsync() / thenAccept() supplyAsync() Factory メソッド 非同期計算を開始するために使用される。バックグラウンドのタスクをトリガーし、すぐに返す 二つのリアクティブシステムの性質を持つ Responsive....
Java Multi Thread Coding
はじめに Java のマルチスレッドや非同期処理、並列処理の仕様についてなんとなくの知識しか持っていなかったため調査した。概要や概念など簡単にまとめたものをメモとして残す。 Thread スレッドとは、プログラム内での実行スレッドのことです。Java仮想マシンでは、アプリケーションは並列に実行される複数のスレッドを使用することができます。 引用元:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html スレッドは、一つのまとまった処理を表す。 実行時に一つのスレッドのみを扱うことをシングルスレッドと呼ぶ。 スレッドが複数用意され、各スレッドが同時に並列処理が行われることをマルチスレッドと呼ぶ。 Thread の使い方 Thread クラスを継承する Runnable インターフェースを実装する Example: Runnable インターフェースを実装してみる 今回は使い方2である Runnable インターフェースを用いて実装した。コード量が多く、Service クラスや Domain クラスは省いているためこのまま実行はできないことに留意。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 public class ProductServiceUsingThread { private ProductInfoService productInfoService; private ReviewService reviewService; public ProductServiceUsingThread(ProductInfoService productInfoService, ReviewService reviewService) { this....
Ingress Controller デプロイ時に 503 Error が発生した際の対処方法
初めに 以前作成したマニフェストから新しい検証システムを作ろうとして改修したら発生してしまった 503 エラーの対処方法をメモ。 完全に単なる修正漏れだったけど、一瞬焦りました。 エラー内容 マニフェストを apply 後、ブラウザ上でも kubectl logs --timestamps=true --tail=100 ingress-nginx-controller-746d65d669-4sdnr でログでも以下のような 503 エラーが出ていた。 1 2 3 4 5 2022-10-26T06:16:51.078615118Z xxx.xxx.xxx.xxx - - [26/Oct/2022:06:16:51 +0000] "GET / HTTP/2.0" 503 592 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" 17 0.000 [dev-server-cluster-ip-service-8080] [] - - - - 1458712adb6a97871370b8aa09da6aba 2022-10-26T06:19:42.228297896Z xxx.xxx.xxx.xxx - - [26/Oct/2022:06:19:42 +0000] "GET / HTTP/2.0" 503 592 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537....