当前位置: 首页 > 面试题库 >

氛围+球衣:我如何拥有多个广播公司?

杜阳泽
2023-03-14
问题内容

我有一个工作的Jersey / Atmosphere / Guice应用程序,其中有两个Atmosphere资源。第一个几乎是示例聊天应用程序的克隆:

@Path("/chat")
@AtmosphereService(broadcaster = JerseyBroadcaster.class, path = "/chat")
public class ChatResource {

    @Suspend(contentType = "application/json")
    @GET
    public String suspend() {
       return "";
    }

    @Broadcast(writeEntity = false)
    @POST
    @Produces("application/json")
    public Response broadcast(Message message) {
        return new Response(message.author, message.message);
    }
}

第二个是测试通知资源,将向其发送服务器端事件:

@Path("/notifications")
@AtmosphereService(broadcaster = JerseyBroadcaster.class, path = "/notifications")
public class NotificationsResource {

    @Suspend(contentType = "application/json")
    @GET
    public String suspend() {
       return "";
    } 
}

一切都正确连接,并且工作正常。但是,为了让我发送服务器端事件,我发出:

MetaBroadcaster.getDefault().broadcastTo("/*", new Response(...));

显然,这会将广播消息发送到两个资源。我想做的是仅将服务器端事件发送到通知资源:

MetaBroadcaster.getDefault().broadcastTo("/notifications", new NotificationResponse(...));

但是,这不起作用。我总是收到以下错误:

org.atmosphere.cpr.MetaBroadcaster - No Broadcaster matches /notifications.

那是因为只有一个广播公司注册;/ *上的Jersey JerseyBroadcaster。

问题是:如何使这两个资源具有不同的具有不同ID /名称的广播者?


问题答案:

在资源中,使用所需的通道挂起(如果不存在,则使用lookup()的’true’参数强制创建该通道):

@Suspend( contentType = MediaType.APPLICATION_JSON, period = MAX_SUSPEND_MSEC )
@GET
public Broadcastable suspend( @Context final BroadcasterFactory factory )
{
    return new Broadcastable( factory.lookup( MY_CHANNEL, true ) );
}

在几乎可以在任何地方的其他代码中,广播到该频道:

Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup( MY_CHANNEL );
if( broadcaster != null ) {
    broadcaster.broadcast( message );
}

如果要通过资源方法进行广播,则可以对其进行注释(如ChatResource的broadcast()方法所示)。



 类似资料:
  • 有一个应用程序需要像搜寻列表这样的东西。这个应用程序可以用不同的配置多次启动。有没有办法跨JVM共享数据结构。在JVM中是有效的。有一个数据库可以解决这个问题。但是,有没有更简单、更快速的方法?

  • 房间类别 长话短说,这一点是为了添加房间,并能够导航它们,捡起物品,然后放下它们。在我尝试运行程序时,我注意到我不能有多个北/南/东/西键。我怎样才能避开这件事,这样我才能把它做好?

  • 我有一个Google Cloud函数,它包含多个模块,可以在不同的路径上调用。 我正在使用无服务器框架来部署我的函数,但它有每个函数只有一个路径的限制。 我想在一个函数中使用多个路径,就像我们可以在AWS无服务器框架中一样。 假设云函数有两个路径和;两个路径都应该调用相同的函数。 类似这样的事情:

  • 问题内容: 我想使用Jersey来实现一些Java REST服务。默认的POJO转换器JAXB处理JSON对象有点奇怪,因此我想使用Jackson转换POJO的开销很少或更少。我如何告诉J2ME框架使用另一个转换器? 我的web.xml看起来像这样: 问题答案: 只需添加jackson JAR并修改web.xml即可,如下所示: 所需的Jackson Jackson JAR(http://jack

  • 我使用的是Jersey 1.12,并且有一个endpoint可能接收也可能不接收来自我无法控制的客户端的格式错误的标头(例如)。显然,bla格式错误,因为规范要求参数也要有值,即 我可以按照这里、这里和这里的建议编写一个过滤器来解决这个问题,但我想知道是否有一种方法可以让Jersey在我对其值不感兴趣的情况下忽略所有格式错误的报头?

  • 我需要在java上开发简单的web服务。我是java技术新手,根据几篇文章,我决定将JAX-RS(Jersey)与嵌入式http服务器(Grizzly2)结合使用,因为它看起来适合构建REST服务,部署似乎很简单。 在我的开发环境中,所有工作都很完美(使用IntllijIdea)。 但当我尝试在测试服务器上部署时,每个请求都返回“500内部错误”(偶数/application.wadl) 简单资源