【问题标题】:Call a method after jobss started作业开始后调用方法
【发布时间】:2012-09-17 17:46:07
【问题描述】:

您好,我正在使用 struts 2,并且想在服务器启动后调用一个方法。 在服务器启动时,我们可以使用 FILTER DISPATCHER。 我正在使用 jax ws。我正在同一个 jboss 服务器上部署我的 jax 客户端和端点项目。 如何解决这个问题 请帮忙

【问题讨论】:

    标签: jboss struts2 servlet-filters dispatcher


    【解决方案1】:

    您可以实现ServletContextListener 来响应servlet 启动。

    像这样创建你的实现:

    public class SimpleInitializer implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            //Place your startup logic here.
        }
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
        }
    }
    

    然后,将其包含在 web.xml 中,如下所示:

    <listener>
        <display-name>SIMPLE Startup Listener</display-name>
        <listener-class>com.you.init.SimpleInitializer</listener-class>
    </listener>
    

    【讨论】:

    • 当你的服务器启动时,它会通过web.xml中的监听器,并调用它们的contextInitialized()方法,这样你就可以确保你的启动逻辑在服务器启动后立即执行.
    • 这就是 ServletContextListener 的用途——在你将项目部署到 JBoss 之后,JBoss 启动你的项目并调用你的 Listener 类,无论你放在 contextInitialized() 方法中的任何内容都将在服务器启动后调用,并且项目部署后。你试过了吗?
    • 我正在使用 jax ws 。我正在一台 jboss 服务器上部署我的 jax 客户端和服务器。所以我的客户需要在设置一些调用特定方法的数据之前部署服务器项目
    • 您忽略了在服务器上部署 2 个项目的重要细节......在这种情况下,如果您希望您的客户端与您的服务器项目交互,我建议您定期进行“ping”您的服务器直到它启动,如果服务器仍然关闭,则抛出错误,并在一段时间后重试。
    • 只需执行您通常的 Web 服务调用,并在无法连接到您的服务器时捕获网络/io 错误。您可以随意处理错误,例如重试。
    【解决方案2】:

    // 作者 Gaurav Kumar(Skillrock Technology 的 SE)

        try{
        MBeanServerConnection server = (MBeanServerConnection)new InitialContext().lookup("jmx/rmi/RMIAdaptor");
        ObjectName on = new ObjectName("jboss.system:type=Server");
        Object var = server.getAttribute(on, "Started");
        System.out.println(var);
    
            String serverURL = "http://gaurav-compaq-presario-c700-notebook-pc:8080/WServer?wsdl";
            String message = "gaurav";
            HashMap env = new HashMap();
            String[] creds = new String[1];
            creds[0] = message;
            env.put(JMXConnector.CREDENTIALS, creds);
            JMXServiceURL url = new JMXServiceURL(serverURL);
            JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
               // Remember to call jmxc.close() when you are done with server connection.
            MBeanServerConnection server1 = jmxc.getMBeanServerConnection();
              System.out.println(server.getAttribute(new ObjectName("MyDomain:key=property"), "AnAttribute"));
              server.invoke(new ObjectName("MyDomain:key=property"), "doSomething", new Object[0], new String[0]);
        }catch(Exception e){
            System.out.println(e);
        }
    

    【讨论】:

    • 您可以通过在服务器启动时获取服务器信息并从 FilterDispatcher Java File 调用您的特定 Web 服务 URL 来完成此任务。我在以下代码的帮助下完成了相同的场景。
    【解决方案3】:
    MBeanServerConnection server = (MBeanServerConnection)new InitialContext().lookup("jmx/rmi/RMIAdaptor");
    ObjectName on = new ObjectName("jboss.system:type=Server");
    Object var = server.getAttribute(on, "Started");
    System.out.println(**var**);
    

    您可以做的另一件事是运行一个线程并检查过滤器调度程序中var 的值。如果为真,则调用 Web 服务并将数据设置到您的 Servlet 上下文中,否则将线程休眠一段特定的时间。一旦您检索到值,请停止此线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多