mike-neckのブログ

Java or Groovy or Swift or Golang

Java

reactor-netty コールドリーディング(4)

ChannelOperationsHandler reactor-netty が提供している ChannelHandler の実装クラス 内部に ContextHandler を持ち、これを通じて処理の登録などを行っている模様 channelActive(ChannelHandlerContext) ContextHandler#createOperations(Channel, Object…

reactor-netty コールドリーディング(3)

HttpRequest の組み立て HttpClient#get などのメソッドから HttpClient#request メソッドを呼び出し HttpClient#request にて Mono<HttpClientResponse> を返すが、実体は MonoHttpClientResponse 2.の際に HttpClient#handler というメソッドが呼び出され、 Function<HttpClientRequest,Publisher<Void>> が MonoH</httpclientrequest,publisher<void></httpclientresponse>…

reactor-netty コールドリーディング(2)

Bootstrap の組み立て Bootstrap は以下の2箇所のいずれかで組み立てる PoolResources#selectOrCreate(SocketAddress,Supplier,Consumer,EventLoopGroup) PoolResources が利用できる場合のみ PoolResources では接続先アドレス(ポート含む)ごとに Channel …

reactor-netty コードリーディング(1)

HttpClient#create(String,int) : アドレスとポートを Consumer<HttpClientOptions.Builder> にラップして(options.host(address).port(port)) HttpClient.Builder#options(Consumer<HttpClientOptions.Builder>) で設定して HttpClient を生成する HttpClientOptions.Builder は ClientOptions.Builder<B extends ClientOptions.Builder<B>> を継承した</b></httpclientoptions.builder></httpclientoptions.builder>…

JJUG CCC 2018 Spring にて発表しました #jjug_ccc

表題の通り 2018/05/26 開催された JJUG CCC にて発表してきました。 www.java-users.jp セッションが1つとLTが1つです。 セッションの方は 「(俺が)はじめての Netty」 で、LT のタイトルは「Spring Boot アプリケーションの起動を速くする 108 の Tips」で…

Java Day Tokyo 2018 のセッションメモ

Java Day Tokyo 2018 に行ってきたので、そのメモ。 キーノート 目黒駅で東京駅南口行きバスのりばを探すのに時間がかかってしまったため、20分遅刻してしまった。 僕が参加したときには Java の新しいリリースモデルの説明。 OpenJDK は 半年間しかサポート…

CompletableFuture の thenApplyAsync メソッドは何度も呼び出せるのか試してみた

最近、自分専用のライブラリーを書いていて、 CompletableFuture#thenApply および CompletableFuture#thenApplyAsync などを複数回呼び出せるのかがわかっていなかったし、 Javadoc にも書いていないようなので実験してみることにしました。 書いたのは次の…

Class Data Sharing を試してみる

Java 10 の Class Data Sharing で Spring Boot の起動を速くしてみます。 Class Data Sharing は異なるJVM上で同一のクラスの情報を共有する仕組みです。 Java 8 の時点ですでに組み込まれていましたが、コマーシャルな機能であったため、 使っている人は少…

Future を Mono に変換する

CompletableFuture<T> から Mono<T> に関しては、 Mono#fromFuture(CompletableFuture) というメソッドがあるのだが、 Future<T> からは Mono<T> への変換メソッドはないし、もっと言えば Future<T> から CompletableFuture<T> への変換メソッドもない。 最初は次のような変換</t></t></t></t></t></t>…

Gradle4.6 からの JUnit5 実行方法

