项目中使用了非阻塞队列,如下接口目的是实现阻塞队列的处理数据。
public interface IPoller {
public void addResulst(Map resut);
public void handle();
}
这个没有针对queue的关闭,必然会导致在正常退出或者JVM 退出时queue里面的数据不能处理。在使用queue等存储临时数据时必须要安全的关闭,防止数据丢失,如此增加如下处理
public class Poller implements IPoller, BeanFactoryPostProcessor, DisposableBean
private final LinkedBlockingQueue<Map> queue = new LinkedBlockingQueue<Map>();
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.DisposableBean#destroy()
*/
public void destroy() throws Exception {
if (logger.isDebugEnabled()) {
logger.debug("<<<<<<<start to close Poller in container.>>>>>>>>");
}
if (queue != null && queue.size() > 0) {
for (int i = 0; i < queue.size(); i++) {
handle();
logger.debug("<<there is " + queue.size() + "exist in queue.>>");
}
}
}
如此可以将queue里面数据处理完毕再退出, 如果要做进一步处理,可以增加JVM钩子,在JVM退出时也能够处理数据,JVM钩子的使用可以参考这个
http://edu.sun.ac/read/347
但是如上方法都不能保证处理完数据,当数据非常大时,短时间内处理不完,则会强制退出,改天找个例子再验证下。
JAVA源代码中对于关闭的逻辑有不少可以参考,一般会提供给你一个关闭的方法,用于退出时主动关闭。
比如在util.Timer 中可以看到如下的退出逻辑
public void cancel() {
synchronized(queue) {
thread.newTasksMayBeScheduled = false;
queue.clear();
queue.notify(); // In case queue was already empty.
}
}
分享到:
相关推荐
C语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言...
在Delphi编程环境中,队列(QUEUE)是一种常用的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将深入探讨如何在Delphi中使用队列,以及通过一个实际的小例子来加深理解。 首先,我们要...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、Web应用以及游戏等领域。MessageQueue,又称消息队列,是C#中处理异步通信和解耦组件的重要技术。它允许应用程序之间通过消息传递数据,而无需...
标题 "tp5.1消息队列 think-queue" 指的是使用ThinkPHP5.1框架集成的消息队列组件——think-queue。消息队列在软件开发中扮演着重要角色,它允许应用程序异步处理耗时任务,提高系统响应速度和整体性能。think-queue...
文档可能包含`queue`容器的详细描述,如时间复杂度分析、内存管理和与其他STL容器的区别等。此外,还可能涵盖`priority_queue`,这是一个类似`queue`但遵循优先级规则的容器。 总之,`queue`容器在C++编程中扮演着...
使用Promise Queue,开发者可以轻松地控制任务的执行顺序和并发性。例如,在批量上传文件或执行多个API调用时,我们可以先将这些操作封装为返回Promise的函数,然后将它们添加到Promise Queue中。这样,队列会按照...
本文将详细探讨在ThinkPHP5.0.24版本中如何使用Queue队列,以及相关源码分析。 一、队列概念与作用 队列是一种先进先出(FIFO)的数据结构,常用于处理批量数据或者需要后台执行的任务,如邮件发送、日志记录、数据...
默认情况下,`queue`使用`deque`作为底层容器。`queue`的主要操作包括: - `push()`:在队尾添加元素。 - `pop()`:移除并返回队头的元素。 - `front()`:返回队头元素,但不删除。 - `back()`:返回队尾元素(仅当...
"Promise Queue Plus" 就是一个专门为解决此类问题设计的开源库,它基于Promise实现,提供了超时、重试等高级特性,极大地增强了异步任务的处理能力。 Promise 是JavaScript中的一个关键特性,用于处理异步操作,...
在实际应用中,Message Queue、Looper和Handler常用于更新UI、异步处理任务等场景。例如,当在后台线程完成耗时操作后,可以通过Handler将结果发送回主线程,更新UI,避免了直接在非主线程操作UI导致的错误。通过...
Queue 与 Topic 的比较 Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者...
Queue-Queue-Queue
1. **创建队列**: 创建一个空队列可以使用`new Queue()`。例如: ```csharp Queue myQueue = new Queue(); ``` 2. **添加元素(Enqueue)**: 要向队列中添加元素,可以使用Enqueue方法。例如: ```csharp ...
这种特性使得 priority_queue 十分适合解决许多实际问题,例如排队、调度、优先级处理等。 priority_queue 的使用方法 使用 priority_queue 需要包含头文件 `<queue>`,并使用 `std::priority_queue` 类模板。下面...
在本文中,我们将深入探讨如何使用C#编程语言与Windows队列(Windows Queue)进行交互。Windows队列是操作系统提供的一种服务,用于在应用程序之间安全地传输数据,尤其是在多线程和异步处理环境中。在“日本中央...
这段代码与第一段代码的主要区别在于使用了泛型队列`Queue<string>`,其中元素类型为字符串。这意味着队列只能存储字符串类型的数据。 - `public Queue<string> queue;` 声明了一个泛型队列。 - `queue = new Queue...
在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`<queue>`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...
在本文中,我们将深入探讨如何使用C#中的队列数据结构(Queue)来解决简单的并发问题。队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即第一个进入的元素也将是第一个离开的元素。这种特性使得队列在处理...
Message对象包含了消息的内容、目标Handler等信息,通过`MessageQueue.enqueueMessage()`方法添加到队列中。 Handler、Looper和MessageQueue之间的协作流程如下: 1. 在工作线程中,创建一个Handler对象,并关联到...
项目中模拟两个线程,一个线程不断产生数据(例如网络或者蓝牙不断的发数据过来,采用定时器每一段时间接受一次数据)并往队列中插入数据,另一个线程不断的将队列中的数据读出并存到一个txt文件中,因为往硬盘或者...