public override void Process(K key, V value) { if (key == null || value == null) { log.Warn($"Skipping record due to null key or value. key=[{key}] value=[{value}] topic=[{Context.Topic}] partition=[{Context.Partition}] offset=[{Context.Offset}]"); return; } ValueAndTimestamp <T> oldAggAndTimestamp = store.Get(key); T oldAgg, newAgg; long newTimestamp; if (oldAggAndTimestamp == null) { oldAgg = initializer.Apply(); newTimestamp = Context.Timestamp; } else { oldAgg = oldAggAndTimestamp.Value; newTimestamp = Math.Max(Context.Timestamp, oldAggAndTimestamp.Timestamp); } newAgg = aggregator.Apply(key, value, oldAgg); store.Put(key, ValueAndTimestamp <T> .Make(newAgg, newTimestamp)); tupleForwarder.MaybeForward(key, newAgg, sendOldValues ? oldAgg : default, newTimestamp);
/// <summary> /// Конструктор, использующийся для инициализации WebMoneyAccessor ключом Keeper Classic /// </summary> public WebMoneyAccessor() { var wmAccountDictionary = WebMoneyUtil.Instance.GetWmAccountSettings(); if (wmAccountDictionary == null) { Logger.Error("WebMoneyAccessor() - не удалось прочитать необходимые для инициализировать WebMoney параметры (wmId, purseNumber и др.)"); return; } keeperKeyValue = wmAccountDictionary["WmKeeperKeyValue"].ToString(); targetPurseNumber = (ulong)wmAccountDictionary["WmTargetPurseNumber"]; wmId = (WmId)(ulong)wmAccountDictionary["WmId"]; var targetPurseType = WebMoneyUtil.StrToCurrency(wmAccountDictionary["WmPurseCurrency"].ToString()); purse = new Purse { Number = targetPurseNumber, Type = targetPurseType }; var keeperKey = new KeeperKey(keeperKeyValue); initializer = new Initializer(wmId, keeperKey) { StartDate = new DateTime(1983, 1, 1).ToUniversalTime() }; initializer.Apply(); wmServerTimeDifference = (WmDateTime.ServerTime2UtcTime(DateTime.Now).Hour - DateTime.Now.ToUniversalTime().Hour); }
public override void Process(K key, Change <V> value) { if (key == null) { throw new StreamsException($"Record key for KTable aggregate operator with state {queryableStoreName} should not be null."); } ValueAndTimestamp <T> oldAggAndTimestamp = store.Get(key); T oldAgg = oldAggAndTimestamp != null ? oldAggAndTimestamp.Value : default; T intermediateAgg; long newTimestamp = Context.Timestamp; // first try to remove the old value if (oldAggAndTimestamp != null && value.OldValue != null && oldAgg != null) { intermediateAgg = remove.Apply(key, value.OldValue, oldAgg); newTimestamp = Math.Max(Context.Timestamp, oldAggAndTimestamp.Timestamp); } else { intermediateAgg = oldAgg; } // then try to add the new value T newAgg; if (value.NewValue != null) { T initializedAgg; if (intermediateAgg == null) { initializedAgg = initializer.Apply(); } else { initializedAgg = intermediateAgg; } newAgg = add.Apply(key, value.NewValue, initializedAgg); if (oldAggAndTimestamp != null) { newTimestamp = Math.Max(Context.Timestamp, oldAggAndTimestamp.Timestamp); } } else { newAgg = intermediateAgg; } // update the store with the new value store.Put(key, ValueAndTimestamp <T> .Make(newAgg, newTimestamp)); tupleForwarder.MaybeForward(key, newAgg, sendOldValues ? oldAgg : default, newTimestamp);
public override void Process(K key, V value) { if (key == null) { log.LogWarning($"Skipping record due to null key.value =[{value}] topic =[{Context.RecordContext.Topic}] partition =[{Context.RecordContext.Partition}] offset =[{Context.RecordContext.Offset }]"); droppedRecordsSensor.Record(); return; } observedStreamTime = Math.Max(observedStreamTime, Context.Timestamp); long closeTime = observedStreamTime - windowOptions.GracePeriodMs; var matchedWindows = windowOptions.WindowsFor(Context.Timestamp); foreach (var entry in matchedWindows) { long windowStart = entry.Key, windowEnd = entry.Value.EndMs; if (windowEnd > closeTime) { var oldAggAndTimestamp = windowStore.Fetch(key, windowStart); Agg oldAgg = oldAggAndTimestamp == null ? default : oldAggAndTimestamp.Value; long newTs; Agg newAgg; if (oldAggAndTimestamp == null) { oldAgg = initializer.Apply(); newTs = Context.Timestamp; } else { newTs = Math.Max(Context.Timestamp, oldAggAndTimestamp.Timestamp); } newAgg = aggregator.Apply(key, value, oldAgg); windowStore.Put(key, ValueAndTimestamp <Agg> .Make(newAgg, newTs), windowStart); tupleForwarder.MaybeForward(new Windowed <K>(key, entry.Value), newAgg, sendOldValues ? oldAgg : default, newTs);