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