public void sendResult() { if (this.result == null) { return; } // Writing on log throgh the output operator if (String.Compare(this.op_url, this.output_op[0]) == 0) { writeLog(this.op_id, this.type, this.op_url, "RESULT <" + result.ToString() + ">"); } else { RemoteOperator output_op = (RemoteOperator)Activator.GetObject(typeof(RemoteOperator), this.output_op[0]); RemoteAsyncDelegateLog RemoteDelOutput = new RemoteAsyncDelegateLog(output_op.writeLog); IAsyncResult RemArOutput = RemoteDelOutput.BeginInvoke(this.op_id, this.type, this.op_url, "RESULT <" + result.ToString() + ">", null, null); } Console.WriteLine("RESULT <" + result.ToString() + ">;\r\n"); if (this.outputSources == null) { return; } IDictionary options = new Hashtable(); options["name"] = this.type + "output" + (new Random()).Next(0, 10000);; TcpChannel channel = new TcpChannel(options, null, null); ChannelServices.RegisterChannel(channel, true); String firstOp = this.getRoutingOperator(); RemoteOperator outputOperator = (RemoteOperator)Activator.GetObject(typeof(RemoteOperator), firstOp); RemoteAsyncDelegateTuple RemoteDel = new RemoteAsyncDelegateTuple(outputOperator.receiveInput); if (!semantic.Equals("at-most-once")) // semantic at-least-once, exactly-once { IAsyncResult RemAr = RemoteDel.BeginInvoke(this.result, AsyncCallBackOperator, this.result); } else // semantic at-most-once { IAsyncResult RemAr = RemoteDel.BeginInvoke(this.result, null, null); } //RemoteDel.EndInvoke(RemAr); if (isFullLog) // Is full log, must send result to PuppetMaster { RemotePM pm = (RemotePM)Activator.GetObject(typeof(RemotePM), "tcp://localhost:10001/RemotePM"); string[] resultArray = { op_id, type, result.ToString() }; pm.receiveResult(resultArray); } ChannelServices.UnregisterChannel(channel); }
public void AsyncCallBackOperator(IAsyncResult ar) { try { RemoteAsyncDelegateTuple del = (RemoteAsyncDelegateTuple)((AsyncResult)ar).AsyncDelegate; del.EndInvoke(ar); }catch { buildWorkingOps(); if (workingOutputSources != null) { TrySend: Console.WriteLine("FALLBACK"); if (this.workingOutputSources.Count > 0) { string nextOp = workingOutputSources[0]; try { RemoteOperator outputOperator = (RemoteOperator)Activator.GetObject(typeof(RemoteOperator), nextOp); RemoteAsyncDelegateTuple RemoteDel = new RemoteAsyncDelegateTuple(outputOperator.receiveInput); Console.WriteLine("SENDING CALLBACK - Result: " + result); IAsyncResult RemAr = RemoteDel.BeginInvoke(this.result, null, null); RemoteDel.EndInvoke(RemAr); writeLog(this.op_id, this.type, this.op_url, "RESULT <" + result.ToString() + ">"); } catch (Exception e1) { this.workingOutputSources.RemoveAt(0); goto TrySend; } } } } return; }
public override void doOperation(Tuple input) { if (parameters.Length == 1) { int fieldNumber; if (Int32.TryParse(parameters[0], out fieldNumber)) { int uniqueCounter = 0; this.tupleList.Add(input); foreach (Tuple t in this.tupleList) { if (t.getField(fieldNumber).Equals(input.getField(fieldNumber))) { uniqueCounter++; } if (uniqueCounter > 1) { return; } } result = input; for (int i = 0; i < replicas_url.Length; i++) { if (String.Compare(op_url, replicas_url[i]) != 0) { Uniq count_op = (Uniq)Activator.GetObject(typeof(Uniq), replicas_url[i]); RemoteAsyncDelegateTuple RemoteDel = new RemoteAsyncDelegateTuple(count_op.updateUniq); IAsyncResult RemAr = RemoteDel.BeginInvoke(result, null, null); } } } else { throw new Exception("Invalid Argument Type"); } } else { throw new Exception("Invalid Argument Count"); } }