我有带有代码的 REST 端点:
telemetry.getContext().getOperation().setName(insightEvent.getOperationName());
telemetry.trackEvent(insightEvent.name, insightEvent.getProperties(), null);
Telemetry 是 TelemetryClient(该控制器的字段)。
我将 WWW 的见解发布到 API,但是这条线有问题。我的应用程序是多线程运行的,因此有时 INSIGHT_A 更改操作名称,并且在调用 trackEvent 之前 INSIGHT_B 再次更改操作名称。我应该在这两行上实现关键部分吗?或者应该如何修复?
我认为关键部分可以解决这个问题。
synchronized
这样的同步机制可能会引入争用,并可能影响应用程序的性能,尤其是在高度并发的环境中。我修改了代码以使用同步块或类似的机制。
使用同步块:
public class YourController {
private final TelemetryClient telemetry;
// Other constructor and initialization code
public void yourEndpointMethod(InsightEvent insightEvent) {
synchronized (telemetry) {
telemetry.getContext().getOperation().setName(insightEvent.getOperationName());
telemetry.trackEvent(insightEvent.name, insightEvent.getProperties(), null);
}
}
}
我使用Maven等构建工具,添加遥测库的依赖项。
pom.xml:
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>applicationinsights-web</artifactId>
<version>3.4.18</version>
</dependency>
</dependencies>
telemetry
对象用作同步的锁。同步块确保一次只有一个线程可以执行其中的代码。如果性能是一个关键问题,您可能需要考虑其他并发控制机制,例如
ReentrantLock
或使用原子操作。