Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.kafka.streams.state.internals;
import static org.apache.kafka.streams.processor.internals.metrics.StreamsMetricsImpl.maybeMeasureLatency;
import org.apache.kafka.common.serialization.Serde;
import org.apache.kafka.common.utils.Bytes;
import org.apache.kafka.common.utils.Time;
import org.apache.kafka.streams.errors.ProcessorStateException;
import org.apache.kafka.streams.state.KeyValueStore;
import org.apache.kafka.streams.state.TimestampedKeyValueStore;
import org.apache.kafka.streams.state.ValueAndTimestamp;
/**
* A Metered {@link TimestampedKeyValueStore} wrapper that is used for recording operation metrics, and hence its
* inner KeyValueStore implementation do not need to provide its own metrics collecting functionality.
* The inner {@link KeyValueStore} of this class is of type <Bytes,byte[]>, hence we use {@link Serde}s
* to convert from <K,ValueAndTimestamp<V>> to <Bytes,byte[]>
* @param
* @param
*/
public class MeteredTimestampedKeyValueStore
extends MeteredKeyValueStore>
implements TimestampedKeyValueStore {
MeteredTimestampedKeyValueStore(final KeyValueStore inner,
final String metricScope,
final Time time,
final Serde keySerde,
final Serde> valueSerde) {
super(inner, metricScope, time, keySerde, valueSerde);
}
@SuppressWarnings("unchecked")
@Override
protected Serde> prepareValueSerdeForStore(final Serde> valueSerde, final Serde contextKeySerde, final Serde contextValueSerde) {
if (valueSerde == null) {
return new ValueAndTimestampSerde<>((Serde) contextValueSerde);
} else {
return super.prepareValueSerdeForStore(valueSerde, contextKeySerde, contextValueSerde);
}
}
public RawAndDeserializedValue getWithBinary(final K key) {
try {
return maybeMeasureLatency(() -> {
final byte[] serializedValue = wrapped().get(keyBytes(key));
return new RawAndDeserializedValue(serializedValue, outerValue(serializedValue));
}, time, getSensor);
} catch (final ProcessorStateException e) {
final String message = String.format(e.getMessage(), key);
throw new ProcessorStateException(message, e);
}
}
public boolean putIfDifferentValues(final K key,
final ValueAndTimestamp newValue,
final byte[] oldSerializedValue) {
try {
return maybeMeasureLatency(
() -> {
final byte[] newSerializedValue = serdes.rawValue(newValue);
if (ValueAndTimestampSerializer.valuesAreSameAndTimeIsIncreasing(oldSerializedValue, newSerializedValue)) {
return false;
} else {
wrapped().put(keyBytes(key), newSerializedValue);
return true;
}
},
time,
putSensor
);
} catch (final ProcessorStateException e) {
final String message = String.format(e.getMessage(), key, newValue);
throw new ProcessorStateException(message, e);
}
}
public static class RawAndDeserializedValue {
public final byte[] serializedValue;
public final ValueAndTimestamp value;
public RawAndDeserializedValue(final byte[] serializedValue, final ValueAndTimestamp value) {
this.serializedValue = serializedValue;
this.value = value;
}
}
}