【发布时间】: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