1. import java.util.concurrent.Executors;
  2. import java.util.concurrent.ScheduledExecutorService;
  3. import java.util.concurrent.TimeUnit;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. public class MetadataRetrier {
  7. private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
  8. public static void main(String[] args) {
  9. // Example usage: Define metadata retry tasks
  10. Map<String, MetadataRetryTask> tasks = new HashMap<>();
  11. tasks.put("metadata1", new MetadataRetryTask("metadata1", 3, 5)); // Retry 3 times, wait 5 seconds
  12. tasks.put("metadata2", new MetadataRetryTask("metadata2", 5, 10)); // Retry 5 times, wait 10 seconds
  13. // Schedule the tasks to run
  14. for (MetadataRetryTask task : tasks.values()) {
  15. scheduleRetry(task);
  16. }
  17. // Keep the main thread alive (optional, for continuous running)
  18. try {
  19. Thread.sleep(60 * 60 * 1000); // Run for 1 hour
  20. } catch (InterruptedException e) {
  21. Thread.currentThread().interrupt();
  22. } finally {
  23. scheduler.shutdown(); // Shutdown the scheduler gracefully
  24. }
  25. }
  26. private static void scheduleRetry(MetadataRetryTask task) {
  27. scheduler.scheduleAtFixedRate(() -> {
  28. try {
  29. // Perform the metadata operation here
  30. boolean success = performMetadataOperation(task.metadataName);
  31. if (!success) {
  32. System.out.println("Metadata operation failed for " + task.metadataName + ". Retrying...");
  33. // Optionally add a delay before the next retry
  34. try {
  35. Thread.sleep(task.delay);
  36. } catch (InterruptedException e) {
  37. Thread.currentThread().interrupt();
  38. }
  39. } else {
  40. System.out.println("Metadata operation successful for " + task.metadataName);
  41. }
  42. } catch (Exception e) {
  43. System.err.println("An error occurred during metadata operation for " + task.metadataName + ": " + e.getMessage());
  44. // Optionally add a delay before the next retry
  45. try {
  46. Thread.sleep(task.delay);
  47. } catch (InterruptedException e) {
  48. Thread.currentThread().interrupt();
  49. }
  50. }
  51. }, 0, task.interval, TimeUnit.SECONDS);
  52. }
  53. // Define a task for retrying a specific metadata operation
  54. static class MetadataRetryTask {
  55. String metadataName;
  56. int retries;
  57. long delay;
  58. public MetadataRetryTask(String metadataName, int retries, long delay) {
  59. this.metadataName = metadataName;
  60. this.retries = retries;
  61. this.delay = delay;
  62. }
  63. }
  64. // Placeholder for the actual metadata operation. Replace with your code.
  65. private static boolean performMetadataOperation(String metadataName) {
  66. // Simulate a metadata operation that might fail
  67. if (metadataName.equals("metadata1")) {
  68. return Math.random() < 0.5; // 50% chance of failure
  69. } else if (metadataName.equals("metadata2")) {
  70. return Math.random() < 0.7; // 70% chance of failure
  71. }
  72. return true; // Assume success for other metadata names
  73. }
  74. }

Add your comment