Aggregate functions 跨Apache Pulsar函数访问状态

Aggregate functions 跨Apache Pulsar函数访问状态,aggregate-functions,apache-pulsar,Aggregate Functions,Apache Pulsar,我希望有一个函数聚合事件并在bookkeeper中维护状态,同时允许处理不同事件的其他函数利用该状态(通过键访问,或通过键范围查找状态) 我无法通过上下文对象找到任何方法,有其他方法吗?您可以利用 /** * Update the state value for the key. * * @param key name of the key * @param value state value of the key */ void putState(String key, Byte

我希望有一个函数聚合事件并在bookkeeper中维护状态,同时允许处理不同事件的其他函数利用该状态(通过键访问,或通过键范围查找状态)

我无法通过上下文对象找到任何方法,有其他方法吗?

您可以利用

/**
 * Update the state value for the key.
 *
 * @param key   name of the key
 * @param value state value of the key
 */
void putState(String key, ByteBuffer value);

只要在函数之间协调要使用的键,就可以使用的方法来完成此操作。聚合函数将使用putState方法和预定义键执行计算并存储数据,如下所示:

public class AggregateFunction implements Function<String, Void> {
@Override
public Void process(String input, Context context) {
    ByteBuffer value;
    // Calculate value and place in ByteBuffer
    context.putState("PRE-DETERMINED-KEY", value);
}
公共类聚合函数实现函数{
@凌驾
公共无效进程(字符串输入、上下文){
ByteBuffer值;
//计算值并放入ByteBuffer
上下文。putState(“预先确定的键”,值);
}
}

然后,消费函数可以像这样访问该值

public class ConsumingFunction implements Function<String, String> {
@Override
public String process(String input, Context context) {
    ByteBuffer value = context.gettState("PRE-DETERMINED-KEY");
    // Perform logic based on the value.
    return "";
}
公共类ConsumingFunction实现函数{
@凌驾
公共字符串进程(字符串输入、上下文){
ByteBuffer value=context.getState(“预定义键”);
//根据值执行逻辑。
返回“”;
}

}

我认为这不起作用,因为状态的作用域是单个函数-从Pulsar文档:状态是键值对,其中键是字符串,值是任意二进制数据-计数器存储为64位big-endian二进制值。键的作用域是单个Pulsar函数,并在实例之间共享我一直在寻找类似的东西,基本上是一种通过Pulsar直接使用bookkeeper的方法。但这似乎不是真的可能(目前)。如果它不是很多状态,你也许可以将它与消息一起发送,作为其属性的一部分。
public class ConsumingFunction implements Function<String, String> {
@Override
public String process(String input, Context context) {
    ByteBuffer value = context.gettState("PRE-DETERMINED-KEY");
    // Perform logic based on the value.
    return "";
}