在任务仍在进行时返回结果 运行
Returning results while a task is still running
我有一个方法需要在调用后立即return结果,即使这个方法中的所有任务都没有完成。
在这种情况下:
- 用户提交地址以将资金存入
- 我想保存他们的地址并发给他们一个充值地址
- 我想启动一个任务,开始检查用户是否将资金存入存款地址
第 2 步是我正在 return 进行的,第 3 步是我想 运行 在我 return 到第 3 步之后保留在后台的。
我不确定应该采取什么方向来安排这些事件。以下是我的方法,不确定如何处理 addressRegistrationService.watchAndTransact(userAddresses);
任务。它可能需要一整天的时间才能完成,并且用户需要先输入存款地址 returned 才能存入资金。
@PostMapping("/registeraddress")
public ResponseEntity<Mono<UserAddressesDTO>> addUserAddress(@RequestBody UserAddresses userAddresses) throws Exception {
log.info("Registering {} with addresses {}", userAddresses.getAccountId(), userAddresses.getAddresses());
//Checking if we can use the user provided addresses and account id
if (addressRegistrationService.isRegistrationValid(userAddresses)) {
throw new InvalidAddressException("Address is invalid");
}
log.info("Deposit Address is {}", generateJobcoinAddress.generateJobcoinAddress());
//Generate the deposit address and add it the UserAddress
String depositAddress = generateJobcoinAddress.generateJobcoinAddress();
//Add input and deposit address to the object
UserAddressesDTO userAddressesDTO = new UserAddressesDTO(userAddresses.getAccountId(), depositAddress, userAddresses.getAddresses());
//Request the Jobcoin Service to start watching for the transaction
//Once Jobcoin Service detects it will post the transaction to the house account
//then to the user addresses - > we will be notified separately once this is complete
addressRegistrationService.watchAndTransact(userAddresses);
//Store addresses in database, calls the data-service to store these details
return ResponseEntity.ok().body(addressRegistrationService.saveAddressDB(userAddressesDTO));
}
您可以使用 CompletableFuture
。所以你的代码看起来像...
CompletableFuture.runAsync(() -> addressRegistrationService.watchAndTransact(userAddresses));
它将 运行 您的 watchAndTransact
方法放在不同的线程中。并且主线程不会等待结果。所以基本上它会 运行 在后台。
注意:但是万一失败你将不知道发生了什么。所以你可以添加一些自定义指标和日志。这可以是服务本身的一部分。
CompletableFuture.runAsync(() -> {
try {
addressRegistrationService.watchAndTransact(userAddresses);
// Notify user
} catch (RuntimeException e) {
// custom metrics implementation here
// log error here
}
});
我有一个方法需要在调用后立即return结果,即使这个方法中的所有任务都没有完成。
在这种情况下:
- 用户提交地址以将资金存入
- 我想保存他们的地址并发给他们一个充值地址
- 我想启动一个任务,开始检查用户是否将资金存入存款地址
第 2 步是我正在 return 进行的,第 3 步是我想 运行 在我 return 到第 3 步之后保留在后台的。
我不确定应该采取什么方向来安排这些事件。以下是我的方法,不确定如何处理 addressRegistrationService.watchAndTransact(userAddresses);
任务。它可能需要一整天的时间才能完成,并且用户需要先输入存款地址 returned 才能存入资金。
@PostMapping("/registeraddress")
public ResponseEntity<Mono<UserAddressesDTO>> addUserAddress(@RequestBody UserAddresses userAddresses) throws Exception {
log.info("Registering {} with addresses {}", userAddresses.getAccountId(), userAddresses.getAddresses());
//Checking if we can use the user provided addresses and account id
if (addressRegistrationService.isRegistrationValid(userAddresses)) {
throw new InvalidAddressException("Address is invalid");
}
log.info("Deposit Address is {}", generateJobcoinAddress.generateJobcoinAddress());
//Generate the deposit address and add it the UserAddress
String depositAddress = generateJobcoinAddress.generateJobcoinAddress();
//Add input and deposit address to the object
UserAddressesDTO userAddressesDTO = new UserAddressesDTO(userAddresses.getAccountId(), depositAddress, userAddresses.getAddresses());
//Request the Jobcoin Service to start watching for the transaction
//Once Jobcoin Service detects it will post the transaction to the house account
//then to the user addresses - > we will be notified separately once this is complete
addressRegistrationService.watchAndTransact(userAddresses);
//Store addresses in database, calls the data-service to store these details
return ResponseEntity.ok().body(addressRegistrationService.saveAddressDB(userAddressesDTO));
}
您可以使用 CompletableFuture
。所以你的代码看起来像...
CompletableFuture.runAsync(() -> addressRegistrationService.watchAndTransact(userAddresses));
它将 运行 您的 watchAndTransact
方法放在不同的线程中。并且主线程不会等待结果。所以基本上它会 运行 在后台。
注意:但是万一失败你将不知道发生了什么。所以你可以添加一些自定义指标和日志。这可以是服务本身的一部分。
CompletableFuture.runAsync(() -> {
try {
addressRegistrationService.watchAndTransact(userAddresses);
// Notify user
} catch (RuntimeException e) {
// custom metrics implementation here
// log error here
}
});