Gradle4.6 がリリースされ、 JUnit5 に対応しました。以下にGradle から JUnit5 のテストを実行するための build.gradle を示しますが、特殊なことをするわけではありません。 build.gradle plugins { id 'java' } repositories { mavenCentral() } test { u…

Reactor Test の StepVerifier の withVirtualTime の使い方

Spring WebFlux で project Reactor が使われていて、まだ手に馴染んでいないので、 チュートリアル をやっていたところ、 StepVerifier#withVirtualTime の使い方がわからず、検索しても要領を得ず、いろいろ試して使い方がわかったので、そのメモ tech.io …

Spring Rest Repositories + JPA で @ManyToOne で指定されているフィールドを用いて検索するリクエストを投げる

ドキュメント探しても、ググってもstack overflowを探しても明確に書かれていなかったっぽいので(本来的には hal の仕様を見るのが正しいかもしれない) 次のような二つのエンティティが存在するものとする。 @Entity class Book { @Id private Integer id; p…

SpringのRestTemplate で Rest Repository が返す application/hal+json からオブジェクトを取得する

何か日本語でなかったため。 実行するのは spring-web が jar にある Java SE 環境(Spring context は存在しない)。 必要なライブラリー org.springframework.hateoas:spring-hateoas とその依存ライブラリー 使ったバージョン spring-core: 4.3.13.RELEASE …

Spring Data REST(+ Spring Data JPA)でPOSTする時のメモ

Spring Data REST + Spring Data JPA で こんなエンティティを作る。 @Entity public class User { @Id @GeneratedValue(strategy = IDENTITY) private Long id; private String name; } @Entity public class Message { @Id @GeneratedValue(strategy = IDE…

JUnit5のNestedクラスを使ってテスト条件をクラスの構造に閉じ込める(テスト小ネタ Advent Calendar 2017 6日目)

JUnit4まででは増えすぎたテストを整理するために、スタティックなメンバークラスを作って整理してきたかと思います。 @RunWith(Enclosed.class) public class Foo { public static class Bar { @Test public void baz() {} } } JUnit5 ではネストしたクラス…

Spring Fest 2017 に行ってきた

記憶を頼りに参加した勉強会についてまとめておくだけ。 2017/11/24 開催の Spring Fest 2017 に参加しました。 springfest2017.springframework.jp 会社ではSpringを使っていないJava EEを改造したフレームワークを利用していますが、独自フレームワークは…

Gradle JUnit5 Starter Pluginをリリースした

JUnit5 がリリースされてだいぶたちますが、そろそろ移行終わりましたか? ちなみに僕が勤務している会社ではJavaのバージョンがあわないので、JUnit4のままです。 ところで、JUnit5を使う時、わりと面倒くさい設定をいろいろと書かなければならず、導入する…

昨日書いたダメなコード

毎日残念なコード書いてるので続けてみる 前提 Java7(今日は関係ない) やりたいこと 指定した範囲のランダムな long の値がほしい 書いたコード 例 : 上限値(long かつ max > 0)を受け取ってランダムな値を返す final Random random = new Random(); long ra…

昨日書いたダメなコード

ヒドイコードを書いたので忘れないようにメモっておく(忘れないとは言ってない) 前提 Java7 guava18.0 使用 やりたいこと Optional の中の値に対して filter して isPresent の結果がほしい 書いたコード 例: Optional<Integer> に対して value > 0 の filter をかけ</integer>…

Java9でGradleを動かす

単なるメモ Javaのバージョンが2017/10/22現在で9.0.1で、Gradleのバージョンが4.2.1以下だとJavaのバージョンをパースできないためにGradleを実行できない Gradle4.2 での実行結果 $ java --version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 java 9…

git secretsとJavaのserialVersionUIDの相性が悪い

念のためにgit secretsを入れて、aws providerを設定していますが、ちょくちょくJavaのプロジェクトのコミットで失敗が発生してた。 コミットのエラーログを調べると、serialVersionUID private static final long serialVersionUID = -8419924062942848690L…

JUnit5の標準のassertとDynamicTestの用い方

JUnit5でわりと便利だと思っているのが、JUnit5に標準でついてくる Assertions#assertAll と @TestFactory で返す Iterable<DynamicTest> です。 エンタープライズな現場でよく見かけるテストとして、こういうのがあるかと思います。 @Test void firstTest() { final Map<Long, UserEntity> </long,></dynamictest>…

JJUG CCC 2017 Spring 参加メモ

表題の通りJJUG CCC 2017 Springに行ってきました。参加したセッションのメモです。 www.java-users.jp エンプラ開発におけるレガシーアプリケーションの巻取りとモジュール分割の戦い 既存のレガシーアプリケーションにアプリケーションを追加する案件から…

Java Day Tokyo 2017 参加メモ

Java Day Tokyo 2017に数年ぶりに参加しました。そのメモです。僕が参加したのは次のセッションです。 基調講演 Java 9 and Beyond: Java Renaissance in the Cloud Modular Development with JDK 9 Tuning G1GC Java SE 9のすすめ 緊急開催!Java技術メモ三…

Java9(ea163)でHttpClientを使ってみたノート

ディレクトリ構成やmodule-info.javaで少々ハマったので(10分)、ノート。 Java SE9から公式のやっと面倒くさくないHttp Clientが出るので試してみた。 試してみたのは jdk.incubator.httpclient モジュールの jdk.incubator.http.HttpClient とその関連クラ…

Spring BootでThymeleaf3を使うときのbuild.gradle

ググってもMavenの方法しか出てこないのでメモ。 start.spring.io で作ったbuild.gradleに次を追加するだけ。 ext['thymeleaf.version'] = '3.0.0.RELEASE' ext['thymeleaf-layout-dialect.version'] = '2.0.0' 元ネタはこちらのステファン・ニコルさんのコ…

JSUG勉強会 2017 - 3 〜ドメイン駆動設計 powered by Spring のメモ

JSUGの勉強会に参加したので、そのメモ。 jsug.doorkeeper.jp 資料は公開されるだろうから、ここでしか聞けないことを中心にメモ(ツイート)したつもりだが、資料に盛り込まれている可能性は十分にある。なお、資料は以下の通り。 ドメインロジックに集中せよ…

Javaでの和暦の扱いについて

Date and Time APIでの和暦の扱いをちゃんと調べていなかったので、調べた。 なお、以下で用いるコードにおいては次のフォーマッタおよび、タイムゾーンを使った。 final ZoneId tokyo = ZoneId.of("Asia/Tokyo"); final DateTimeFormatter formatter = new …

testcontainersで使い捨てのデータベースコンテナを用意してSpring Bootアプリケーションのテストをおこなう

テストを流したらデータベースを起動していなくて、テストが全部コケさせることがよくあり、悩んでましたが、 @making さんに testcontainers を教えてもらったので試してみました(経緯は若干違う)。 github.com testcontainersはテスト時にのみ使う使い捨て…

Speedment ORMのメモ

Stream APIを使ったORM。 概要 MavenプラグインでDBスキーマからモデルのクラス/レポジトリー(に該当する)クラスを吐き出す Applicatoinクラスからレポジトリー(に該当する)クラスを取り出す レポジトリーにStream APIを通じてクエリーを投げる インストール…