@PostConstruct与Jersey 1.17,Weblogic一起使用

时间:2014-12-05 14:03:12

标签: java java-ee jersey weblogic jax-rs

我使用Jersey将一些统计数据公开为REST服务。 我正在使用Weblogic

但每次执行请求获取统计信息时 System.out.println(“在PostConstruct中”);被称为。

即使我在@Stateless路径旁边注释,也会发生这种情况。

这就像在每个请求(req范围)

上实例化StorageService一样

有没有办法让初始化只调用一次并避免在每个请求上创建StorageService?

@Path("/statistics")
public class StorageService {

    @Context
    private ServletContext application;

    StatisticsStorage statisticsStorage;

    @PostConstruct
    public void initialize() {
        System.out.println("In PostConstruct");
        try {
            statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString()));
        } catch (Exception sqle) {
            sqle.printStackTrace();
        }
    }


    @GET
    // The Java method will produce content identified by the MIME Media type "text/plain"
    @Produces({MediaType.APPLICATION_JSON})
    public Domain getSnapshot() {}

由于

2 个答案:

答案 0 :(得分:2)

Jersey在每个请求上实例化该类。请注意,您可以使用@Context注释的大多数内容都是特定于请求的。您最好的办法是将StatisticsStorage字段设置为静态,并在第一次请求时初始化它(需要同步)。也许是这样的:

public StorageService(@Context ServletContext application) {
    super(servletConfig, request, httpServletRequest, uriInfo, httpHeaders, securityContext);
    synchronized (this.getClass()) {
        if (statisticsStorage == null) {
            try {
                statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString()));
            } catch (Exception sqle) {
                sqle.printStackTrace();
            }
        }
    }
}
static StatisticsStorage statisticsStorage;

答案 1 :(得分:1)

默认"范围" JAX-RS资源类是按请求范围。我们也可以将该类注册为单例。不同的JAX-RS实现可能有不同的方式来实现。例如,Apache Wink有一个@Scope(ScopeType.SINGLETON)。但唯一可移植的方法是使用javax.ws.rs.core.Application子类。类似的东西:

@ApplicationPath("/api")
public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
    }
    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<>();
        singletons.add(new StorageService());
        return singletons;
    }
}

getClasses()中返回的所有内容都是每个请求资源。并且getSingletons()将返回&#34;应用程序范围&#34;的资源。 Jersey永远不会尝试实例化类,所以我们可以自己处理所有的初始化。

另一方面,你可能要考虑,如果让这个班级成为你想要的单身人士。通过这样做,它将导致资源类是有状态的,您将需要处理任何并发问题。

如果您想在@PostConstruct中创建StatisticsStorage,那么可能更好的选择是使用注入框架,例如Guice。这是good Guice example(s)。或EE的CDI