【问题标题】:Handling items in queue when other end fails to receive另一端收不到时处理队列中的项目
【发布时间】:2015-01-19 11:37:50
【问题描述】:

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

@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 multithreading queue message-queue


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您还可以将失败的MyItems 移动到另一个failedItemQueue 和相关线程,您可以在其中执行所有错误报告并执行延迟重新发送尝试,可能使用Thread.sleep

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多