在我的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
有没有办法从服务器容器中删除端点,所以它会再次部署?
答案 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实例与端点一起丢失,直到重新启动发生。但是如果你混合这两个建议,你每隔一段时间就会只添加一个新的端点。