예제 #1
0
파일: DCEPNode.cs 프로젝트: samieze/aMuSE
        public void threadStartMethod()
        {
            stopwatch.Start();

            while (true)
            {
                processControlMessages();

                switch (state)
                {
                case NodeExecutionState.WaitForStart:
                    /*                        // broadcast isready signal to directorNode every second
                     *                     if (stopwatch.ElapsedMilliseconds - lastStatusMessageToCoordinator > 1000){
                     *                         proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new NodeIsReadyToStartMessage(nodeName));
                     *                         //Console.WriteLine(TAG + "sending ready to start message to director node "+settings.directorNodeName.ToString());
                     *                         lastStatusMessageToCoordinator = stopwatch.ElapsedMilliseconds;
                     *                     } */

                    if (!sentReadyToStartMessage)
                    {
                        proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new NodeIsReadyToStartMessage(nodeName));
                        sentReadyToStartMessage = true;
                    }

                    break;

                case NodeExecutionState.DoStartInputGeneration:
                    // TODO: check if this is not already running and throw an error if it is
                    primitiveEventSourceService.start();
                    state = NodeExecutionState.Running;
                    processingStep();
                    break;

                case NodeExecutionState.Running:
                    processingStep();
                    break;

                case NodeExecutionState.DoStopInputGeneration:
                    primitiveEventSourceService.stop();
                    state = NodeExecutionState.ProcessingRemainder;

                    break;

                case NodeExecutionState.ProcessingRemainder:
                    processingStep();

                    // when queues are empty, send isReadyToTerminate message every second
                    if (getQueuedEventCount() == 0)
                    {
                        if (stopwatch.ElapsedMilliseconds - lastStatusMessageToCoordinator > 1000)
                        {
                            proxyProvider.getProxy(settings.directorNodeName)
                            .ReceiveDCEPControlMessageFork(new NodeIsReadyToTerminateMessage(nodeName));
                            lastStatusMessageToCoordinator = stopwatch.ElapsedMilliseconds;
                        }
                    }

                    break;

                case NodeExecutionState.DoSendExperimentDataAndTerminate:

                    var data = new ExperimentRunData(
                        locallyGeneratedComplexEventCount,
                        receivedEventCount,
                        locallyGeneratedPrimitiveEventCount,
                        locallyDroppedComplexEvents);

                    proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new ExperimentRunNodeDataMessage(nodeName, data));
                    Console.WriteLine(TAG + "Sent experiment data. Update loop is terminating.");
                    Thread.Sleep(500);
                    if (getQueuedEventCount() > 0)
                    {
                        Console.WriteLine(TAG + String.Format("WARNING: requested to terminate with {0} events left in queue.", getQueuedEventCount()));
                    }

                    if (directorNodeService != null)
                    {
                        while (!directorNodeService.localNodeCanTerminate)
                        {
                            processControlMessages();
                        }
                    }
                    return;



                case NodeExecutionState.DoTerminate:
                    if (getQueuedEventCount() > 0)
                    {
                        Console.WriteLine(TAG + String.Format("WARNING: requested to terminate with {0} events left in queue.", getQueuedEventCount()));
                    }
                    return;
                }
            }
        }
예제 #2
0
 public ExperimentRunNodeDataMessage(NodeName sendingNode, ExperimentRunData nodeData) : base(sendingNode)
 {
     this.nodeData = nodeData;
 }