All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.taskurotta.recipes.multiplier.TaskCreator Maven / Gradle / Ivy

The newest version!
package ru.taskurotta.recipes.multiplier;

import java.io.Console;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import ru.taskurotta.client.ClientServiceManager;
import ru.taskurotta.client.DeciderClientProvider;

/**
 * Created by void 09.07.13 19:35
 */
public class TaskCreator implements Runnable, ApplicationListener {
    private final static Logger log = LoggerFactory.getLogger(TaskCreator.class);

    private ClientServiceManager clientServiceManager;

    private int count;
    private int threadsCount = 100;
    private ExecutorService executorService = Executors.newFixedThreadPool(threadsCount);

    public static final Lock Monitor = new ReentrantLock(true);
    public static final AtomicBoolean canWork = new AtomicBoolean(false);
    private int multiplier = 1;

    public void createStartTask(final MultiplierDeciderClient deciderClient) {
        log.info("warming up task launcher(s) [{}]...", threadsCount);
        Monitor.lock();

        try {
            log.info("launcher)s) is ready. send missile...");
            canWork.set(false);

            final CountDownLatch latch = new CountDownLatch(count);

            long startTime = System.currentTimeMillis();

            for (int i = 0; i < count; i++) {
                final int a = (int) (Math.random() * 100);
                final int b = (int) (Math.random() * 100);
                log.info(" Task № " + multiplier * i);
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        deciderClient.multiply(a, b);
                        latch.countDown();
                    }
                });
            }
            multiplier++;
            try {
                latch.await();
            } catch (InterruptedException e) {
                log.error("latch.await() about process creations was interrupted", e);
            }

            System.out.printf("       Process creation rate: %8.3f pps\n",
                    1000.0D * count / (System.currentTimeMillis() - startTime));
        } finally {
            canWork.set(true);
            Monitor.unlock();
        }
    }

    public void setClientServiceManager(ClientServiceManager clientServiceManager) {
        this.clientServiceManager = clientServiceManager;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        log.info("onApplicationEvent");
        new Thread(this).start();
    }

    @Override
    public void run() {
        Console console = System.console();

        if (console != null) {
            String line = null;

            DeciderClientProvider clientProvider = clientServiceManager.getDeciderClientProvider();
            MultiplierDeciderClient deciderClient = clientProvider.getDeciderClient(MultiplierDeciderClient.class);

            System.out.println("Press fire to start...");

            while ((line = console.readLine()) != null) {
                createStartTask(deciderClient);
                System.out.println("" + count + " tasks send. Press fire to start again...");
            }
        } else {
            System.out.println("No console available!!");
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy