如何通过程序关闭WAR/EAR文件?

5
有没有办法以编程方式停止WAR/EAR?
如果在启动/配置过程中出现问题,我需要停止应用程序部署。
如果可能的话,解决方案应该是跨服务器兼容的,因为我们的应用程序必须在JBoss AS 7和Websphere 7/8中运行。
目前,应用程序在JBoss上无法启动,在部署过程中会出现未知错误,并且加载器不会消失。在Websphere上,应用程序虽然会启动,但会从配置中启动一些错误。
似乎尽管我销毁了我的ServerHttpServlet,但我无法销毁Jersey servlet。有什么想法如何实现这一点?
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>Server</display-name>
    <servlet>
        <description></description>
        <display-name>ServerHttpServlet</display-name>
        <servlet-name>ServerHttpServlet</servlet-name>
        <servlet-class>com.transactionservice.service.ServerHttpServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <description></description>
        <servlet-name>Jersey Servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <description></description>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>callers.REST_Application</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Jersey Servlet</servlet-name>
        <url-pattern>/jaxrs/*</url-pattern>     
    </servlet-mapping>

    <listener>
        <listener-class>com.transactionservice.service.ServerServletContext</listener-class>
    </listener>
</web-app>

callers.REST_Application

package callers;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.exictos.callers.DEBUG_CONFIG;
import com.exictos.log4j.LoggerCommon;

public class REST_Application extends Application
{
    private static final LoggerCommon logger = new LoggerCommon(REST_Application.class);

    public REST_Application()
    {
    }

    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = null;
        try
        {
            // The available REST services
            classes = new HashSet<Class<?>>();

            classes.add(API_CALL_REST.class);
            classes.add(API_CALL_REST_ENC.class);
            classes.add(API_CALL_CONFIG.class);
            classes.add(API_CALL_ABOUT.class);
            classes.add(DEBUG_CONFIG.class);
        }
        catch(Exception e)
        {
            logger.error("", e);
        }

        return classes;
    }
}

com.transactionservice.service.ServerServletContext

package com.transactionservice.service;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.exictos.exception.ApplicationLoadingException;

public class ServerServletContext implements ServletContextListener
{
    @Override
    public void contextInitialized(ServletContextEvent aServletContext)
    {
        //THIS IS JUST AS TEST EXAMPLE TO SEE IF WOULD WORK
        throw new RuntimeException(e);
    }


    @Override
    public void contextDestroyed(ServletContextEvent aServletContext)
    {
        System.out.println("------------------");
    }
}

也许你应该更清楚地说明关闭应用程序对你意味着什么:在管理工具中标记为已停止(硬关机),还是只是不接受请求(使用ServletFilter简单)。但是,对我来说,仍然很难识别部署问题。特别是如果您想要可靠地识别所有这些问题。 - Bernd Ebertz
理想情况下,它应该在管理工具中标记为已停止,就像JBoss目前正在发生的那样。 - Gonçalo Cardoso
2个回答

0

通常情况下,如果大多数服务器出现问题,部署将被回滚。但是,如果您仍然想要确保,您可以在初始化代码中使用system.exit语句。


0

请查看JSR-88 - 应用部署。可以在此处找到WebSphere QuickStart 链接。请注意,Wildfly 已删除JSR-88支持

使用cargo也可以以编程方式停止部署。

我不太确定您想要做什么,但我认为正常的方法应该是部署应用程序的人或进程应该验证部署是否成功,并以相同的方式取消部署。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接