Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在泽西岛动态(取消)部署资源_Java_Jersey_Jersey 2.0 - Fatal编程技术网

Java 在泽西岛动态(取消)部署资源

Java 在泽西岛动态(取消)部署资源,java,jersey,jersey-2.0,Java,Jersey,Jersey 2.0,我需要在Jersey ServletContainer中热部署和取消部署资源 似乎没有办法在ResourceConfig上“注销”资源,因此我遵循的路线是用一个新的集合替换所有资源 虽然ResourceConfig上的registerResources会替换所有资源,但浏览源代码似乎与此相矛盾 我找到的解决方案是使用全新的ResourceConfig重新加载ServletContainer Set<Class<?>> classes = ... ResourceConfi

我需要在Jersey ServletContainer中热部署和取消部署资源

似乎没有办法在ResourceConfig上“注销”资源,因此我遵循的路线是用一个新的集合替换所有资源

虽然ResourceConfig上的registerResources会替换所有资源,但浏览源代码似乎与此相矛盾

我找到的解决方案是使用全新的ResourceConfig重新加载ServletContainer

Set<Class<?>> classes = ...
ResourceConfig config = new ResourceConfig(classes);
container.reload(config);
ModelValidationException从WebComponent构造函数抛出。 之后,任何重载调用都会导致OnShutton方法出现异常,这是由ServiceLocatorImpl的preDestroy方法中的checkState引起的

我可以通过忽略验证错误来避免异常

ResourceConfig config = new ResourceConfig(classes);
config.property(ServerProperties.RESOURCE_VALIDATION_IGNORE_ERRORS,
    Boolean.TRUE);
container.reload(config);
但是,现在除了探索日志记录之外,没有办法找出是否有任何错误,这真的很糟糕

根据本文,我尝试将ServletContainer子类化,但类似的情况会出现问题,因为ResourceConfig不能放在两个WebComponent中

我试图在关闭之前创建WebComponent,以便尽早退出,但如果资源中没有错误,则实际重新加载失败(因为创建WebComponent后无法修改resourceconfig)

@覆盖
公共无效重新加载(ResourceConfig配置){
试一试{
新的WebComponent(新的WebServletConfig(此)、配置);
}捕获(ServletException e){
LOGGER.log(严重级别,“重新加载失败”,e);
List resources=Collections.emptyList();
抛出新的ModelValidationException(例如getMessage(),参考资料);
}
超级。重新加载(配置);
}

是否有其他方法可以取消资源部署?有没有办法在重新加载失败后重置ServletContainer?

我认为如果不使用支持热部署的servlet容器,就无法实现这一点。根据我的经验,这样做的一个好方法是使用支持OSGi的容器。你可以看看或者


例如,在OSGi环境中,您可以创建模块(称为捆绑包),这些模块可以放置到扫描的文件夹中以在运行时启用功能,或者从文件夹中删除以禁用某些功能。这类似于Eclipse IDE中插件的工作方式,在Eclipse IDE中,新插件的安装/卸载不一定需要重新启动

从技术上讲,Jersey不是一个servlet容器,它是一个运行在servlet容器上的REST/JaxB框架

大多数可嵌入的servlet容器Tomcat、Jetty和Grizzly允许您在运行时重新部署应用程序和servlet。但是重新部署通常不是在代码中嵌入容器时使用的特性

热重新部署在生产中最有用,允许您不断部署新版本。
在Tomcat上,可以在同一台服务器上部署应用程序的新版本和旧版本,Tomcat确保在应用程序的最新版本上启动新会话,但旧版本将继续使用它们启动时使用的应用程序版本。当应用程序未使用loger时,它将自动取消部署

您可以尝试子类化
ServletContainer
,重写
reload(ResourceConfig)
以捕获
RuntimeException
并记录错误,然后在web.xml中指定您的子类。我同意。这正是模块化Web应用程序的用例。您只需要在OSGi容器中发布您的JAX-RS服务,该服务带有满足预定义接口的@Path注释。Servlet实现(也是一个捆绑包)将找到您的服务并通过HTTP发布。OSGi容器负责在运行时将服务和servlet连接在一起。
ResourceConfig config = new ResourceConfig(classes);
config.property(ServerProperties.RESOURCE_VALIDATION_IGNORE_ERRORS,
    Boolean.TRUE);
container.reload(config);
@Override
public void reload(ResourceConfig configuration) {
    try {
        new WebComponent(new WebServletConfig(this), configuration);
    } catch (ServletException e) {
        LOGGER.log(Level.SEVERE, "Reload failed", e);
        List<ResourceModelIssue> resources = Collections.emptyList();
        throw new ModelValidationException(e.getMessage(), resources);
    }
    super.reload(configuration);
}