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