截取类java中的静态变量

截取类java中的静态变量,java,jakarta-ee,static,ejb,interceptor,Java,Jakarta Ee,Static,Ejb,Interceptor,我有一个很明显的问题,虽然我不知道如何解决它。 我有两个类,其中一个是拦截器 @Stateless @Interceptors(AutoId.class) public class TestClass { private static final Logger LOG = Logger.getLogger(RepositoryBean.class.getName()); public void executeUpdate(){ int k=0;

我有一个很明显的问题,虽然我不知道如何解决它。 我有两个类,其中一个是拦截器

@Stateless
@Interceptors(AutoId.class)
public class TestClass {
    private static final Logger LOG = Logger.getLogger(RepositoryBean.class.getName());

    public void executeUpdate(){
        int k=0;
        for (int i = 0; i < 1000000; i++) {
            for (int j = 0; j < 100000; j++) {
                for (int r = 0; r < 1000000; r++) {
                     k = 1;
                }
            }
        }
        getLogger().log(Level.INFO, "Current time some time ago was "+AutoId.MyTime/1000);
        }
    private Logger getLogger() {
        return Logger.getLogger(getClass().getCanonicalName());
    }} 
一个明显的问题是,如果我在glassfish服务器上部署这个应用程序时运行它,然后在几秒钟内运行它的另一个副本,它将用新的时间重写MyTime变量,因此,两个程序将同时打印。 其中一个显而易见的解决方案是在executeUpdate中创建一个变量,这将节省MyTime的价值,但这对我正在进行的实际项目并不好

有人告诉我,我可能想用ContextResolver和@Context做点什么。 我该怎么解决这个问题呢? 谢谢

编辑 我找到了一个解决方案,尽管我认为它不是最好的

public class AutoId {        
    private static Long[] MyTime = new Long[1000];

    @AroundInvoke
    public Object addLog(InvocationContext context) throws Exception {
        MyTime[(int)Thread.currentThread().getId()]= System.currentTimeMillis();    
        return context.proceed();    
    }

    public static Long MyTime(){
    return MyTime[(int)Thread.currentThread().getId()];
    }
}
以与过程相同的方式命名数组,只需在AutoId.MyTime->AutoId.MyTime之后添加,就可以最小化主类中的代码更改

这仍然不是最好的主意,尽管它不再导致重写变量

EDIT2请不要介意executeUpdate过程中的所有代码。它只是以一种需要一些时间才能完成工作的方式编写的,这样我就可以再执行一个副本并打印出AutoId.MyTime。这个变量的值是唯一重要的


而且很明显,如果我没有使用Interceptor,只是在类中创建了一个AutoId变量,以便在任何其他过程之前调用它,那么该错误的Interceptor就不会出现,因为程序的每个副本都很容易有自己的id—但这不是选项。在执行任何程序之前,此处需要拦截器进行自动执行。希望这能解释我以前没有说过的一切:

您可以使用@products创建记录器,然后使用@Inject在类和拦截器中注入记录器。这样,您应该记录不同的时间。

您可能误解了我的意思。记录器没有问题。由于MyTime变量是静态的,每个人都可以访问它,因此它会被其他线程重写?你不能用incterceptor方法简单地打印出来吗?在这个大项目中,有一个ID,稍后需要用来创建SQL语句,这个ID是你在尝试登录后在拦截器中得到的,这是我在普通拦截器中得到的。若登录失败,它将不返回任何内容,只返回一个错误,否则它会将用户ID写入该变量和另外3个变量。拦截器必须返回context.continue,这样我就不能只返回变量了。我希望这足够清楚:我认为您在拦截器功能中混合了一点业务逻辑。您在业务方法中获取此ID的方式是否真的可能与调用静态拦截器字段的方式不同?例如,从DB、会话中检索?我的意思是,您可以在拦截器中按原样执行授权,但我想问的是,是否有一个选项可以以不同的方式检索此ID?问题是,有很多方法可以执行某些操作,它们都需要授权,将授权与每一个都放在一起是可能的,但那会把大部分已经写好的东西弄糟不是我写的,是别人写的。就是这样,我的目标是以尽可能小的牺牲来修正错误。我找到了一个解决方案,它在编辑块中。另一种方法是在自动化后立即存储变量,但如果同时发生两个调用,这可能不起作用。
public class AutoId {        
    private static Long[] MyTime = new Long[1000];

    @AroundInvoke
    public Object addLog(InvocationContext context) throws Exception {
        MyTime[(int)Thread.currentThread().getId()]= System.currentTimeMillis();    
        return context.proceed();    
    }

    public static Long MyTime(){
    return MyTime[(int)Thread.currentThread().getId()];
    }
}