Нужно ли подтверждать сообщения в очереди утешения в том порядке, в котором они находятся в очереди? - PullRequest
1 голос
/ 21 октября 2019

У меня есть рабочие потоки, которые получают сообщения от разных классов провайдеров. Каждый класс провайдера добавляет / принимает сообщения внутренней очереди. Каждый поставщик обслуживает только одну очередь утешения, а потребитель утешения добавляет сообщения поставщику очереди.

Несколько работников могут принимать сообщения провайдера, обрабатывать их и затем отправлять подтверждение для сообщения (метод message.commit () ниже выполняет подтверждение).

Сценарий

  1. Рабочий1 получает сообщение1 для обработки от провайдера1
  2. Рабочий2 получает сообщение2 для обработки от провайдера1
  3. Worker2 завершает работу перед worker1, поэтому отправляет подтверждение для сообщения2

ВОПРОС

  1. Будет ли message2 все еще сидеть в очереди утешения и ждатьсообщение1 будет подтверждено или сообщение2 будет удалено из очереди, несмотря на то, что сообщение1 еще не подтверждено?
  2. Что происходит на оборудовании для утешения при получении подтверждения? Сообщение2 полностью удалено, как тогда поддерживается порядок очереди?

Класс провайдера

    public abstract class BaseProvider implements IProvider {

     private LinkedBlockingQueue<CoreMessage> internalQueue = new LinkedBlockingQueue<CoreMessage>();

    @Override
    public synchronized List<CoreMessage> getNextQueuedItem() {
        List<CoreMessage> arrMessages = new ArrayList<CoreMessage>();
        if (internalQueue.size() > 0) {
            Logger.debug("Queue has entries");
            CoreMessage msg = null;
            try {
                msg = internalQueue.take();
            } catch (InterruptedException e) {
                Logger.warn("Interruption");
                e.printStackTrace();
            }
            if (msg != null) {
                arrMessages.add(msg);
            }
        }
        return arrMessages;
    }

    protected synchronized void addToQueue(CoreMessage message) {
        try {
            internalQueue.put(message);
        } catch (InterruptedException e) {
            Logger.error("Exception adding message to queue " + message);
        }
    }
}

// Существует набор рабочих потоков, которые читают этиочереди

  public class Worker implements Runnable 
    @Override
    public void run() {
    Logger.info("Worker - Running Thread : " + Thread.currentThread().getName());

    while (!stopRequested) {
        boolean processedMessage = false;
        for (IProvider provider : providers) {
            List<CoreMessage> messages = provider.getNextQueuedItem();
            if (messages == null || messages.size() != 0) {
                processedMessage = true;
                for (CoreMessage message : messages) {
                    final Message msg = createEndurMessage(provider, message);
                    processMessage(msg);
                    message.commit();
                }
            }
        }
        if (!(processedMessage || stopRequested)) {
            // this is to stop the thread from spinning when there are no messages
            try {
                Thread.sleep(WAIT_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
}

1 Ответ

1 голос
/ 22 октября 2019

Похоже, это ваша пользовательская оболочка для Solace API. Это очень затрудняет предоставление ответов на ваш вопрос, потому что мы просто не знаем, что делает эта оболочка.

Ответы ниже делают следующие предположения.

  1. Оболочка использует нетранзакционную JCSMPSession

  2. Используется подтверждение клиента

  3. message.commit() фактически вызывает Solace's XMLMessage.ackMessage()
  4. Вы используете исключительную очередь
  1. Будет ли message2 все еще сидеть в очереди утешения и ждать, пока сообщение1 будет подтверждено, или сообщение2 будет удалено из очереди, несмотря на то, что сообщение1 еще не подтверждено?

Сообщение2 будет удалено.

Что происходит на оборудовании для утешения при получении подтверждения? Сообщение 2 полностью удалено, как тогда поддерживается порядок очереди?

Сообщение 2 будет подтверждено и удалено из очереди.

Нет никакого влияния на порядок очереди. Порядок сообщений относится к порядку, в котором входящие сообщения доставляются потребляющему приложению. В этом случае message1, message2 и message3 были доставлены потребляющему приложению в порядке.

...