В очереди только последнее сообщение - PullRequest
0 голосов
/ 30 апреля 2018

У меня небольшая проблема с приложением.

У меня есть 3 темы: Main, Producer - прочитать какой-нибудь файл и Consumer - показать построчно прочитанный файл;

Краткая версия основных классов здесь:

MAIN.class

 for (int i = 0; i < args.length; i++) {
        List<Thread> threadList = new ArrayList<Thread>();
        String file = args[i];
        int queueSize = 10;
        int waitTime = 200;
        BlockingQueue queue = new LinkedBlockingQueue(queueSize);



            Reader reader = (Reader) context.getBean("reader");
            Writer writer = (Writer) context.getBean("writer");


            Handler handler = (Handler) context.getBean("Handler", writer, reader, queueSize);
            Producer producer = (Producer) context.getBean("Producer", handler, queue, waitTime);
            Consumer consumer = (Consumer) context.getBean("Consumer", handler, queue, waitTime);

            handler.setFile(file, extension.get(0));
            threadList.add(new Thread(producer, "Producer"));
            threadList.add(new Thread(consumer, "Consumer"));

            for (Thread thread : threadList) {
                thread.start();
            }

            for (Thread thread : threadList) {
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    System.err.println("Interrupted Exception thrown by : " + thread.getName());
                }
            }
        } else break;

}

HANDLER.class

public Handler(Writer writer, Reader reader, int count) {

    this.reader = reader;
    this.writer = writer;
    queue = new LinkedBlockingQueue(count);

}

public void getHandle(LinkedList list) {

    writer.Printer(list);

}


public LinkedList setHandle(String string, int line) {

    reader.objectReader(string, getFileName(), line);
    return reader.getList();

}

CONSUMER.class

    public Consumer(Handler handler, BlockingQueue queue, int waitTime) {
    this.queue = queue;
    this.handler = handler;
    this.waitTime = waitTime;
}


@Override
public void run() {

    while (!isEnd()) {

        try {

            handler.getHandle(queue.poll(waitTime, MILLISECONDS));

        } catch (Exception e) {
            System.err.println(e);

        }
    }

}


private boolean isEnd() {

    if (queue.isEmpty() && handler.isFileEnd()) {
        return true;
    } else {
        return false;
    }
}

PRODUCER.class

public Producer(Handler handler, BlockingQueue queue, int waitTime) {
    this.queue = queue;
    this.handler = handler;
    this.waitTime = waitTime;


}

@Override
public void run() {

    try {


        if (handler.getFileExtension().equals("xlsx")) {
            xlsxCheck(handler.getFile());

        } else {
            Stream stream = Files.lines(getFilePath());
            Iterator iterator = stream.iterator();
            String string = (String) iterator.next();

            while (string != null) {

         queue.offer(handler.setHandle(string , i), waitTime, MILLISECONDS);

                if (!iterator.hasNext()) {

                    setFileEnd(true);
                    System.out.println("produce stop");
                    Thread.sleep(100);
                    break;
                }
                string = (String) iterator.next();
                i++;
            }

        }
    } catch (Exception e) {
        System.out.println("Error: " + e);
    } 

}

И первой из моих проблем было то, что классы Producer и Main остановились, когда Consumer находился в состоянии WAIT, но я решил это с помощью метода poll () BlockingQueue. И второе, когда я читаю файл, я вижу в моей консоли следующие строки:

  1. Поставить в очередь [2, 200, order2, 1.csv, 2, OK] --- i --- 2
  2. Поставить в очередь [3, 200, order3, 1.csv, 3, OK] --- i --- 3
  3. Поставить в очередь [4, 200, order4, 1.csv, 4, OK] --- i --- 4
  4. Поставить в очередь [5, 200, order5, 1.csv, 5, OK] --- i --- 5
  5. Поставить в очередь [6, 200, order6, 1.csv, 6, OK] --- i --- 6
  6. Поставить в очередь [7, 200, order7, 1.csv, 7, OK] --- i --- 7
  7. Поставить в очередь [8, 200, order8, 1.csv, 8, OK] --- i --- 8

Это хорошо.

Но после, я вижу

  1. {}
  2. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  3. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  4. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  5. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  6. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  7. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}
  8. { "ID": "8", "количество": "200", "комментарий": "order8", "имя файла": "1.csv", "линия": 8, "результат": "OK «}

Неправильно, что у меня 8 раз только последняя строка. И я не могу понять, почему.

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 07 мая 2018

Это было странно, но нужно было создавать новый список каждый шаг при чтении файла в reader.objectReader ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...