加载启动和泽西岛

时间:2015-03-07 17:27:10

标签: java tomcat servlets jersey jax-rs

可能是Servlet not loading on startup的副本,但是我还没有发表评论,所以我必须为此开始一个新的问题......

相同的设置,使用Jersey和Tomcat的servlet,使用load-on-startup来加载容器。 但是,由于上面提到的线程,我知道这只加载Jersey容器,但不加载我为servlet设置的类。

因此,与上述线程的答案中隐含的内容相关,如何完成不仅包含在启动时加载,还包括使用@Path注释的类(例如,它将从数据库加载数据)在记忆中。)

@Singleton
@Path( "156846986" )
public class SearchEngine {

    @Inject
    private DatabaseService dbService;

    @Inject
    private PatriciaTrieEngine trieEngine;
}

,例如:

@Singleton
@Path( "3455470640" )
public class PatriciaTrieEngine {

@Inject
DatabaseService dbService;
private PatriciaTrie< Object > patriciaTrie;

@PostConstruct
public void init( ) throws SQLException {

    ...some code initializing the trie by loading data from a database u using dbService
}

}

最后,像SearchService这样的一些类具有请求的端点:

@Path( "/search" )
@Produces( "application/json" )
public class SearchService {

    @Inject
    private DatabaseService dbService;
    @Inject
    private SearchEngine    engine;

    @GET
    @Path( "/candidates" )
    public Response getCandidates(@QueryParam( "query" ) final String input) throws UnsupportedEncodingException {

    use Patricia trie via SearchEngine in order to find candidates for given query

    return Response.ok().entity( candidates ).build();
}

}

最终应该在启动时加载PatriciaTrie,因为需要几分钟才能将数据加载到trie中。

1 个答案:

答案 0 :(得分:2)

默认行为是为每个请求实例化一个新的资源类实例。在这种情况下,没有预期需要在启动时加载。如果您想要这种行为,那么您的资源类需要是一个单例,这意味着只为整个应用程序创建了一个实例。如果你这样做,那么你负责使类线程安全。

在Jersey 1中,您可以使用@Singleton注释使该类成为单例,如上所述here。这也会在启动时加载课程。在Jersey 2中,@Singleton注释将使资源类成为单例,但在启动时不会加载。为此,您可以改为使用@Immediate注释,如here

所示

除此之外,仅从您的描述中,我觉得可能需要修复设计。如果没有看到一些您正在尝试做的代码,真的无法告诉我们。