繁体   English   中英

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

[英]Using custom thread pool and executors in 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's”start方法时委托给TaskExecutor。 我忽略了线程重命名功能,因为这不会有任何影响。

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);
    }
}

这是我遇到问题的地方。 问题出在运输方面。 在许多内部可运行的run方法中,例如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]。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM