我有一些工作线程,它们从不同的提供程序类中提取消息。每个提供程序类都添加/获取内部队列的消息。每个提供者仅迎合一个慰问队列,而慰问者将消息添加到队列的提供者。
多个工作人员可以获取提供者的消息,对其进行处理,然后发送对该消息的确认(以下的message.commit()方法进行确认)。
场景
问题
提供程序类
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();
}
}
}
}
}
答案 0 :(得分:1)
这似乎是围绕Solace API的自定义包装。 这使很难为您的问题提供答案,因为我们根本不知道该包装程序在做什么。
以下答案作如下假设。
包装器使用的是未交易的JCSMPSession
正在使用客户端确认
message.commit()
实际上是在呼叫Solace的XMLMessage.ackMessage()
- message2仍将坐在舒适队列上并等待message1被确认,或者尽管message1仍将message2从队列中弹出 还没确认?
Message2将被删除。
- 收到确认后,慰问硬件上会发生什么? message2是否已完全删除,队列顺序如何? 维持吗?
Message2将被确认并从队列中删除。
对队列顺序没有影响。 消息顺序是指将传入消息传递到使用应用程序的顺序。 在这种情况下,message1,message2和message3依次传递到了消费应用程序。