在Jgroups中使用自定义线程池和执行程序

时间:2015-11-25 17:12:26

标签: java websphere websphere-8 jgroups

如果我们查看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。

完成此操作后,线程全部被管理。

您对如何更轻松地实现这一目标有什么建议吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以注入线程池,有关详细信息,请参阅[1]。

[1] http://www.jgroups.org/manual/index.html#_replacing_the_default_and_oob_thread_pools