Пример #1
0
        /// <nodoc />
        public async Task <Possible <IPlugin> > CreatePluginAsync(PluginCreationArgument pluginCreationArgument)
        {
            PluginResponseResult <bool> pluginCreationResult;

            try
            {
                var plugin = CreatePlugin(pluginCreationArgument);
                pluginCreationResult = await plugin.StartAsync();

                if (pluginCreationResult.Succeeded)
                {
                    plugin.Status = PluginStatus.Running;
                    return(new Possible <IPlugin>(plugin));
                }
                else
                {
                    plugin.PluginProcess.Kill();
                    return(pluginCreationResult.Failure);
                }
            }
            catch (Exception e)
            {
                return(new Failure <string>($"Exception happens when start plugin at {pluginCreationArgument.PluginPath}, Exception: {e}"));
            }
        }
Пример #2
0
        /// <nodoc />
        private async Task <Possible <IPlugin> > CreatePluginAsync(PluginCreationArgument pluinCreationArgument)
        {
            try
            {
                if (!File.Exists(pluinCreationArgument.PluginPath) && pluinCreationArgument.RunInSeparateProcess)
                {
                    Tracing.Logger.Log.PluginManagerLogMessage(m_loggingContext, $"Can't Load plugin because {pluinCreationArgument.PluginPath} doesn't exist");
                    new Failure <IPlugin>(null);
                }

                var sw     = Stopwatch.StartNew();
                var result = await PluginFactory.Instance.CreatePluginAsync(pluinCreationArgument);

                Interlocked.Add(ref m_pluginLoadingTime, sw.ElapsedMilliseconds);

                if (result.Succeeded)
                {
                    Interlocked.Increment(ref m_pluginLoadedSuccessfulCount);
                    var plugin = result.Result;
                    Tracing.Logger.Log.PluginManagerLoadingPlugin(m_loggingContext, plugin.FilePath, plugin.Name, plugin.Id);
                }
                else
                {
                    Interlocked.Increment(ref m_pluginLoadedFailureCount);
                    Tracing.Logger.Log.PluginManagerLogMessage(m_loggingContext, $"Failed to load {pluinCreationArgument.PluginPath} because {result.Failure.Describe()}");
                }

                return(result.Succeeded ? new Possible <IPlugin>(result.Result) : new Failure <IPlugin>(null));
            }
            catch (Exception e)
            {
                return(new Failure <string>($"Can't start plugin with exception {e}"));
            }
        }
Пример #3
0
        /// <nodoc />
        public async Task <Possible <IPlugin> > GetOrCreateAsync(PluginCreationArgument startPluginArguments)
        {
            var creationResult = await m_plugins.GetOrAdd(startPluginArguments.PluginPath, path => CreatePluginAsync(startPluginArguments));

            if (!creationResult.Succeeded)
            {
                m_plugins.TryRemove(startPluginArguments.PluginPath, out _);
                return(creationResult);
            }

            var plugin = creationResult.Result;
            Possible <List <PluginMessageType> > messageType = await GetSupportedMessageTypeAsync(plugin);

            if (messageType.Succeeded)
            {
                // Register the plugin in handlers only when response of supportedMessageType is received
                foreach (var pluginMessageType in messageType.Result)
                {
                    IPlugin alreadyRegisteredPlugin = null;
                    if (!m_pluginHandlers.TryGet(pluginMessageType, out alreadyRegisteredPlugin))
                    {
                        m_pluginHandlers.TryAdd(pluginMessageType, plugin);
                    }
                    else
                    {
                        Tracing.Logger.Log.PluginManagerErrorMessage(m_loggingContext, $"Two plugins({plugin.FilePath} and {alreadyRegisteredPlugin.FilePath}) can hanlde {pluginMessageType} that we don't suuport this scenario");
                    }
                }
                Tracing.Logger.Log.PluginManagerLogMessage(m_loggingContext, $"Supported Messagey Type for {plugin.Name} is {string.Join(",", messageType.Result)}");
                plugin.SupportedMessageType = messageType.Result;
            }
            else
            {
                Tracing.Logger.Log.PluginManagerLogMessage(m_loggingContext, $"Can't get supported message tyep for {plugin.Name}");
            }

            return(creationResult);
        }
Пример #4
0
 /// <nodoc />
 public IPlugin CreatePlugin(PluginCreationArgument pluginCreationArgument)
 {
     return(pluginCreationArgument.RunInSeparateProcess ?
            m_pluginRunInProcessCreationFunc.Invoke(pluginCreationArgument) :
            m_pluginRunInThreadCreationFunc.Invoke(pluginCreationArgument));
 }