SMS队列优先级处理

我有比编程更多的逻辑问题,并决定在这里提问。我应该创建一个吞吐量有限的批量短信系统。操作员只能发送2条SMS /秒。我有SMS网站,客户可以在此安排批量生产。每个批量包含不同数量的SMS(1000、2000、10000等),可以在任何时间进行调度。当同时计划2个或更多批量时(例如在15:00点),就会出现问题。我要根据优先级分别执行所有批量,这意味着将不首先执行它们,然后再执行第二,第三等,但是例如要从优先级最高的批量中发送3个SMS,然后发送2个SMS优先级从低到低,然后从优先级最低的那个开始,再从1开始,然后以相同的方式继续,直到发送所有SMS。

PIPIONE
浏览 205回答 2
2回答

慕村9548890

如果您要获取最高优先级的消息,则可以在内存中或从数据库中创建一个简单的优先级队列。但是您打算从所有队列中获取一些消息。这是一个粗略的实现,可以给您一个想法。您可以将其推断为批量方案。import java.util.ArrayList;import java.util.Deque;import java.util.LinkedList;import java.util.List;import java.util.Optional;public final class NQueue{&nbsp; &nbsp; private final List<Deque<String>> queues = new ArrayList<>();&nbsp; &nbsp; private final int[] poll;&nbsp; &nbsp; private int currentIndex;&nbsp; &nbsp; private int queueIndex;&nbsp; &nbsp; private final int pollWidth;&nbsp; &nbsp; public NQueue(int[] poll)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.poll = new int[poll.length];&nbsp; &nbsp; &nbsp; &nbsp; int sum = 0;&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < poll.length; i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int val = poll[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += val;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.poll[i] = sum;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queues.add(new LinkedList<>());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; this.pollWidth = sum;&nbsp; &nbsp; }&nbsp; &nbsp; public synchronized void addMessage(String msg, int priority)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; queues.get(priority).add(msg);&nbsp; &nbsp; }&nbsp; &nbsp; public synchronized Optional<String> removeMessage()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < this.pollWidth; i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; updateQueueIndex();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String msg = queues.get(queueIndex).poll();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentIndex++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (msg != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Optional.of(msg);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return Optional.empty();&nbsp; &nbsp; }&nbsp; &nbsp; private void updateQueueIndex()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (currentIndex == pollWidth)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentIndex = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queueIndex = 0;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else if (currentIndex == this.poll[this.queueIndex])&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queueIndex++;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}样本客户端。//in every run, poll 3 from priority 0, 2 from priority 1 and 1 from priority 2NQueue nQueue = new NQueue(new int[]{3,2,1});nQueue.addMessage("a",0);nQueue.addMessage("b",1);nQueue.addMessage("c",2);nQueue.addMessage("d",1);nQueue.addMessage("e",0);nQueue.addMessage("f",1);nQueue.addMessage("g",1);for (int i = 0; i < 10; i++){&nbsp; &nbsp; Optional<String> s = nQueue.removeMessage();&nbsp; &nbsp; System.out.println("s = " + s);}它打印s = Optional[a]s = Optional[e]s = Optional[b]s = Optional[d]s = Optional[c]s = Optional[f]s = Optional[g]s = Optional.emptys = Optional.emptys = Optional.empty

慕的地8271018

我认为您可以在DB中有2个表:SMS(id,文本,状态,bulk_id)批量(ID,优先级)您可以通过获取所有批量来组织优先级,然后以要对其进行处理的顺序对其进行排序。(或查询已排序的批量)对于每个批量,您可以根据需要(按优先级)获取任意数量的SMS,并发送它们,然后标记它们作为“已发送”。当没有状态为“准备发送”的该批量的SMS时,您将知道批量已处理。这种方法的缺点是您在数据库上的负载更多,但是位置非常狭窄(2SMS /秒),因此这对您来说不是问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java