一尘不染

在启动和Jersey上加载

tomcat

可能在启动时未加载Servlet的重复项,但是我还没有评论,所以我必须为此提出一个新问题…

相同的设置,有一个使用Jersey和Tomcat的servlet,并使用启动时加载来加载容器。但是,由于上面提到的线程,我知道这只会加载Jersey容器,而不加载我为servlet设置的类。

因此,与上述线程的答案中所隐含的内容有关,如何做到的是,不仅在启动时加载了包含的内容,而且还添加了用@Path注释的我的类(例如,它将从内存中的DB加载数据)

@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需要花费几分钟。


阅读 332

收藏
2020-06-16

共1个答案

一尘不染

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

在泽西1,可以使类与一个单身@Singleton注释,提到这里。这也将在启动时加载该类。在Jersey
2中,@Singleton注释将使资源类成为单例,但在启动时不会加载。

除此之外,仅从您的描述来看,这对我来说似乎是需要修复设计的需求。如果看不到要尝试执行的代码,就无法真正分辨。

2020-06-16