private void submit(Object input) throws InterruptedException {
        Job job = new Job(input, nextMessageId++);
        window.reserveCell();
        while (true) {
            int map = freeWorkerMap.findSetBits();
            for (int wid : freeWorkerMap.getCombination(map)) {
                logger.debug("try submit to {}", wid);
                if (workers[wid].submit(job)) {
                    return;
                }
            }
            freeWorkerMap.clearBits(map);
        }
    }