从WebListener中的ServerContainer中删除端点

时间:2015-11-09 14:56:38

标签: java spring tomcat dependency-injection jira

在我的JIRA插件中,我创建了一个WebListener,它将一个websocket端点添加到SeverContainer。

问题是,当我对我的插件进行更改并将其上传到JIRA时,新代码不会被执行。

这是因为没有再次部署端点。我得到以下异常:多个端点可能未部署到同一路径

我的weblistener:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>
    <a data-role="modal">xxx</a>
    <a data-role="modal">yyy</a>
  </li>
  <li>
    <a>abc</a>
    <a data-role="modal">zzz</a>
    <a data-role="modal">xyz</a>
  </li>
</ul>

我的websocket:

xxx

有没有办法从服务器容器中删除端点,所以它会再次部署?

1 个答案:

答案 0 :(得分:0)

在规范中,我没有找到任何方法来停用websocket。这同样适用于ServletContextListeners。它们只能添加。所以你需要一个解决方法。

我建议您不要替换MyEndpoint.class,而应将其作为调用实现的代理。因此,在部署端点时,端点将不需要重新注册,新的代理类会调用新代码。

因此,您可以放心地忽略代码中的DeploymentException,因为您更改了MyWebsocket.class,如下所示:

@ServerEndpoint(value = "/websocket/{myPathParam}")
public class MyWebsocket {

    private static final Logger LOG = LoggerFactory.getLogger(MyWebsocket.class);

    @OnOpen
    public void onOpen(Session session, @PathParam("myPathParam") String myPathParam) {
        LOG.error("OnOpen");
        WebSocketImpl impl = ImplementationFactory.get(MyWebsocket.class);
        impl.onOpen(session, myPathParam);
    }

    @OnClose
    public void onClose(Session session, @PathParam("myPathParam") String myPathParam) {
        LOG.error("OnClose");
        WebSocketImpl impl = ImplementationFactory.get(MyWebsocket.class);
        impl.onClose(session, myPathParam);
    }

    @OnMessage
    public void onMessage(String message, Session session, @PathParam("myPathParam") String myPathParam) {
        LOG.error("OnMessage: " + message);
        WebSocketImpl impl = ImplementationFactory.get(MyWebsocket.class);
        impl.onMessage(message, session, myPathParam);
    }
}

我理解,这不会真正回答您的问题,但它是如何解决丢失的删除选项的解决方案。

这个解决方法存在一个问题:它将修复您的界面,您无法在新版本的插件中添加参数。

要启用此功能,可以通过添加另一个上下文侦听器添加另一个websocket(V7已随机选择):

@WebListener
public class MyListener_V7 implements ServletContextListener {

private static final Logger LOG = LoggerFactory.getLogger(MyListener_V7.class);

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
    final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext()
            .getAttribute("javax.websocket.server.ServerContainer");
    try {
        serverContainer.addEndpoint(MyWebsocket_V7.class); //Generates exception when the plug-in is updated
    } catch (DeploymentException e) {
        LOG.error("Error adding endpoint to the servercontainer: " + e.getMessage());
    }
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
    LOG.error("CONTEXT DESTROYED!");
}
}

@ServerEndpoint(value = "/websocket_V7/{myPathParam}")
public class MyWebsocket_V7 {

private static final Logger LOG = LoggerFactory.getLogger(MyWebsocket.class);

这将使JIRA实例与端点一起丢失,直到重新启动发生。但是如果你混合这两个建议,你每隔一段时间就会只添加一个新的端点。