public <T extends ExtensionPoint> Mono<Void> invokeExtensionPointsSimultaneously(
            Class<T> extensionPointClass,
            Method method,
            SimultaneousExtensionPointInvoker<T> invoker) {
        List<T> extensionPoints = pluginRepository.getExtensionPoints(extensionPointClass);
        int size = extensionPoints.size();
        if (size == 0) {
            return Mono.empty();
        }
        List<Mono<?>> list = new ArrayList<>(size);
        for (ExtensionPoint extensionPoint : extensionPoints) {
            TurmsExtension extension = (TurmsExtension) extensionPoint;
            if (!extension.isRunning()) {
                continue;
            }
            try {
                list.add(invoker.invoke((T) extensionPoint)
                        .onErrorMap(t -> translateException(t, method, extension)));
            } catch (Exception e) {
                list.add(Mono.error(translateException(e, method, extension)));
            }
        }
        if (list.isEmpty()) {
            return Mono.empty();
        }
        return Mono.whenDelayError(list);
    }
@implNote Start plugins after all beans are ready so that plugins can get any bean when
          starting.
turms-server-common/src/main/java/im/turms/server/common/infra/plugin/PluginManager.java