加载启动和 Jersey

load on startup and Jersey

可能与 Servlet not loading on startup 重复,但我还不允许发表评论,所以我必须为此开始一个新问题...

相同的设置,使用 Jersey 和 Tomcat 的 servlet,使用启动时加载来加载容器。 但是,由于上面提到的线程,我知道这只会加载 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 中需要几分钟时间。

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

在 Jersey 1 中,您可以使用 @Singleton 注释将 class 设为单例,如前所述 here. This will also load the class on start up. In Jersey 2, the @Singleton annotation will make the resource class a singleton, but it will not load on start up. For that, you can instead use the @Immediate annotation, as seen

除此之外,仅根据您的描述,在我看来这可能需要修复设计。如果没有看到您要执行的操作的一些代码,就无法真正分辨出来。