import java.util.LinkedList;
import java.util.Queue;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class HeaderValidator {
private final Queue<HeaderMetadata> taskQueue = new LinkedList<>();
private final List<HeaderMetadata> failedTasks = new ArrayList<>();
private final ExecutorService executorService = Executors.newFixedThreadPool(10); //Adjust thread pool size
private final int maxFailedTasks = 100; //Limit number of failed tasks to prevent unbounded accumulation
public void enqueueTask(HeaderMetadata task) {
taskQueue.offer(task);
}
public List<HeaderMetadata> getFailedTasks() {
return failedTasks;
}
public void startValidation() {
while (true) {
HeaderMetadata task = taskQueue.poll();
if (task == null) {
break; //Queue is empty
}
executorService.execute(() -> {
try {
validateHeaderMetadata(task);
} catch (Exception e) {
System.err.println("Validation failed for: " + task + ". Error: " + e.getMessage());
failedTasks.add(task);
}
});
}
executorService.shutdown();
try {
executorService.awaitTermination(60, TimeUnit.SECONDS); //Give threads time to finish
} catch (InterruptedException e) {
System.err.println("Executor termination interrupted: " + e.getMessage());
}
}
private void validateHeaderMetadata(HeaderMetadata task) throws Exception {
// Simulate validation logic. Replace with your actual validation checks.
if (!task.isValid()) {
throw new IllegalArgumentException("Header metadata is invalid: " + task);
}
System.out.println("Validation successful for: " + task);
}
//Inner class to represent header metadata
public static class HeaderMetadata {
private final String headerName;
private final String headerValue;
public HeaderMetadata(String headerName, String headerValue) {
this.headerName = headerName;
this.headerValue = headerValue;
}
public String getHeaderName() {
return headerName;
}
public String getHeaderValue() {
return headerValue;
}
public boolean isValid() {
//Replace with your validation logic
return headerValue != null && !headerValue.isEmpty();
}
@Override
public String toString() {
return "HeaderMetadata{" +
"headerName='" + headerName + '\'' +
", headerValue='" + headerValue + '\'' +
'}';
}
}
public static void main(String[] args) throws InterruptedException {
HeaderValidator validator = new HeaderValidator();
//Create some header metadata
List<HeaderMetadata> tasks = new ArrayList<>();
tasks.add(new HeaderMetadata("Content-Type", "application/json"));
tasks.add(new HeaderMetadata("Authorization", "Bearer token"));
tasks.add(new HeaderMetadata("Content-Type", "")); //Invalid
tasks.add(new HeaderMetadata("X-Custom-Header", null)); //Invalid
tasks.add(new HeaderMetadata("User-Agent", "MyApplication/1.0"));
//Enqueue the tasks
for (HeaderMetadata task : tasks) {
validator.enqueueTask(task);
}
//Start the validation process
validator.startValidation();
System.out.println("Validation complete. Failed tasks: " + validator.getFailedTasks());
}
}
Add your comment