Java SMS队列优先级处理

Java SMS队列优先级处理,java,queue,Java,Queue,我有比编程更符合逻辑的问题,决定在这里提问。 我应该创建一个吞吐量有限的批量短信系统。操作员每秒只能发送2条短信。我有一个短信网站,客户可以在那里安排大宗商品。每批包含不同数量的SMSE(1000、2000、10000等),可随时安排。当两个或多个散货被安排在同一时间,例如15:00时,问题就会出现。我想根据每个块的优先级执行所有块,这意味着它们中的非块将首先执行,然后执行第二、第三个,例如,从优先级最高的批量发送3个SMSE,然后从优先级较低的批量发送2个SMSE,然后从优先级最低的批量发送1

我有比编程更符合逻辑的问题,决定在这里提问。 我应该创建一个吞吐量有限的批量短信系统。操作员每秒只能发送2条短信。我有一个短信网站,客户可以在那里安排大宗商品。每批包含不同数量的SMSE(1000、2000、10000等),可随时安排。当两个或多个散货被安排在同一时间,例如15:00时,问题就会出现。我想根据每个块的优先级执行所有块,这意味着它们中的非块将首先执行,然后执行第二、第三个,例如,从优先级最高的批量发送3个SMSE,然后从优先级较低的批量发送2个SMSE,然后从优先级最低的批量发送1个SMSE,然后以相同的方式继续发送,直到发送所有SMSE。 我正在寻找某种队列,但您能为我的案例提出任何好的解决方案和数据结构吗

我的解决方案将是Java


谢谢

我想您可以在DB中有两个表:

  • SMSes(标识、文本、状态、批量标识)
  • 批量(id、优先级)
  • 您可以通过获取所有批量来组织优先级,然后按照您想要处理它们的顺序对它们进行排序。(或查询已排序的批量)。对于每个批量,获取您想要的SMSE数量(按优先级)并发送它们,然后将它们标记为“已发送”。 当此批量没有状态为“准备发送”的SMSE时,您将知道已处理批量


    这种方法的缺点是数据库的负载更大,但您的位置很窄(2毫秒/秒),因此这对您来说不会是一个问题。

    如果您获取的是最高优先级的消息,那么一个简单的优先级队列将在内存中或从数据库中工作。但您打算从所有队列中获取一些消息。下面是一个粗略的实现,让您有一个想法。您可以将其外推到批量场景

    import java.util.ArrayList;
    import java.util.Deque;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Optional;
    
    public final class NQueue
    {
        private final List<Deque<String>> queues = new ArrayList<>();
        private final int[] poll;
        private int currentIndex;
        private int queueIndex;
        private final int pollWidth;
    
        public NQueue(int[] poll)
        {
            this.poll = new int[poll.length];
            int sum = 0;
            for (int i = 0; i < poll.length; i++)
            {
                int val = poll[i];
                sum += val;
                this.poll[i] = sum;
                queues.add(new LinkedList<>());
            }
            this.pollWidth = sum;
        }
    
        public synchronized void addMessage(String msg, int priority)
        {
            queues.get(priority).add(msg);
        }
    
        public synchronized Optional<String> removeMessage()
        {
            for (int i = 0; i < this.pollWidth; i++)
            {
                updateQueueIndex();
                String msg = queues.get(queueIndex).poll();
                currentIndex++;
                if (msg != null)
                {
                    return Optional.of(msg);
                }
            }
            return Optional.empty();
        }
    
        private void updateQueueIndex()
        {
            if (currentIndex == pollWidth)
            {
                currentIndex = 0;
                queueIndex = 0;
            }
            else if (currentIndex == this.poll[this.queueIndex])
            {
                queueIndex++;
            }
        }
    }
    

    是否有所有这些短信的DB表?是的,每个短信都会记录在DB中,并有优先级编号
    //in every run, poll 3 from priority 0, 2 from priority 1 and 1 from priority 2
    NQueue 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++)
    {
        Optional<String> s = nQueue.removeMessage();
        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.empty
    s = Optional.empty
    s = Optional.empty