Skip to content

Instantly share code, notes, and snippets.

@meistermeier
Last active August 29, 2015 14:13
Show Gist options
  • Save meistermeier/f7a5348355dd127a8440 to your computer and use it in GitHub Desktop.
Save meistermeier/f7a5348355dd127a8440 to your computer and use it in GitHub Desktop.
Hystrix for Websphere
import com.netflix.hystrix.HystrixThreadPoolKey;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
import com.netflix.hystrix.strategy.properties.HystrixProperty;
import commonj.work.Work;
import commonj.work.WorkManager;
import javax.naming.InitialContext;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class WorkmanagerHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
@Override
public ThreadPoolExecutor getThreadPool(final HystrixThreadPoolKey threadPoolKey,
HystrixProperty<Integer> corePoolSize, HystrixProperty<Integer> maximumPoolSize,
HystrixProperty<Integer> keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
final ThreadFactory threadFactory = new WorkmanagerThreadFactory();
return new ThreadPoolExecutor(corePoolSize.get(), maximumPoolSize.get(), keepAliveTime.get(), unit, workQueue,
threadFactory);
}
static class WorkmanagerThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
final WorkmanagerThreadManagerThread workmanagerThreadManagerThread = new WorkmanagerThreadManagerThread(r);
workmanagerThreadManagerThread.setContextClassLoader(Thread.currentThread().getContextClassLoader());
return workmanagerThreadManagerThread;
}
}
static class WorkmanagerThreadManagerThread extends Thread {
final Thread runnable;
WorkmanagerThreadManagerThread(Runnable runnable) {
this.runnable = new ClassloaderSettingThread(runnable);
}
@Override
public synchronized void start() {
try {
InitialContext ctx = new InitialContext();
WorkManager workManager = (WorkManager) ctx.lookup("wm/default");
workManager.schedule(new WorkmanageWork(runnable));
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void setContextClassLoader(ClassLoader cl) {
runnable.setContextClassLoader(cl);
}
}
static class WorkmanageWork implements Work {
final Thread runnable;
WorkmanageWork(Thread runnable) {
this.runnable = runnable;
}
@Override
public void release() {
}
@Override
public boolean isDaemon() {
return true;
}
@Override
public void run() {
runnable.start();
}
}
static class ClassloaderSettingThread extends Thread {
private final Runnable runnable;
private ClassLoader myClassLoader;
ClassloaderSettingThread(Runnable runnable) {
this.runnable = runnable;
}
@Override
public void setContextClassLoader(ClassLoader cl) {
myClassLoader = cl;
}
@Override
public ClassLoader getContextClassLoader() {
return myClassLoader;
}
@Override
public synchronized void start() {
Thread.currentThread().setContextClassLoader(getContextClassLoader());
runnable.run();
}
}
}
@meistermeier
Copy link
Author

Don't forget to register the class somewhere before Hystrix get initialized:
HystrixPlugins.getInstance().registerConcurrencyStrategy(new WorkmanagerHystrixConcurrencyStrategy());

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment