Nguon: Microsoft Learn · .NET 8.0

SignalR Java Client trong ASP.NET Core

Nguồn: ASP.NET Core SignalR Java client

Bởi Mikael Mengistu

Java client cho phép kết nối với ASP.NET Core SignalR server từ code Java, bao gồm cả ứng dụng Android. Giống như JavaScript client.NET client, Java client cho phép bạn nhận và gửi thông điệp đến hub theo thời gian thực (real time). Java client có sẵn trong ASP.NET Core 2.2 trở lên.

Ứng dụng console Java mẫu được tham chiếu trong bài viết này sử dụng SignalR Java client.

Xem hoặc tải code mẫu (cách tải)

Cài đặt gói SignalR Java client

File JAR signalr-7.0.0 cho phép các client kết nối với các SignalR hub. Để tìm số phiên bản file JAR mới nhất, hãy xem kết quả tìm kiếm Maven.

Nếu sử dụng Gradle, thêm dòng sau vào phần dependencies của file build.gradle:

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

Nếu sử dụng Maven, thêm các dòng sau bên trong phần tử <dependencies> của file pom.xml:

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

Kết nối với hub

Để thiết lập một HubConnection, nên sử dụng HubConnectionBuilder. URL hub và mức log có thể được cấu hình khi xây dựng kết nối. Cấu hình bất kỳ tùy chọn nào cần thiết bằng cách gọi bất kỳ phương thức HubConnectionBuilder nào trước build. Bắt đầu kết nối với start.

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

Gọi các phương thức hub từ client

Một lời gọi đến send sẽ gọi một phương thức hub. Truyền tên phương thức hub và bất kỳ đối số nào được định nghĩa trong phương thức hub vào send.

java
hubConnection.send("Send", input);

Lưu ý: Gọi các phương thức hub từ client chỉ được hỗ trợ khi sử dụng Azure SignalR Service ở chế độ Default. Để biết thêm thông tin, xem Câu hỏi thường gặp (kho lưu trữ GitHub azure-signalr).

Gọi các phương thức client từ hub

Sử dụng hubConnection.on để định nghĩa các phương thức trên client mà hub có thể gọi. Định nghĩa các phương thức sau khi xây dựng nhưng trước khi bắt đầu kết nối.

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

Thêm logging

SignalR Java client sử dụng thư viện SLF4J để logging. Đây là API logging cấp cao cho phép người dùng thư viện chọn triển khai logging cụ thể của riêng họ bằng cách đưa vào một dependency logging cụ thể. Đoạn code sau đây cho thấy cách sử dụng java.util.logging với SignalR Java client.

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

Nếu bạn không cấu hình logging trong các dependency, SLF4J tải một logger no-operation mặc định với thông báo cảnh báo sau:

code
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.

Điều này có thể bỏ qua một cách an toàn.

Lưu ý phát triển Android

Liên quan đến khả năng tương thích Android SDK cho các tính năng SignalR client, hãy xem xét các mục sau khi chỉ định phiên bản Android SDK mục tiêu:

Cấu hình xác thực bearer token

Trong SignalR Java client, bạn có thể cấu hình bearer token để sử dụng cho xác thực (authentication) bằng cách cung cấp "access token factory" cho HttpHubConnectionBuilder. Sử dụng withAccessTokenFactory để cung cấp một RxJava Single<String>. Với một lời gọi đến Single.defer, bạn có thể viết logic để tạo access token cho client của mình.

java
HubConnection hubConnection = HubConnectionBuilder.create("YOUR HUB URL HERE")
    .withAccessTokenProvider(Single.defer(() -> {
        // Logic của bạn ở đây.
        return Single.just("An Access Token");
    })).build();

Truyền thông tin Class trong Java

Khi gọi các phương thức on, invoke, hoặc stream của HubConnection trong Java client, người dùng nên truyền đối tượng Type thay vì đối tượng Class<?> để mô tả bất kỳ Object chung nào được truyền cho phương thức. Một Type có thể được lấy bằng cách sử dụng class TypeReference được cung cấp. Ví dụ: sử dụng một class chung tùy chỉnh tên là Foo<T>, code sau lấy Type:

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

Đối với các kiểu không chung (non-generics), chẳng hạn như kiểu nguyên thủy (primitive) hoặc các kiểu không tham số hóa khác như String, bạn có thể đơn giản sử dụng .class tích hợp sẵn.

Khi gọi một trong các phương thức này với một hoặc nhiều kiểu đối tượng, hãy sử dụng cú pháp generics khi gọi phương thức. Ví dụ: khi đăng ký handler on cho một phương thức tên là func, nhận các đối số là một String và một đối tượng Foo<String>, hãy sử dụng code sau để thiết lập một action in ra các đối số:

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

Quy ước này cần thiết vì chúng ta không thể lấy thông tin đầy đủ về các kiểu phức tạp với phương thức Object.getClass do type erasure (xóa kiểu) trong Java. Ví dụ: gọi getClass trên ArrayList<String> sẽ không trả về Class<ArrayList<String>>, mà là Class<ArrayList>, không cung cấp đủ thông tin cho bộ deserializer để deserialize chính xác một thông điệp đến. Điều tương tự cũng đúng với các đối tượng tùy chỉnh.

Các hạn chế đã biết (Known limitations)