是否需要按顺序在慰问队列中确认消息?

时间:2019-10-21 15:16:20

标签: java solace

我有一些工作线程,它们从不同的提供程序类中提取消息。每个提供程序类都添加/获取内部队列的消息。每个提供者仅迎合一个慰问队列,而慰问者将消息添加到队列的提供者。

多个工作人员可以获取提供者的消息,对其进行处理,然后发送对该消息的确认(以下的message.commit()方法进行确认)。

场景

  1. Worker1从提要1中提取message1进行处理
  2. Worker2从提要1中提取message2进行处理
  3. Worker2在worker1之前完成,因此将确认2发送回确认消息

问题

  1. message2仍会坐在慰问队列上,等待message1被确认,或者尽管message1尚未确认,但message2是否会从队列中弹出?
  2. 收到确认后,安慰硬件上会发生什么?是否已完全删除message2,然后如何维护队列顺序?

提供程序类

    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 个答案:

答案 0 :(得分:1)

这似乎是围绕Solace API的自定义包装。 这使很难为您的问题提供答案,因为我们根本不知道该包装程序在做什么。

以下答案作如下假设。

  1. 包装器使用的是未交易的JCSMPSession

  2. 正在使用客户端确认

  3. message.commit()实际上是在呼叫Solace的XMLMessage.ackMessage()
  4. 您正在使用独占队列
  
      
  1. message2仍将坐在舒适队列上并等待message1被确认,或者尽管message1仍将message2从队列中弹出   还没确认?
  2.   

Message2将被删除。

  
      
  1. 收到确认后,慰问硬件上会发生什么? message2是否已完全删除,队列顺序如何?   维持吗?
  2.   

Message2将被确认并从队列中删除。

对队列顺序没有影响。 消息顺序是指将传入消息传递到使用应用程序的顺序。 在这种情况下,message1,message2和message3依次传递到了消费应用程序。