小编Ste*_*e N的帖子

请参阅与类同名的模块中的方法

我有一个类和一个具有相同名称的模块:

module Pushover
  def configure
    ..
  end
end

module MyModule
  class Pushover
    def blah
      Pushover.configure
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Pushover.configure调用指向包含类.现在,一个明显的解决方法是重命名该类.但是,模块来自gem,该类符合DSL中所需的命名约定.理想情况下,他们应该保持不变.我也可以创建第二个辅助类并通过它调用,但这看起来有点hacky.我首选的解决方案是直接引用模块方法.

围绕这个领域的所有现有问题似乎都在相反的方向消除歧义 - 即他们想要获得类引用而不是模块.

有什么办法让我告诉Ruby我指的是模块而不是我指定的类Pushover吗?

ruby

8
推荐指数
1
解决办法
1605
查看次数

Play Framework 2 - 调用Web服务并返回一个对象

我有一个模型,我想填充Web服务的详细信息.我想异步这样做,以免阻塞服务器线程.我们假装它是一个登录服务.

现在我想要做的是向远程服务器发出请求并最终返回User模型对象.所以方法签名看起来像这样:

public static User loginUser(String username, String password) {
Run Code Online (Sandbox Code Playgroud)

我理解为了对Web服务进行异步调用,我应该使用Promise:

Promise<WS.Response> wsPromise = WS.url("http://myserver.com/login")
            .setContentType("application/json; charset=utf-8")
            .post("... the username and password ...");
Run Code Online (Sandbox Code Playgroud)

哪个还没有启动请求.我可以调用get()此对象来阻止对服务的调用.这有效.

为了异步执行此操作,我认为我需要映射它并以某种方式执行它.

Promise<User> resultPromise = wsPromise.map(new F.Function<WS.Response, User>() {
    @Override
    public User apply(WS.Response response) throws Throwable {
        System.out.println(response.getBody());
        return new User(... based on something extracted from the returned JSON ...);
    }
});
Run Code Online (Sandbox Code Playgroud)

现在我该如何触发此操作?如果我打电话get()给它resultPromise,它会拨打电话,但最终会触发超时例外.我不能使用这个async(...)方法,因为那只会给我一个回复Result.

看看其他例子(https://github.com/jroper/play-promise-presentation/blob/master/src/main/java/controllers/Application.java),这似乎是模式.即我们总是希望返回一个Result对象.但是,我无法查询Result对象,我也没有计划将该特定对象发送给用户.

实际上,这些示例似乎调用Web服务,将JSON结果映射到对象,然后立即将它们映射回相同的JSON.当我想将User(在我的情况下)传递回调用函数时,没什么用处.

说实话,我对这种异步性质有点困惑(你可能已经猜到了).特别是,这实际上是一个阻止操作,因为我们必须等待Web服务返回响应.文档似乎表明使用Promise/ Futurepatterns将避免这种阻塞.

底线是:如何在不阻止Play …

java playframework-2.0

5
推荐指数
1
解决办法
4198
查看次数

Atmosphere + Jersey:我如何拥有多个广播公司?

我有一个工作的Jersey/Atmosphere/Guice应用程序,它有两个Atmosphere Resources.第一个是示例聊天应用程序的克隆:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

    @Suspend(contentType = "application/json")
    @GET
    public String suspend() {
       return "";
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

MetaBroadcaster.getDefault().broadcastTo("/*", new Response(...));
Run Code Online (Sandbox Code Playgroud)

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

MetaBroadcaster.getDefault().broadcastTo("/notifications", new NotificationResponse(...));
Run Code Online (Sandbox Code Playgroud)

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

org.atmosphere.cpr.MetaBroadcaster - No Broadcaster matches /notifications.
Run Code Online (Sandbox Code Playgroud)

那是因为只有一家广播公司注册; …

java jersey guice atmosphere

4
推荐指数
1
解决办法
2962
查看次数

标签 统计

java ×2

atmosphere ×1

guice ×1

jersey ×1

playframework-2.0 ×1

ruby ×1