我正在创建一个websocket应用程序,我想在程序初始化时执行一次性时间密集型任务。在创建此应用程序时,建议的做法(https://netbeans.org/kb/docs/javaee/maven-websocketapi.html)将覆盖以下功能:
@ServerEndpoint(value = "/testendpoint", encoders = {TestEncoder.class}, decoders = {TestDecoder.class})
public class WSEndpoint
{
@OnMessage
public void onMessage(Session wsSession, CommandIn command) throws IOException, EncodeException
{
...
}
@OnOpen
public void onOpen(Session wsSession)
{
...
}
@OnClose
public void onClose(Session wsSession)
{
...
}
@OnError
public void onError(Throwable t)
{
}
}
因此,当创建新的连接/会话时," onOpen"将被呼叫,当收到新消息时," onMessage"被称为。
我想做的是,在让用户创建会话和发送命令(通过浏览器前端)之前,初始化需要大约20秒初始化的子系统。如果它仅在"首次请求使用"初始化,正如我现在所做的那样,那么用户体验就会被中断。显然,没有"主要"函数在这里可见(可能是由websocket框架在更深层次调用)。
你们有什么建议我去做我想做的事情?目前,我在内部类的静态块中有初始化代码 - 它只执行一次 - 但是在类第一次被调用/使用"时会被执行,从而中断用户体验。
有什么建议吗?
感谢。
答案 0 :(得分:0)
Web应用程序中初始化代码的最佳位置是ServletContextListener
的contextInitialized
方法。
这样,您可以在应用程序启动时进行初始化。