package fr.openwide.core.jpa.batch.monitor; import java.util.concurrent.Callable; public class ThreadLocalInitializingCallable<T, C> implements Callable<T> { public final Callable<T> callable; public final ThreadLocal<C> threadLocalContext; public final C context; public ThreadLocalInitializingCallable(Callable<T> callable, ThreadLocal<C> threadLocalContext, C context) { this.callable = callable; this.threadLocalContext = threadLocalContext; this.context = context; } @Override public T call() throws Exception { threadLocalContext.set(this.context); try { return callable.call(); } finally { threadLocalContext.remove(); } } }