如何在Spring应用程序中使用每个线程但可重用的对象(PubNub)?

pup*_*eno 7 spring pubnub spring-boot

我正在Spring Boot应用程序中连接到PubNub.从文档中,可以重用PubNub对象,但每个线程最好有一个.在Spring Boot中每个线程存储和检索一个对象的适当方法是什么?

Ser*_*eyB 7

这是你在Spring中为每个线程存储和检索一个对象的方法ThreadLocal,这个例子基于Spring自己的ThreadLocalSecurityContextHolderStrategy,用于存储SecurityContext每个线程.

另外,看一下InheritableThreadLocal,特别是如果你的代码旋转了新的线程,例如Spring的@Async注释,它有机制在创建子线程时传播现有的或创建新的线程局部值.

import org.springframework.util.Assert;

final class ThreadLocalPubNubHolder {

    private static final ThreadLocal<PubNub> contextHolder = new ThreadLocal<PubNub>();

    public void clearContext() {
        contextHolder.remove();
    }

    public PubNub getContext() {
        PubNub ctx = contextHolder.get();

        if (ctx == null) {
            ctx = createEmptyContext();
            contextHolder.set(ctx);
        }

        return ctx;
    }

    public void setContext(PubNub context) {
        Assert.notNull(context, "Only non-null PubNub instances are permitted");
        contextHolder.set(context);
    }

    public PubNub createEmptyContext() {
        // TODO - insert code for creating a new PubNub object here
        return new PubNubImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)