【问题标题】:Java variable values persist in memory after responding to a requestJava 变量值在响应请求后保留在内存中
【发布时间】:2021-04-05 13:09:24
【问题描述】:

我将使用this docker 映像部署一个Java 应用程序。我试图消除即使在生成响应后变量值仍然存在的问题。我的假设是每个请求都有一个隔离的环境,但我不确定是否正确。

例如,下面给定的代码块会将给定的 URL 参数添加到一个虚拟列表中。

@Path("/hello")
public class GreetingResource {

    private final List<String> dummyList = new ArrayList<>();

    @GET
    @Path("/{param}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response hello(@PathParam("param") String param) throws InterruptedException {
        dummyList.add(param);
        
        return Response.ok(dummyList.toString()).build();
    }
}

如果你像这样卷曲端点两次:

/hello/client1
/hello/client2

我的期望是收到:

[client1]
[client2]

但实际上我得到的是:

[client1]
[client1, client2]

这会让我有点担心并发会话,问题是我该如何解决它。

【问题讨论】:

    标签: java resteasy quarkus


    【解决方案1】:

    这就是为什么:

    private final List<String> dummyList = new ArrayList<>();
    

    根据经验:Never keep instance variables 在服务类中。尽可能使用 DTO 和值对象来维护状态。在构建面向服务的架构中,你所拥有的东西是一个很大的禁忌。

    对于这种场景,Quarkus 将服务类 (GreetingResources) 的范围默认为单例范围,这意味着将使用单个实例来服务所有请求。

    您可以通过在配置中配置 quarkus.resteasy.singleton-resources 属性来更改此行为。

    【讨论】:

      【解决方案2】:

      如果你想在每次方法调用后都有一个干净的响应,你可以尝试在方法中声明 arraylist。

      @GET
      @Path("/{param}")
      @Produces(MediaType.APPLICATION_JSON)
      public Response hello(@PathParam("param") String param) throws InterruptedException {
          List<String> dummyList = new ArrayList<>();
          dummyList.add(param);
          
          return Response.ok(dummyList.toString()).build();
      }
      

      【讨论】:

        【解决方案3】:

        您有一个 GreetingResource 类(单例)实例来处理您的所有请求。他们将共享您在类中定义的实例变量,例如 f.x。 dummyList.

        如果您需要具有范围请求的东西,您可以注入一个具有范围请求的 bean,例如 f.x。

        @Bean
        @RequestScope
        public HelloMessageGenerator requestScopedBean() {
            return new HelloMessageGenerator();
        }
        

        这个例子来自https://www.baeldung.com/spring-bean-scopes

        如果这对您有用,您可能希望将 dummyList 移动到您的 hello 方法中。

        如果这不能解决您的问题,如果您能向我们提供一些关于您为什么需要这个 dummyList 变量的信息将会很有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-03
          • 2012-07-18
          • 2020-08-07
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          相关资源
          最近更新 更多