gpt4 book ai didi

java - 从 WebListener 中的 ServerContainer 中删除端点

转载 作者:行者123 更新时间:2023-11-28 23:28:48 26 4
gpt4 key购买 nike

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

问题是,当我更改我的插件并将其上传到 JIRA 时,新代码没有执行。

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

我的网络监听器:

@WebListener
public class MyListener implements ServletContextListener {

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

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext()
.getAttribute("javax.websocket.server.ServerContainer");
try {
serverContainer.addEndpoint(MyWebsocket.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/{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");
}

@OnClose
public void onClose(Session session, @PathParam("myPathParam") String myPathParam) {
LOG.error("OnClose");
}

@OnMessage
public void onMessage(String message, Session session, @PathParam("myPathParam") String myPathParam) {
LOG.error("OnMessage: " + message);
}
}

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

最佳答案

在规范中,我没有找到任何方法来停用 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 实例中散布端点,直到重新启动。但是,如果混合使用这两种建议,您只会每隔一段时间添加一个新端点。

关于java - 从 WebListener 中的 ServerContainer 中删除端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com