Microsoft Insight Java 设置操作名称 Singleton

问题描述 投票:0回答:1

我有带有代码的 REST 端点:

telemetry.getContext().getOperation().setName(insightEvent.getOperationName());
telemetry.trackEvent(insightEvent.name, insightEvent.getProperties(), null);

Telemetry 是 TelemetryClient(该控制器的字段)。

我将 WWW 的见解发布到 API,但是这条线有问题。我的应用程序是多线程运行的,因此有时 INSIGHT_A 更改操作名称,并且在调用 trackEvent 之前 INSIGHT_B 再次更改操作名称。我应该在这两行上实现关键部分吗?或者应该如何修复?

我认为关键部分可以解决这个问题。

java spring-boot azure-application-insights
1个回答
0
投票
  • 使用像
    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
    对象用作同步的锁。同步块确保一次只有一个线程可以执行其中的代码。

enter image description here

如果性能是一个关键问题,您可能需要考虑其他并发控制机制,例如

ReentrantLock
或使用原子操作。

© www.soinside.com 2019 - 2024. All rights reserved.