gpt4 book ai didi

Java ExecutorCompletionService 作为 API 响应程序

转载 作者:行者123 更新时间:2023-12-02 07:27:03 25 4
gpt4 key购买 nike

我有一个服务器应用程序监听 ServerSocket用于传入查询。提交查询的客户端希望打开到服务器的套接字,将其查询传递到上游,然后(可能在很短的时间之后)从他们使用的相同套接字读取对其查询的响应提交查询。

为此,我尝试使用 ExecutorCompletionService 。不同的查询类传递给不同的Callable s,但所有预期都会返回 String作为他们的结果。

在我到达实际尝试回复客户的阶段之前,所有这些都是可以管理的。 Future对象目前都是 Future<String> 类型,但我无法将该结果( String )结合到适当的 Socket 。 .

我的解决方案是使我的所有 Callable类型为 Callable<StringSocketPair>哪里StringSocketPair看起来像;

public class StringSocketPair {
Socket sock;
String content;
}

但这一切看起来有点奇怪,因为现在我必须通过 SocketCallable构造函数,以便它可以将其与 String 一起返回来自其 call() 的结果方法。这一切都是为了我可以插入StringSocket在另一个轮询 ExecutorCompletionService.take() 的线程中.

另一个选项是使用 Runnable s 而不是 Callable s 并有每个 Runnable任务自行响应Socket ,但由于我有十几个查询类型,每个查询类型都有自己的任务对象,我宁愿不必添加 respondToClient()某种类型的调用到每个 run() 的末尾每个任务对象的方法。

对于我认为相当常见的设置,必须有一个更简单的解决方案吗?

最佳答案

按照使用Runnable的想法,您可以使用Template Method Pattern定义响应的功能。这将使您不必为每个任务编写通用代码,因为通用代码将放置在实现 Runnable 的抽象父类中。

模板方法模式:

abstract class TemplateSuperClass implements Runnable {
public void run() {
//some setup code here
String message = taskWork(...);
socket.write(message);
//common cleanup code
}

abstract String taskWork(...);
}

class HelloWorld extends TemplateSuperClass {
String taskWork(...) {
return "Hello World";
}
}

否则,您可能正确地更改 Callable 以返回响应消息和套接字的元组。

关于Java ExecutorCompletionService 作为 API 响应程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423461/

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