Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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_Eclipse_Tomcat_Initialization_Servletcontextlistener - Fatal编程技术网

如何使用上下文侦听器使Java类在启动时运行,而不影响其他计划任务?

如何使用上下文侦听器使Java类在启动时运行,而不影响其他计划任务?,java,eclipse,tomcat,initialization,servletcontextlistener,Java,Eclipse,Tomcat,Initialization,Servletcontextlistener,我正在ApacheTomcat服务器中使用Eclipse来执行基于java的web项目 当应用程序启动时,我必须只运行一次在类“socket.java”中编写的函数。我试图初始化这个类,我有其他计划的任务在其他线程上运行,这些线程由其他servletContextListner实现。当我在ServletContextListner上运行这个“Socket.Java”时,应用程序工作不正常。现在,其他ServletContextListner上的计划任务只运行一次 如何解决这个问题 我的Liste

我正在ApacheTomcat服务器中使用Eclipse来执行基于java的web项目

当应用程序启动时,我必须只运行一次在类“socket.java”中编写的函数。我试图初始化这个类,我有其他计划的任务在其他线程上运行,这些线程由其他servletContextListner实现。当我在ServletContextListner上运行这个“Socket.Java”时,应用程序工作不正常。现在,其他ServletContextListner上的计划任务只运行一次

如何解决这个问题

我的Listener类如下所示:-

package com.my.classes;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

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

public class SocketContextListner implements ServletContextListener{

    private Executor Task;
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        Task= Executors.newSingleThreadExecutor();      
        Socket b = new Socket();
        Task.execute(b);
    }
}

另一个ServletContextListener具有许多计划任务,在我为套接字实现上下文侦听器时,该任务没有运行

package com.my.classes;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class JMonitorContextListner implements ServletContextListener{

    private ScheduledExecutorService scheduler1;
    @Override
    public void contextDestroyed(ServletContextEvent event1) {
        // TODO Auto-generated method stub
        scheduler1.shutdownNow();
//      System.out.println("Context1 Destroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent event1) {
        // TODO Auto-generated method stub
//      System.out.println("Context1 initialized"); 
        scheduler1 = Executors.newSingleThreadScheduledExecutor();
        scheduler1.scheduleAtFixedRate(new Jmonitor(), 0, 10, TimeUnit.SECONDS);
        scheduler1.scheduleAtFixedRate(new FeedStatus(), 0, 10, TimeUnit.SECONDS);
        scheduler1.scheduleAtFixedRate(new AutoReset(), 0, 30, TimeUnit.SECONDS);
        scheduler1.scheduleAtFixedRate(new AutoLogoff(), 0, 1, TimeUnit.MINUTES);
    }
} My web.xml文件:

<listener>
<listener-class>com.my.classes.JMonitorContextListner</listener-class>
</listener>
<listener>
<listener-class>com.my.classes.SocketContextListner</listener-class>
</listener> 

com.my.classes.JMonitorContextListner
com.my.classes.SocketContextListner

我的控制台:

控制台打印,例如优先级、来自db的ip和空点异常,应该像来自计划任务一样反复打印

请告诉我,如何在不影响应用程序正常工作的情况下初始化“Socket.java”类

当我为Socket.java创建单独的监听器并在不同的线程上执行它时,“JMonitorContextListner”上的计划任务在第一次运行后停止。为什么会这样


非常感谢您的建议和任何代码。

在您的问题中发布相关代码,而不是在评论中。但当然,由于所有计划任务都有一个线程,如果其中一个线程(我怀疑)在套接字上永远等待,那么就不能执行其他任务,因为唯一的线程被阻止在套接字上等待。请从单独的线程听套接字。Tomcat不关心您在特定线程中执行的操作,它甚至不知道。如果您有一个特定的问题,那么发布一个最小的、完整的示例来重现该问题,并精确地解释该问题。您仍然没有在单独的线程中侦听套接字,并且没有堆栈跟踪来解释NullPointerException的来源。其中一个可能再次阻塞了唯一的线程。