gpt4 book ai didi

atmosphere - 无法使用 Atmosphere 运行时广播到单个连接

转载 作者:行者123 更新时间:2023-12-03 10:05:34 26 4
gpt4 key购买 nike

我正在使用 Atmosphere 运行时 0.6 快照。 Tomcat 7 正确记录我正在使用 Http11 Nio 连接器,并且没有警告将使用 BlockingIO。

我正在尝试向三种 channel 发送消息。

  • Global Broadcaster - 广播到所有暂停的资源。 (全部)
  • 广播到特定资源(例如合作伙伴)
  • 广播到当前资源(自)

  • 当登录操作发生时,为了实现这种广播,我必须在 session 中存储什么?

    我的代码的一些细节如下:
  • 我的处理程序实现了 AtmosphereHandler
  • 在构造函数中,我将 globalBroadcaster 实例化如下:
    globalBroadcaster = new DefaultBroadcaster();
  • 登录时,
    resource.getAtmosphereConfig().getServletContext().setAttribute(name, selfBroadcaster);其中 name 是请求参数中的用户名,selfBroadcaster 是 DefaultBroadcaster 的新实例。
  • 这是 sendMessageToPartner 的代码,

  • private synchronized void sendMessageToPartner(Broadcaster selfBroadcaster,
    AtmosphereResource<HttpServletRequest, HttpServletResponse> resource,String name, String message) {

    // this gives the partner's name

    String partner= (String) resource.getAtmosphereConfig().getServletContext().getAttribute(name + PARTNER_NAME_TOKEN);

    // get partner's broadcaster

    Broadcaster outsiderBroadcaster = (Broadcaster) resource

    .getAtmosphereConfig().getServletContext()

    .getAttribute(partner);

    if (outsiderBroadcaster == null) {

    sendMessage(selfBroadcaster, "Invalid user " + partner);

    return;

    }

    // broadcast to partner

    outsiderBroadcaster.broadcast(" **" + message);

    我希望我已经提供了所有必需的信息。如果需要,我可以提供更多信息。

    问题是,全局消息被发送。当发送给合作伙伴的消息时,有时它会被阻止,客户端根本没有收到消息。这在 3-4 条消息后始终发生。

    是不是线程有问题?我究竟做错了什么?

    我希望有人能帮我解决这个问题。

    最佳答案

    好的,我想出了如何使用 Atmosphere 运行时来实现这一点。
    首先,我升级到 0.7 SNAPSHOT,但我认为同样的逻辑也适用于 0.6。

    因此,要为单个用户创建广播器:

    在 GET 请求中,

      // Use one Broadcaster per AtmosphereResource             
    try {
    atmoResource.setBroadcaster(BroadcasterFactory.getDefault().get());

    } catch (Throwable t) {
    throw new IOException(t);
    }

    // Create a Broadcaster based on this session id.
    selfBroadcaster = atmoResource.getBroadcaster();
    // add to the selfBroadcaster
    selfBroadcaster.addAtmosphereResource(atmoResource);

    atmoResource.suspend();

    当调用登录操作时,
    //Get this broadcaster from session and add it to BroadcasterFactory.

    Broadcaster selfBroadcaster = (Broadcaster) session.getAttribute(sessionId);

    BroadcasterFactory.getDefault().add(selfBroadcaster, name);

    Now the global broadcaster. The logic here is, you create a broadcaster from the first resource and then add each resource as they log in.

    Broadcaster globalBroadcaster;

    globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class, GLOBAL_TOKEN, false);
    if (globalBroadcaster == null) {
    globalBroadcaster = selfBroadcaster;

    } else {
    BroadcasterFactory.getDefault().remove(
    globalBroadcaster, GLOBAL_TOKEN);
    AtmosphereResource r = (AtmosphereResource) session
    .getAttribute("atmoResource");
    globalBroadcaster.addAtmosphereResource(r);

    }
    BroadcasterFactory.getDefault().add(globalBroadcaster,
    GLOBAL_TOKEN);

    最后,您可以向单个连接或全局向所有连接广播,如下所示:
    // Single Connection/Session
    Broadcaster singleBroadcaster= BroadcasterFactory.getDefault().lookup(
    DefaultBroadcaster.class, name);
    singleBroadcaster.broadcast("Only for you");

    // Global
    Broadcaster globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class,GLOBAL_TOKEN, false);
    globalBroadcaster.broadcast("Global message to all");

    要向合作伙伴发送消息,只需查找合作伙伴的广播器,然后对单个连接执行与上述相同的操作。

    希望这可以帮助那些试图实现相同目标的人。
    可能有更好的方法来做到这一点。
    我想我将不得不使用这种方法,直到有人提出更好的解决方案。

    关于atmosphere - 无法使用 Atmosphere 运行时广播到单个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4543831/

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