如果我们查看Jgroups的 DefaultThreadFactory ,则会出现以下代码
protected Thread newThread(Runnable r,String name,String addr,String cluster_name) {
String thread_name=getNewThreadName(name, addr, cluster_name);
Thread retval=new Thread(r, thread_name);
retval.setDaemon(createDaemons);
return retval;
}
当使用新线程时,我相信托管服务器环境会导致问题,也不是一个好习惯。
如果我只是用Managed工厂和WebSphere的执行者替换默认的线程工厂和执行器,那么Jgroups的行为是否仍然相同?
任何指针都会有所帮助..?
我的目的是将JGroups与WebSphere AS 8.5一起使用。我渴望没有任何未经管理的线程。我的主要用例是领导者选举和一些消息传递。它将用于管理Spring Integration轮询器,并确保只有一个轮询器在群集中运行。
WAS 8.5仍然使用CommonJ api进行工作管理。
我使用Spring来抽象Task Executors和Scheduler。
最初很容易用任务执行器替换ThreadPools,因为它们共享Executor api。
TaskScheduler必须适应您的TimeScheduler界面。 它们非常相似,也许从ScheduledExecutorService扩展可能是一个选项。我实现了你的界面并委托给Springs TaskScheduler。
主要问题在于ThreadFactory。 CommonJ没有这个概念。为此,我创建了一个ThreadWrapper,它封装了Runnable,并在" Thread'#34;调用start方法。我忽略了线程重命名功能,因为这不会产生任何影响。
public Thread newThread(Runnable command) {
log.debug("newThread");
RunnableWrapper wrappedCommand = new RunnableWrapper(command);
return new ThreadWrapper(taskExecutor, wrappedCommand);
}
public synchronized void start() {
try {
taskExecutor.execute(runnableWrapper);
} catch (Exception e) {
throw new UnableToStartException(e);
}
}
这是我遇到问题的地方。问题出在运输方面。在许多情况下,在一些内部可运行的运行方法中,例如在DiagnosticsHandler,TP的TransferQueueBundler和GMS的ViewHandler中都有一个用于检查线程的while语句。
public class DiagnosticsHandler implements Runnable {
public void run() {
byte[] buf;
DatagramPacket packet;
while(Thread.currentThread().equals(thread)) {
//...
}
}
}
protected class TransferQueueBundler extends BaseBundler implements Runnable {
public void run() {
while(Thread.currentThread() == bundler_thread) {
//...
}
}
}
class ViewHandler implements Runnable {
public void run() {
long start_time, wait_time; // ns
long timeout=TimeUnit.NANOSECONDS.convert(max_bundling_time, TimeUnit.MILLISECONDS);
List<Request> requests=new LinkedList<>();
while(Thread.currentThread().equals(thread) && !suspended) {
//...
}
}
}
这不与我们的线程包装合作。如果可以改变它以便在存储的线程上调用equals方法,则可以覆盖它。
从各种片段中可以看出,各种实施和保护级别各不相同,包括保护和保护。这增加了扩展课程的难度。
完成所有这些后,它仍然没有完全删除非托管线程的问题。
我正在使用创建协议堆栈的属性文件方法。一旦设置了属性,这将初始化协议栈。删除底部协议创建的Timer线程。必须在初始化堆栈之前设置TimeScheduler。
完成此操作后,线程全部被管理。
您对如何更轻松地实现这一目标有什么建议吗?
答案 0 :(得分:0)
是的,您可以注入线程池,有关详细信息,请参阅[1]。
[1] http://www.jgroups.org/manual/index.html#_replacing_the_default_and_oob_thread_pools