gpt4 book ai didi

java - 设计服务接口(interface)以允许同步和异步实现

转载 作者:行者123 更新时间:2023-11-30 05:09:49 25 4
gpt4 key购买 nike

不确定如何确切地描述这一点,但我想我已经在标题中概括了我想要做的事情。详细地说,我正在寻找一种设计模式,它可以让我实现一个服务,该服务在一种情况下同步返回调用的结果,但在另一种情况下返回有关如何异步完成调用的详细信息(例如工作) ID)。

也许仅仅通过这样定义问题就可以清楚地看出我正在尝试做的事情打破了设计接口(interface)契约的想法。可能完全走向错误的方向。

我的想法可能是这样的:

public class Data {
private int id;
/* getter/setter */
}

public class QueuedData extends Data {
private int jobId;
/* getter/setter */
}

public interface MyService {
public Data fetchData(int id);
}

public class SyncedMyService implements MyService {
private SyncDao syncDao;
public Data fetchData(int id) {
return syncDao.getData(id);
}
}

public class QueuedMyService implements MyService {
private JobQueue queue;
public QueuedData fetchData(int id) {
int jobId = queue.startGetData(id);
QueuedData queuedData = createQueuedDate(jobId);
return queuedData;
}
}

这是完成这项任务的明智方法吗?感谢您的任何建议。 (可能有一本我应该阅读的设计模式书籍)

最佳答案

这与 java.util.concurrent 包中使用的 Future 模式非常相似。 Future 表示在单独的线程中完成计算后将来可用的结果。如果在需要结果之前计算已经完成,则返回计算值。否则,获取结果的调用将阻塞,直到计算结束。

所以我认为这种模式是同时拥有同步和异步服务的正确方法。

这是使用 Future 实现解决方案的方法:

public class Data {
private int id;
private final String name;

Data(String name) { this.name = name; }
public String getName() { return name; }
}

public class FutureData extends Data {
private int id;
private final Future<String> nameFuture;

FutureData(Future<String> nameFuture) { this.nameFuture = nameFuture; }
@Override public String getName() { return nameFuture.get(); }
}

public interface MyService {
public Data fetchData(int id);
}

public class SyncMyService implements MyService {
private SyncDao syncDao;
public Data fetchData(int id) {
return syncDao.getData(id);
}
}

public class AsyncMyService implements MyService {
private static final ExecutorService executor =
Executors.newFixedThreadPool(10);

public FutureData fetchData(final int id) {
Future<String> future = executor.submit(new Callable<String>() {
public String call() {
String name;
//some long computation that computes the name using the id given
return name;
}
});
FutureData futureData = new FutureData(future);
return futureData;
}
}

对于 Quartz,只需将 ExecutorService 替换为 JobQueue 并使用 Quartz 的 Future 等效项。

关于java - 设计服务接口(interface)以允许同步和异步实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3824548/

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