0

httprequests または実際に呼び出されたメソッド呼び出しを処理するために、次の async/await .NET 4.5 コードに相当する Java はありますか?

public async Task<System.IO.TextReader> DoRequestAsync(string url)
{
    HttpWebRequest req = HttpWebRequest.CreateHttp(url);
    req.AllowReadStreamBuffering = true;
    var tr = await DoRequestAsync(req);  // <- Wait here and even do some work if you want.
    doWorkWhilewaiting();                // ...look ma' no callbacks.
    return tr;
}

これをコントローラーの /GET メソッド内で呼び出すことを計画していました (サードパーティの REST エンドポイントからデータを取得するため)。Java の世界はまったく初めてです。

どんな情報でも大歓迎です。

4

2 に答える 2

3

いいえ、Java には async/await のようなものはありません。このjava.util.concurrentパッケージには、同時実行に関するさまざまな有用なクラス (スレッド プール、プロデューサー/コンシューマー キューなど) が含まれていますが、実際にはすべてを結び付けるのは C# 5の言語サポートです...そしてそれは Java にはまだ存在しません。

私が知る限り、これは Java 8 の計画の一部でもありません。ただし、メソッド リテラルやラムダ式などによって、少なくとも明示的なコールバック アプローチが Java 7 よりもはるかに単純になります。

于 2013-06-27T05:49:57.843 に答える
0

最近、適切なライブラリJAsyncをリリースしました。Java の es と同じように Async-Await パターンを実装します。また、Reactor を低レベルの実装として使用します。現在はアルファ段階です。それを使用して、次のようなコードを記述できます。

@RestController
@RequestMapping("/employees")
public class MyRestController {
    @Inject
    private EmployeeRepository employeeRepository;
    @Inject
    private SalaryRepository salaryRepository;

    // The standard JAsync async method must be annotated with the Async annotation, and return a JPromise object.
    @Async()
    private JPromise<Double> _getEmployeeTotalSalaryByDepartment(String department) {
        double money = 0.0;
        // A Mono object can be transformed to the JPromise object. So we get a Mono object first.
        Mono<List<Employee>> empsMono = employeeRepository.findEmployeeByDepartment(department);
        // Transformed the Mono object to the JPromise object.
        JPromise<List<Employee>> empsPromise = Promises.from(empsMono);
        // Use await just like es and c# to get the value of the JPromise without blocking the current thread.
        for (Employee employee : empsPromise.await()) {
            // The method findSalaryByEmployee also return a Mono object. We transform it to the JPromise just like above. And then await to get the result.
            Salary salary = Promises.from(salaryRepository.findSalaryByEmployee(employee.id)).await();
            money += salary.total;
        }
        // The async method must return a JPromise object, so we use just method to wrap the result to a JPromise.
        return JAsync.just(money);
    }

    // This is a normal webflux method.
    @GetMapping("/{department}/salary")
    public Mono<Double> getEmployeeTotalSalaryByDepartment(@PathVariable String department) { 
        // Use unwrap method to transform the JPromise object back to the Mono object.
        return _getEmployeeTotalSalaryByDepartment(department).unwrap(Mono.class);
    }
}
于 2021-09-15T02:17:28.277 に答える