Cara menyelesaikan pengecualian tamat masa invokasi kaedah jauh Java (TimeoutInvocationException)
Ikhtisar:
Apabila menggunakan Java untuk pembangunan aplikasi teragih, kami sering menggunakan Invocation Kaedah Jauh (RMI) untuk berkomunikasi antara komunikasi nod yang berbeza. Walau bagaimanapun, disebabkan persekitaran rangkaian yang tidak stabil atau masa pelaksanaan yang terlalu lama bagi penyembahan kaedah, kita sering menghadapi pengecualian tamat masa penyeruan kaedah jauh Java (TimeoutInvocationException). Artikel ini menerangkan beberapa penyelesaian untuk menangani situasi ini dan menyediakan contoh kod untuk digambarkan.
Penyelesaian:
Disenaraikan di bawah adalah beberapa kaedah untuk menyelesaikan pengecualian tamat masa panggilan kaedah jauh Java:
RemoteStub
dan LocateRegistry
yang disediakan oleh rangka kerja RMI Java untuk menetapkan tamat masa. RemoteStub
和LocateRegistry
类来设置超时时间。示例代码如下:
// 创建远程对象 MyRemoteObject remoteObject = (MyRemoteObject) Naming.lookup("//localhost/MyRemoteObject"); // 设置超时时间为5秒 ((RemoteStub) remoteObject).setCallTimeout(5000); // 调用远程方法 remoteObject.doSomething();
Future
接口可以实现异步调用,即发送请求后立即返回,然后在需要的时候获取实际的调用结果。这样可以避免等待时间过长而导致的超时异常。示例代码如下:
// 创建远程对象 MyRemoteObject remoteObject = (MyRemoteObject) Naming.lookup("//localhost/MyRemoteObject"); // 提交异步调用请求 ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<String> future = executorService.submit(() -> remoteObject.doSomething()); // 设置超时时间为5秒 String result; try { result = future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { // 处理异常 }
PoolingHttpClientConnectionManager
// 创建连接池 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(100); // 设置最大连接数 connectionManager.setDefaultMaxPerRoute(10); // 设置每个路由的最大连接数 // 创建HttpClient HttpClient httpClient = HttpClientBuilder.create() .setConnectionManager(connectionManager) .build(); // 创建远程请求 HttpGet request = new HttpGet("http://localhost:8080/doSomething"); // 发送请求并得到响应 HttpResponse response = httpClient.execute(request);
Future
Java boleh melaksanakan panggilan tak segerak, iaitu, kembali serta-merta selepas menghantar permintaan , dan kemudian apabila diperlukan masa untuk mendapatkan hasil panggilan sebenar. Ini boleh mengelakkan pengecualian tamat masa yang disebabkan oleh menunggu terlalu lama. // 创建HystrixCommand HystrixCommand<String> command = new HystrixCommand<String>(HystrixCommandGroupKey.Factory.asKey("MyGroup")) { @Override protected String run() throws Exception { // 执行远程方法调用 return remoteObject.doSomething(); } @Override protected String getFallback() { // 返回熔断时的默认值 return "Fallback Value"; } }; // 执行命令 String result = command.execute();
Gunakan kumpulan sambungan:
Mencipta kumpulan sambungan untuk mengurus sambungan rangkaian untuk panggilan kaedah jauh boleh meningkatkan penggunaan sumber dan mengurangkan berlakunya pengecualian tamat masa. Anda boleh menggunakanPoolingHttpClientConnectionManager
Apache untuk membuat kolam sambungan. Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian masa invokasi kaedah jauh Java (TimeoutInvocationException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!