加载启动和 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
除此之外,仅根据您的描述,在我看来这可能需要修复设计。如果没有看到您要执行的操作的一些代码,就无法真正分辨出来。
可能与 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
除此之外,仅根据您的描述,在我看来这可能需要修复设计。如果没有看到您要执行的操作的一些代码,就无法真正分辨出来。