我正在使用Spring @RequestMapping獲取和生成JSON的REST同步服務。我現在想要添加異步響應,當客戶端發送一個id列表,並且服務器發回它的細節,因爲它只讓它們到達一個客戶端。與Spring的多個私有WebSocket消息
我一直在尋找一段時間,還沒有找到我在找什麼。我看到了Spring的兩種不同的方法。最常見的是消息代理方式,它看起來每個人都通過訂閱隊列或主題來獲取每條消息。這是非常不可接受的,因爲這是私人數據。我也有數量有限的數據點要返回。另一種方法是Callable,AsyncResult或DeferredResult。這似乎保持數據私密,但我想發送多個響應。
我已經看到類似於我想要的東西,但在服務器上使用Jersey SSE。我想堅持春天。
這是我目前使用僞代碼。
@RequestMapping(value = BASE_PATH + "/balances", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public GetAccountBalancesResponse getAccountBalances(@RequestBody GetAccountBalancesRequest request) {
GetAccountBalancesResponse ret = new GetAccountBalancesResponse();
ret.setBalances(synchronousService.getBalances(request.getIds());
return ret;
}
這就是我期待的。因爲我不知道細節,所以這很粗糙。一旦我找出發送,我將工作在異步部分,但會採取任何建議。
@RequestMapping(value = BASE_PATH + "/balances", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ???<BalanceDetails> getAccountBalances(@RequestBody GetAccountBalancesRequest request) {
final ???<BalanceDetails> ret = new ???<>();
new Thread(new Runnable() {
public void run() {
List<Future<BalanceDetails>> futures = asynchronousService.getBalances(request.getIds());
while(!stillWaiting(futures)) {
// Probably use something like a Condition to block until there is some details.
ret.send(getFinishedDetails(futures));
}
ret.close();
}
}).start();
return ret;
}
謝謝,韋斯。
我想弄清楚如何使用websockets,我看到的只是Spring的消息總線/廣播示例。我添加了一個RequestBody來顯示我想要接收一個有效載荷。我添加了線程來顯示我想要一個返回多個響應的異步進程。我只找到了匹配我想要做的Jersey例子或者只返回1個異步響應的Spring例子。 我無法控制數據需要多長時間,因爲它來自我無法控制的遠程後端系統。我也沒有控制數據,因爲那是依賴於用戶的。 – Wes
讓我改述一下:websockets是一種服務器推送技術。如果您需要它,您還需要客戶端註冊的服務器端消息總線。從你的評論看來,你似乎沒有控制權,沒有約束,也沒有要求。我想知道你如何編寫任何代碼... – Raffaele
另外,看看['MessageBrokerRegistry.setUserPrefix'](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/消息/ SIMP /配置/ MessageBrokerRegistry.html#setUserDestinationPrefix-java.lang.String-) – Raffaele