Last active
August 29, 2015 14:13
-
-
Save meistermeier/f7a5348355dd127a8440 to your computer and use it in GitHub Desktop.
Hystrix for Websphere
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Don't forget to register the class somewhere before Hystrix get initialized:
HystrixPlugins.getInstance().registerConcurrencyStrategy(new WorkmanagerHystrixConcurrencyStrategy());