/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <param name="memento"></param> /// <returns></returns> public byte[] Call(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_taskCloseCoordinator.ShouldCloseTask() && controlMessage != MapControlMessage.Stop) { if (_invokeGC) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive()) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { _dataReducer.Send(_mapTask.Map(mapInput.Message)); } } } _taskCloseCoordinator.SignalTaskStopped(); return(null); }
/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <returns></returns> protected override byte[] TaskBody(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop) { if (_invokeGc) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource)) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { TMapOutput output = default(TMapOutput); try { output = _mapTask.Map(mapInput.Message); } catch (Exception e) { HandleTaskAppException(e); } _dataReducer.Send(output, _cancellationSource); } } } return(null); }
/// <summary> /// Performs IMRU iterations on map side /// </summary> /// <param name="memento"></param> /// <returns></returns> public byte[] Call(byte[] memento) { MapControlMessage controlMessage = MapControlMessage.AnotherRound; while (!_cancellationSource.IsCancellationRequested && controlMessage != MapControlMessage.Stop) { if (_invokeGC) { Logger.Log(Level.Verbose, "Calling Garbage Collector"); GC.Collect(); GC.WaitForPendingFinalizers(); } try { using ( MapInputWithControlMessage <TMapInput> mapInput = _dataAndMessageReceiver.Receive(_cancellationSource)) { controlMessage = mapInput.ControlMessage; if (controlMessage != MapControlMessage.Stop) { _dataReducer.Send(_mapTask.Map(mapInput.Message), _cancellationSource); } } } catch (OperationCanceledException e) { Logger.Log(Level.Warning, "Received OperationCanceledException in MapTaskHost with message: {0}.", e.Message); break; } catch (IOException e) { Logger.Log(Level.Error, "Received IOException in MapTaskHost with message: {0}.", e.Message); if (!_cancellationSource.IsCancellationRequested) { throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError); } break; } catch (TcpClientConnectionException e) { Logger.Log(Level.Error, "Received TcpClientConnectionException in MapTaskHost with message: {0}.", e.Message); if (!_cancellationSource.IsCancellationRequested) { throw new IMRUTaskGroupCommunicationException(TaskManager.TaskGroupCommunicationError); } break; } } _taskCloseCoordinator.SignalTaskStopped(); Logger.Log(Level.Info, "MapTaskHost returned with cancellation token:{0}.", _cancellationSource.IsCancellationRequested); return(null); }
/// <summary> /// Reads message asynchronously from reader /// </summary> /// <param name="reader">reader from which to read the message</param> /// <param name="token">Cancellation token</param> /// <returns>Read message</returns> async Task <MapInputWithControlMessage <TMapInput> > IStreamingCodec <MapInputWithControlMessage <TMapInput> > .ReadAsync( IDataReader reader, CancellationToken token) { byte[] messageType = new byte[1]; await reader.ReadAsync(messageType, 0, 1, token); MapControlMessage controlMessage = MapControlMessage.AnotherRound; switch (messageType[0]) { case 0: controlMessage = MapControlMessage.AnotherRound; TMapInput message = await _baseCodec.ReadAsync(reader, token); return(new MapInputWithControlMessage <TMapInput>(message, controlMessage)); case 1: controlMessage = MapControlMessage.Stop; return(new MapInputWithControlMessage <TMapInput>(controlMessage)); } Exceptions.Throw(new Exception("Control message type not valis in Codec read"), Logger); return(null); }
/// <summary> /// Internal constructor /// </summary> /// <param name="input">Actual map input</param> /// <param name="controlMessage">Control message from Update Function</param> internal MapInputWithControlMessage(TMapInput input, MapControlMessage controlMessage) { Message = input; ControlMessage = controlMessage; }
/// <summary> /// Internal constructor /// </summary> /// <param name="controlMessage">Control message from Update Function</param> internal MapInputWithControlMessage(MapControlMessage controlMessage) { ControlMessage = controlMessage; }