ASP.NET Core SignalR Java クライアント

作成者: Mikael Mengistu

Java クライアントを使うと、Android アプリを含め、Java コードから ASP.NET Core SignalR サーバーに接続できます。 JavaScript クライアント.NET クライアントと同様に、Java クライアントを使うと、ハブとの間でリアルタイムにメッセージを送受信できます。 Java クライアントは、ASP.NET Core 2.2 以降でのみ使用できます。

この記事で参照している Java コンソール アプリのサンプルには、SignalR Java クライアントが使われています。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

SignalR Java クライアント パッケージをインストールする

signalr-7.0.0 JAR ファイルを使うと、クライアントから SignalR ハブに接続できます。 最新の JAR ファイルのバージョン番号を調べるには、Maven の検索結果ページを参照してください。

Gradle を使用する場合は、build.gradle ファイルの dependencies セクションに次の行を追加します。

implementation 'com.microsoft.signalr:signalr:7.0.0'

Maven を使用する場合は、pom.xml ファイルの <dependencies> 要素内に次の行を追加します。

<dependency>
    <groupId>com.microsoft.signalr</groupId>
    <artifactId>signalr</artifactId>
    <version>1.0.0</version>
</dependency>

ハブに接続する

HubConnection を確立するには、HubConnectionBuilder を使うことをお勧めします。 ハブの URL とログ レベルは、接続の構築時に構成できます。 必要なオプションを構成するには、build の前に HubConnectionBuilder のいずれかのメソッドを呼び出します。 start を使って接続を開始します。

HubConnection hubConnection = HubConnectionBuilder.create(input)
        .build();

クライアントからハブ メソッドを呼び出す

send を呼び出すと、ハブ メソッドが呼び出されます。 ハブ メソッド名と、ハブ メソッドに定義されている引数を send に渡します。

hubConnection.send("Send", input);

Note

クライアントからのハブのメソッドの呼び出しは、SignalRAzure Service を "既定" モードで使用している場合にのみサポートされます。 詳細については、「Frequently Asked Questions (よく寄せられる質問)」(azure-signalr GitHub リポジトリ) を参照してください。

ハブからクライアントのメソッドを呼び出す

hubConnection.on を使って、ハブから呼び出すことができるクライアント上のメソッドを定義します。 メソッドの定義は、接続の構築後かつ開始前に行います。

hubConnection.on("Send", (message) -> {
    System.out.println("New Message: " + message);
}, String.class);

ログ記録の追加

SignalR Java クライアントでは、SLF4J ライブラリがログに使用されます。 これは高レベルのログ API であり、このライブラリのユーザーは、特定のログの依存関係を導入することで独自の特定のログの実装を選択できます。 次のコード スニペットは、SignalR Java クライアントで java.util.logging を使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係にログを構成しない場合は、SLF4J によって、既定の非操作ロガーが読み込まれ、次の警告メッセージが表示されます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

Android 開発に関する注意事項

SignalR クライアント機能に対する Android SDK の互換性については、ターゲットの Android SDK バージョンを指定するときに次の項目を考慮してください。

ベアラー トークン認証を構成する

SignalR Java クライアントでは、HttpHubConnectionBuilder に "アクセス トークン ファクトリ" を提供して、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して、RxJavaSingle<String> を指定します。 Single.defer を呼び出すことで、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("YOUR HUB URL HERE")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Java でのクラス情報の受け渡し

Java クライアントで HubConnectiononinvoke、または stream メソッドを呼び出す場合、メソッドに渡される汎用 Object を記述する際に Class<?> オブジェクトではなく Type オブジェクトを渡すことをお勧めします。 Type を取得するには、用意されている TypeReference クラスを使います。 たとえば、次のコードでは、Foo<T> というカスタム ジェネリック クラスを使って Type を取得しています。

Type fooType = new TypeReference<Foo<String>>() { }).getType();

非ジェネリック型 (たとえば、プリミティブや、String のようなパラメーター化されていない型) の場合は、単に組み込みの .class を使うことができます。

これらのメソッドを 1 つ以上のオブジェクト型で呼び出す場合は、メソッドを呼び出すときにジェネリック構文を使います。 たとえば、引数に String と Foo<String> オブジェクトを受け取る func というメソッドのために on ハンドラーを登録する場合、次のコードを使って引数を出力するアクションを設定します。

hubConnection.<String, Foo<String>>on("func", (param1, param2) ->{
    System.out.println(param1);
    System.out.println(param2);
}, String.class, fooType);

このような規則が必要なのは、Java では型の消去が行われるため、Object.getClass メソッドでは複合型に関する完全な情報を取得できないからです。 たとえば、ArrayList<String> に対して getClass を呼び出すと、Class<ArrayList<String>> ではなく Class<ArrayList> が返されます。受信メッセージを正しく逆シリアル化するために十分な情報が逆シリアライザーに与えられません。 同じことがカスタム オブジェクトにも当てはまります。

既知の制限事項

  • トランスポート フォールバックとサーバー送信イベント トランスポートはサポートされていません。
  • トランスポート フォールバックとサーバー送信イベント トランスポートはサポートされていません。
  • JSON プロトコルのみがサポートされています。
  • JSON プロトコルのみがサポートされています。
  • WebSockets トランスポートのみがサポートされています。
  • ストリーミングはまだサポートされていません。

その他のリソース