如何只用一个客户端启动多个 web rest 服务

How to launch multiple web rest services with only one client

我有兴趣开发网络应用程序。 我需要同时调用十个 Web 服务,并且使用一个 JAX-RS 客户端。

这是我的代码:

public static void main(String[] args)  {
for (int i = 1; i <= 10; i++) {
launcherPS(i)
}

static void launcherPS(int id){
        ClientConfig config = new ClientConfig();
        Client client = ClientBuilder.newClient(config);
        String name="LampPostZ"+id;
        WebTarget target = client.target(getBaseURI(name));

        System.out.println();
        System.out.println("Launching of PresenceSensor "+id+" .........");
        target.path("PresenceSensor/"+id).path("change").request()
                    .accept(MediaType.TEXT_PLAIN).get(String.class);    
    }
    private static URI getBaseURI(String project) {
        return UriBuilder.fromUri("http://localhost:8081/"+project).build();                                                            
    }
}

此代码允许调用第二个服务,但第一个服务终止其操作。但是,我需要同时启动它们。 感谢您的帮助。

如果您使用的是JEE7/JAX-RS 2.0,您可以使用async()方法:

target.path("PresenceSensor/"+id).path("change").request()
                .accept(MediaType.TEXT_PLAIN)
                .async()
                .get(/* see Javadocs for various options! */);

一般这returns一个Future。请参阅 JAX-RS 2.x 规范中的详细信息,第 8.4 章。

另一方面,如果你有幸使用 JEE8/JAX-RS 2.1,你可以使用新的 rx() 方法,它可以给你一个 CompletionStage 甚至更丰富的 RX 东西:

target.path("PresenceSensor/"+id).path("change").request()
                .accept(MediaType.TEXT_PLAIN)
                .rx() // ONLY JAX-RS 2.1
                .get(/* see Javadocs for various options! */);

参见 JAX-RS 2.1 规范,第 5.7 章。

注意:如果你想对调用的结果做些什么,你需要相应地调整代码,例如编写各种 CompletionStages 以在全部完成时得到通知。