Browse Source

🚑 客户端先启动,SignalR不会尝试重连。#49

IdentityServer4
WangJunZzz 4 years ago
parent
commit
3f143d6536
  1. 84
      vben28/src/hooks/web/useSignalR.ts

84
vben28/src/hooks/web/useSignalR.ts

@ -1,62 +1,68 @@
import * as signalR from '@microsoft/signalr'; import * as signalR from '@microsoft/signalr';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { useUserStoreWithOut } from '/@/store/modules/user'; import { useUserStoreWithOut } from '/@/store/modules/user';
let connection; let connection:signalR.HubConnection;
export function useSignalR() { export function useSignalR() {
/** /**
* 开始连接SignalR * 开始连接SignalR
*/ */
function startConnect(): void { async function startConnect() {
connection = connectionsignalR(); try {
//接收普通文本消息 connectionsignalR();
connection.on('ReceiveTextMessageAsync', ReceiveTextMessageHandlerAsync); await connection.start();
//接收广播消息 } catch (err) {
connection.on('ReceiveBroadCastMessageAsync', ReceiveBroadCastMessageHandlerAsync); console.log(err);
//开始连接 setTimeout(() => startConnect(), 5000);
connection.start(); }
} }
/** /**
* 关闭SignalR连接 * 关闭SignalR连接
*/ */
function closeConnect(): void { function closeConnect(): void {8
if (connection) { if (connection) {
connection.stop(); connection.stop();
} }
} }
/** async function connectionsignalR(){
* 连接signalr
*/
function connectionsignalR() {
const userStore = useUserStoreWithOut(); const userStore = useUserStoreWithOut();
const token = userStore.getToken; const token = userStore.getToken;
const url = (import.meta.env.VITE_WEBSOCKE_URL as string) + '/signalr/notification'; const url = (import.meta.env.VITE_WEBSOCKE_URL as string) + '/signalr/notification';
connection = new signalR.HubConnectionBuilder() connection = new signalR.HubConnectionBuilder()
.withUrl(url, { .withUrl(url, {
accessTokenFactory: () => token, accessTokenFactory: () => token,
skipNegotiation: true, skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets, transport: signalR.HttpTransportType.WebSockets,
}) })
.withAutomaticReconnect({ .withAutomaticReconnect({
nextRetryDelayInMilliseconds: (retryContext) => { nextRetryDelayInMilliseconds: retryContext => {
//重连规则:重连次数<300:间隔1s;重试次数<3000:间隔3s;重试次数>3000:间隔30s
let count = retryContext.previousRetryCount / 300; //重连规则:重连次数<300:间隔1s;重试次数<3000:间隔3s;重试次数>3000:间隔30s
if (count < 1) { let count = retryContext.previousRetryCount / 300;
//重试次数<300,间隔1s if (count < 1)//重试次数<300,间隔1s
return 1000; {
} else if (count < 10) { return 1000;
//重试次数>300:间隔5s }
return 1000 * 5; else if (count < 10) //重试次数>300:间隔5s
} //重试次数>3000:间隔30s {
else { return 1000 * 5;
return 1000 * 30;
} }
}, else //重试次数>3000:间隔30s
}) {
.configureLogging(signalR.LogLevel.Information) return 1000 * 30;
.build(); }
return connection; }
})
.configureLogging(signalR.LogLevel.Debug)
.build();
//接收普通文本消息
connection.on('ReceiveTextMessageAsync', ReceiveTextMessageHandlerAsync);
//接收广播消息
connection.on('ReceiveBroadCastMessageAsync', ReceiveBroadCastMessageHandlerAsync);
} }
/** /**

Loading…
Cancel
Save