java - 当另一端无法接收时处理队列中的项目

标签 java multithreading queue message-queue

我正在为一个系统开发一个插件,该插件捕获该系统中的一些事件,将它们包装成可食用的格式,然后推送到另一个系统进行分析。插件产生的开销必须尽可能低。所以到目前为止,我捕获该事件并将其插入阻塞队列,另一个线程正在监听,如果队列获取一个项目,它将尝试将其从系统中推出。我的代码:

@Override
public void start(){
    StatsManager statsManager = new StatsManager();
}

//catch event
public void taskFinished(){
    statsManager.pushData(Context.getData());
}

统计管理器:

private BlockingQueue<MyItem> blockingQueue;

public StatsManager(){
    blockingQueue = new ArrayBlockingQueue<MyItem>(32768);
    SenderThread sender = new SenderThread(blockingQueue);
    new Thread(sender).start();
}

public void pushData(MyItem item){
    try {
        blockingQueue.put(item);
    } catch (InterruptedException e) {
        logger.error(e.toString());
        Thread.currentThread().interrupt();
    }
}


private class SenderThread implements Runnable{

    private BlockingQueue<MyItem> blockingQueue;

    public SenderThread(BlockingQueue<MyItem> queue){
        blockingQueue = queue;
    }

    @Override
    public void run() {
        while (true){
            try {
                MyItem item = blockingQueue.take();
                postItem(item);

            } catch (InterruptedException e) {
                logger.error(e.toString());
                Thread.currentThread().interrupt();
            }
        }
    }

问题是 - 如何处理向另一端发送项目失败的情况?我尝试过可以将项目放回到队列中,但这会导致 while 循环变得疯狂并不断尝试发送。尝试从异常中了解系统的问题并以某种方式智能地增加 thread.Sleep() 的值是否有意义?

我也在考虑以某种方式写下数据,但我试图了解我是否真的需要它?我对这些东西非常缺乏经验,所以请指出我没有预见到的其他可怕问题。

如果相关,我估计 24 小时内会推送 50000 个项目。

最佳答案

是的,您当然应该检查错误的原因并明智地决定如何处理该问题。

您可能还需要部分根据消息的性质做出决定。

将它们放回主队​​列将是一个错误。我建议保留等待重新发送的失败消息的内部队列。然后,您可以轮询循环中的两个队列。

关于java - 当另一端无法接收时处理队列中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27059424/

相关文章:

java - 使用 Mockito,如何在 void 方法上拦截回调对象?

java - Android依赖问题

c - Linux 系统克隆。释放堆栈内存

queue - Asterisk 队列上下文不起作用

c - 为什么队列和栈声明为指针?

Java JDBC rowset 到 tocollection() 方法的使用

java - Android:ListView中的文件列表

c++ - Windows 线程 : when should you use InterlockedExchangeAdd()?

java - java中线程结束后如何删除文件?

c - 当函数有 void* 参数时如何在函数中传递参数?