`
dingjob
  • 浏览: 183230 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用queue等要 优雅的关闭

阅读更多

项目中使用了非阻塞队列,如下接口目的是实现阻塞队列的处理数据。

 

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. 
} 
}

 

分享到:
评论
4 楼 swen00 2010-05-17  
weiqiang.yang 写道
现在我们做的某项目重启脚本是这么做的
stop server
sleep 25s
kill -9 xxx
stop之后将队列的数据持久化一下,启动的时候重新读取~~
因为数据量不是很大,25s足够了~~


你这样做也不够好,应该先入库再放队列,你能保证机器不出问题突然当掉么...
3 楼 weiqiang.yang 2010-05-15  
现在我们做的某项目重启脚本是这么做的
stop server
sleep 25s
kill -9 xxx
stop之后将队列的数据持久化一下,启动的时候重新读取~~
因为数据量不是很大,25s足够了~~
2 楼 swen00 2010-05-15  
sdh5724 写道
kill -9

LZ 帖子内容无法解决此问题,只有先入库再放队列,至于销毁就不要去管了..
1 楼 sdh5724 2010-05-14  
kill -9

相关推荐

    C语言头文件 QUEUE.H

    C语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言头文件 QUEUE.HC语言...

    delphi中关于队列的使用QUEUE

    在Delphi编程环境中,队列(QUEUE)是一种常用的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将深入探讨如何在Delphi中使用队列,以及通过一个实际的小例子来加深理解。 首先,我们要...

    C# MessageQueue示例

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用、Web应用以及游戏等领域。MessageQueue,又称消息队列,是C#中处理异步通信和解耦组件的重要技术。它允许应用程序之间通过消息传递数据,而无需...

    STL容器queue的使用

    文档可能包含`queue`容器的详细描述,如时间复杂度分析、内存管理和与其他STL容器的区别等。此外,还可能涵盖`priority_queue`,这是一个类似`queue`但遵循优先级规则的容器。 总之,`queue`容器在C++编程中扮演着...

    前端开源库-promise-queue

    使用Promise Queue,开发者可以轻松地控制任务的执行顺序和并发性。例如,在批量上传文件或执行多个API调用时,我们可以先将这些操作封装为返回Promise的函数,然后将它们添加到Promise Queue中。这样,队列会按照...

    thinkphp5.0.24+queue 队列信息完整源码

    本文将详细探讨在ThinkPHP5.0.24版本中如何使用Queue队列,以及相关源码分析。 一、队列概念与作用 队列是一种先进先出(FIFO)的数据结构,常用于处理批量数据或者需要后台执行的任务,如邮件发送、日志记录、数据...

    vc++中队列deque和queue的使用

    默认情况下,`queue`使用`deque`作为底层容器。`queue`的主要操作包括: - `push()`:在队尾添加元素。 - `pop()`:移除并返回队头的元素。 - `front()`:返回队头元素,但不删除。 - `back()`:返回队尾元素(仅当...

    tp5.1消息队列 think-queue

    标题 "tp5.1消息队列 think-queue" 指的是使用ThinkPHP5.1框架集成的消息队列组件——think-queue。消息队列在软件开发中扮演着重要角色,它允许应用程序异步处理耗时任务,提高系统响应速度和整体性能。think-queue...

    前端开源库-promise-queue-plus

    "Promise Queue Plus" 就是一个专门为解决此类问题设计的开源库,它基于Promise实现,提供了超时、重试等高级特性,极大地增强了异步任务的处理能力。 Promise 是JavaScript中的一个关键特性,用于处理异步操作,...

    活用Android的Message Queue

    在实际应用中,Message Queue、Looper和Handler常用于更新UI、异步处理任务等场景。例如,当在后台线程完成耗时操作后,可以通过Handler将结果发送回主线程,更新UI,避免了直接在非主线程操作UI导致的错误。通过...

    Queue与Topic的比较

    Queue 与 Topic 的比较 Queue 和 Topic 是 JMS(Java Message Service)中两种基本的消息模式,分别对应 Point-to-Point 和 Publish/Subscribe 模式。 Queue 模式 在 Queue 模式中,一条消息仅能被一个消费者...

    Queue-Queue-Queue

    Queue-Queue-Queue

    C# 队列(Queue)的使用

    1. **创建队列**: 创建一个空队列可以使用`new Queue()`。例如: ```csharp Queue myQueue = new Queue(); ``` 2. **添加元素(Enqueue)**: 要向队列中添加元素,可以使用Enqueue方法。例如: ```csharp ...

    STL中priority_queue

    这种特性使得 priority_queue 十分适合解决许多实际问题,例如排队、调度、优先级处理等。 priority_queue 的使用方法 使用 priority_queue 需要包含头文件 `&lt;queue&gt;`,并使用 `std::priority_queue` 类模板。下面...

    C#对Windows Queue的完美操作

    在本文中,我们将深入探讨如何使用C#编程语言与Windows队列(Windows Queue)进行交互。Windows队列是操作系统提供的一种服务,用于在应用程序之间安全地传输数据,尤其是在多线程和异步处理环境中。在“日本中央...

    Unity3d 队列 方法 Queue

    这段代码与第一段代码的主要区别在于使用了泛型队列`Queue&lt;string&gt;`,其中元素类型为字符串。这意味着队列只能存储字符串类型的数据。 - `public Queue&lt;string&gt; queue;` 声明了一个泛型队列。 - `queue = new Queue...

    C++ Queue(带上限的)

    在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`&lt;queue&gt;`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...

    Handler Looper MessageQueue 源码解析

    Message对象包含了消息的内容、目标Handler等信息,通过`MessageQueue.enqueueMessage()`方法添加到队列中。 Handler、Looper和MessageQueue之间的协作流程如下: 1. 在工作线程中,创建一个Handler对象,并关联到...

    Queue在多线程中的使用

    项目中模拟两个线程,一个线程不断产生数据(例如网络或者蓝牙不断的发数据过来,采用定时器每一段时间接受一次数据)并往队列中插入数据,另一个线程不断的将队列中的数据读出并存到一个txt文件中,因为往硬盘或者...

    使用dev_queue_xmit、dev_hard_start_xmit的方法实现数据包的发送.docx )

    ### 使用`dev_queue_xmit`与`dev_hard_start_xmit`方法实现数据包发送 在Linux内核开发中,网络栈的功能实现极为关键。本文旨在深入解析如何利用`dev_queue_xmit`和`dev_hard_start_xmit`这两个核心函数来实现...

Global site tag (gtag.js) - Google Analytics