2012-06-06 38 views
6

Ứng dụng Java của tôi yêu cầu một lỗi thử lại trên các cuộc gọi từ xa bị lỗi. Những cuộc gọi từ xa là:Thử lại các cuộc gọi Phương thức theo cách thức chung chung

  • rải rác khắp nơi trên ứng dụng
  • liên quan đến các lớp học từ xa Dịch vụ khác nhau.

Ngoài ra, logic thử lại có thể có khoảng thời gian thử lại khác nhau và các thay đổi thử lại khác nhau.

Tôi cần triển khai thử lại chung() có thể thực hiện cuộc gọi phương thức thích hợp tùy thuộc vào nơi được gọi. Dưới đây là một minh hoạ mã đơn giản của tôi đang tìm kiếm. Tôi biết chúng ta có thể cố gắng làm điều này bằng cách sử dụng sự phản chiếu java, nhưng, liệu có một khung công tác hay một nguồn mở có sẵn ở đâu đó được đọc-để-sử dụng?

try { 
ClassA objA = remoteServiceA.call(paramA1, paramA2, ...); 
} catch (Exception e){ 
ClassA objA = (ClassA)retry(remoteService, listOfParams, ..); // generic method call 
} 
.. 

try { 
ClassB objB = remoteServiceB.call(paramB1, paramB2, ...); 
} catch (Exception e){ 
ClassA objB = (ClassB)retry(remoteService, listOfParams, ..); // generic method call 
} 

Trả lời

0

bạn nhận dịch vụ từ đâu? sử dụng một nhà máy để Proxy dịch vụ bạn nhận được từ nhà máy ban đầu. Proxy sau đó có thể triển khai thử lại một cách minh bạch. Xem java Proxy/ProxyGenerators trong sự phản ánh.

7

Như đã đề xuất, bạn nên sử dụng chú thích AOP và Java. Tôi muốn giới thiệu một cơ chế đọc làm từ jcabi-aspects (Tôi là một nhà phát triển):

@RetryOnFailure(attempts = 3, delay = 5) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 

đọc cũng này bài viết trên blog: http://www.yegor256.com/2014/08/15/retry-java-method-on-exception.html

Cập nhật: Kiểm tra RetryFunc từ Cactoos.

0

Giả sử bạn có một phương pháp, cần phải thử lại sau mỗi 500ms và tối đa 5 lần. lớp hiện tại:

public class RemoteCaller{ 
    Service serviceCaller; 
    public void remoteCall(String message) { 
       serviceCaller.updateDetails(this.message); 
       return null; 
    } 
} 

cách tiếp cận Modified:

public class RetriableHelper<T> implements Callable<T> { 

    private Callable<T> task; 

    private int numberOfRetries; 

    private int numberOfTriesLeft; 

    private long timeToWait; 


    public RetriableHelper(int numberOfRetries, long timeToWait, Callable<T> task) { 
     this.numberOfRetries = numberOfRetries; 
     numberOfTriesLeft = numberOfRetries; 
     this.timeToWait = timeToWait; 
     this.task = task; 
    } 

    public T call() throws Exception { 
     while (true) { 
      try { 
       return task.call(); 
      } catch (InterruptedException e) { 
       throw e; 
      } catch (CancellationException e) { 
       throw e; 
      } catch (Exception e) { 
       numberOfTriesLeft--; 
       if (numberOfTriesLeft == 0) { 
        throw e; 
       } 
       Thread.sleep(timeToWait); 
      } 
     } 
    } 
} 


Backend system/remote call class: 

public class RemoteCaller{ 

    Service serviceCaller; 

    public void remoteCall(String message) { 

     class RemoteCallable implements Callable<Void> { 
      String message; 
      public RemoteCallable(String message) 
      { 
       this.message = message; 
      } 
      public Void call() throws Exception{ 
       serviceCaller.updateDetails(this.message); 
       return null; 
      } 
     } 


     RetriableHelper<Void> retriableHelper = new RetriableHelper<Void>(5, 500, new RemoteCallable(message)); 
     try { 
      retriableHelper.call(); 
     } catch (Exception e) { 
      throw e; 
     } 
    } 
} 
Các vấn đề liên quan