gpt4 book ai didi

java - 在 OSGi 中,被跟踪的服务类型和被跟踪对象的类型有什么区别

转载 作者:行者123 更新时间:2023-11-29 07:32:21 25 4
gpt4 key购买 nike

在 OSGi 类中 ServiceTracker定义了两个类型参数:

  1. S - 被跟踪的服务类型。
  2. T - 跟踪对象的类型。

这两者有什么区别?

最佳答案

在几乎所有情况下,我都使用服务跟踪器,我需要做一些与跟踪对象相关的内务处理。当被跟踪的对象消失时,该管理信息应该被垃圾收集。

例如,您跟踪 WhiteboardListeners。但是,您想要跟踪他们使用了多长时间的回叫,并在他们使用太多时间时拒绝为他们提供服务。所以我们创建一个包装器:

public class Example {

interface Whiteboard {
void visit();
}

static class Wrapper {
Whiteboard whiteboard;
AtomicLong averageTime = new AtomicLong();

public Wrapper(Whiteboard whiteboard) {
this.whiteboard = whiteboard;
}

void visit() {
if (averageTime.get() < 100) {
long start = System.currentTimeMillis();
whiteboard.visit();
long time = System.currentTimeMillis() - start;
averageTime.getAndUpdate(v -> (99 * v + time) / 100);
} else
averageTime.getAndUpdate(v -> (99 * v) / 100);
}
}

ServiceTracker<Whiteboard, Wrapper> tracker;

@Activate
void activate(BundleContext context) {
tracker = new ServiceTracker<Whiteboard, Wrapper>(context,
Whiteboard.class, null) {
@Override
public Wrapper addingService(
ServiceReference<Whiteboard> reference) {
return new Wrapper(context.getService(reference));
}

@Override
public void removedService(ServiceReference<Whiteboard> reference,
Wrapper service) {
context.ungetService(reference);
}
};
tracker.open();
}

void visit() {
tracker.getTracked().values().forEach(wrapper -> wrapper.visit());
}
}

我现在很少使用 Service Tracker,因为在大多数情况下,声明式服务可以更轻松地完成这项工作。但是,当我使用 Service Tracker 时,我很少有 S==T

关于java - 在 OSGi 中,被跟踪的服务类型和被跟踪对象的类型有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40374827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com