Example #1
0
        void RegisterTicket(AgentProcessTicket ticket)
        {
            if (ticket.IsDisposed)
            {
                throw new ObjectDisposedException(nameof(ticket));
            }

            lock (tickets) {
                if (!tickets.Contains(ticket))
                {
                    tickets.Add(ticket);
                    ticket.Disposed += HandleTicketDisposed;
                }
            }
        }
Example #2
0
        public async Task <IAgentProcessState> StartAsync(
            AgentProcessTicket ticket,
            CancellationToken cancellationToken)
        {
            if (ticket == null)
            {
                throw new ArgumentNullException(nameof(ticket));
            }

            if (ticket.IsDisposed)
            {
                throw new ObjectDisposedException(nameof(ticket));
            }

            try {
                LogStartStatus(ticket, "waiting for all clear");
                await startWait.WaitAsync().ConfigureAwait(false);

                AgentProcessState agentProcessState;

                lock (runningAgentProcessStateLock) {
                    if (runningAgentProcessState != null)
                    {
                        LogStartStatus(ticket, "using existing agent process manager");
                        RegisterTicket(ticket);
                        return(runningAgentProcessState);
                    }
                }

                LogStartStatus(ticket, "creating new agent process manager");
                agentProcessState = new AgentProcessState(workbookApp, agentProcessType);
                agentProcessState.AgentProcess.UnexpectedlyTerminated
                    += HandleAgentProcessUnexpectedlyTerminated;

                var identifyAgentRequest = ClientApp
                                           .SharedInstance
                                           .WebServer
                                           .AgentIdentificationManager
                                           .GetAgentIdentityRequest(cancellationToken);

                LogStartStatus(ticket, "waiting for agent process manager to start");
                await agentProcessState.AgentProcess.StartAgentProcessAsync(
                    identifyAgentRequest,
                    ticket.MessageService,
                    cancellationToken).ConfigureAwait(false);

                LogStartStatus(ticket, "requesting agent identity");
                agentProcessState.AgentIdentity = await ClientApp
                                                  .SharedInstance
                                                  .WebServer
                                                  .AgentIdentificationManager
                                                  .GetAgentIdentityAsync(identifyAgentRequest).ConfigureAwait(false);

                var agentAssociable = agentProcessState.AgentProcess as IAgentAssociable;
                if (agentAssociable == null)
                {
                    LogStartStatus(ticket, "creating agent client");
                    agentProcessState.AgentClient = new AgentClient(
                        agentProcessState.AgentIdentity.Host,
                        agentProcessState.AgentIdentity.Port);
                }
                else
                {
                    LogStartStatus(ticket, "waiting on agent association");
                    var agentAssociation = await agentAssociable.GetAgentAssociationAsync(
                        agentProcessState.AgentIdentity,
                        cancellationToken).ConfigureAwait(false);

                    agentProcessState.AgentIdentity = agentAssociation.Identity;
                    agentProcessState.AgentClient   = agentAssociation.Client;
                }

                try {
                    LogStartStatus(ticket, "registering ticket");
                    RegisterTicket(ticket);
                } catch (ObjectDisposedException e) {
                    Terminate(agentProcessState);
                    throw e;
                }

                lock (runningAgentProcessStateLock)
                    runningAgentProcessState = agentProcessState;

                MonitorConnectionAsync(agentProcessState).Forget();

                return(agentProcessState);
            } catch (Exception e) {
                Log.Error(TAG, nameof(StartAsync), e);
                throw e;
            } finally {
                startWait.Release();
            }
        }
Example #3
0
 void LogStartStatus(AgentProcessTicket ticket, string status)
 => Log.Debug(TAG, $"{nameof (StartAsync)}(ticket={ticket.Id}): {status}");