`
chhj_292
  • 浏览: 37575 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

生产消费模式应用之-使用中断队列实现的日志记录器

阅读更多

包含三个功能类(1~3)以及一个测试类(4):

  1. AbstractLogger
  2. LoggerConsumption
  3. LoggerProduction
  4. LoggerTester

相 信看类名大家已经知道了这是个生产-消费的应用。
非常冒昧的把代码加入了com.taobao.log.* 这个package,尽管这只是个测试。

 

以下是代码区域:

 

package com.taobao.log;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 使用了生产消费模式,并使用了中断队列的日志基类。
 * 
 * @author <a href="mailto:haojun.chenghj@163.com"><b>chenghaojun</b></a>,wangwang:tbjaver(Taobao site)
 * @since 
 * @see LoggerProduction
 * @see LoggerConsumption
 * @version $Id:AbstractLogger.java 2010-3-18 $
 */

public abstract class AbstractLogger implements Runnable {

	/** 初始日志队列大小 */
	private static final int				ITEMS_SIZE			= 100;

	/** 关闭日志标识 */
	protected static final String			SHUTDOWN_REQ		= "SHUTDOWN";

	/** 使用中断队列的日志池,用于追加或者获取数据 */
	private static BlockingQueue<String>	loggerPool			= null;

	private volatile boolean				loggerShuttingDown	= false;
	private volatile boolean				loggerTerminated	= false;

	static {
		loggerPool = new ArrayBlockingQueue<String>(ITEMS_SIZE);
	}

	/** 只允许子类获取的日志池 */
	protected BlockingQueue<String> getLoggerPool() {
		return loggerPool;
	}

	/**
	 * 定义方法模板,强制让子类实现此方法。
	 */
	public abstract void run();

	/**================================================*/
	public boolean isLoggerShuttingDown() {
		return loggerShuttingDown;
	}

	public void setLoggerShuttingDown(boolean loggerShuttingDown) {
		this.loggerShuttingDown = loggerShuttingDown;
	}

	public boolean isLoggerTerminated() {
		return loggerTerminated;
	}

	public void setLoggerTerminated(boolean loggerTerminated) {
		this.loggerTerminated = loggerTerminated;
	}
}

 

 

package com.taobao.log;

/**
 * 生产消费模式中的消费者,不断的从队列中获取并输出日志。
 * 
 * @author <a href="mailto:haojun.chenghj@163.com"><b>chenghaojun</b></a>,wangwang:tbjaver(Taobao site)
 * @since 
 * @see 
 * @version $Id:LoggerConsumption.java 2010-3-18 $
 */

public class LoggerConsumption extends AbstractLogger {
	private static final LoggerConsumption	loggerConsumption	= new LoggerConsumption();

	public static LoggerConsumption getInstance() {
		return loggerConsumption;
	}

	private LoggerConsumption() {
	}

	@Override
	public void run() {
		try {
			String log = null;
			while (!(log = getLoggerPool().take())
					.equalsIgnoreCase(SHUTDOWN_REQ)) {
				System.out.println(log);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			setLoggerTerminated(true);
		}
	}
}
 

 

package com.taobao.log;

/**
 * 生产消费模式中的生产者,不断的往日志队列中加入新的日志
 * @author <a href="mailto:haojun.chenghj@163.com"><b>chenghaojun</b></a>,wangwang:tbjaver(Taobao site)
 * @since 
 * @see 
 * @version $Id:LoggerThread.java 2010-3-18 $
 */

public class LoggerProduction extends AbstractLogger {

	private static final LoggerProduction	loggerProduction	= new LoggerProduction();

	public static LoggerProduction getInstance() {
		return loggerProduction;
	}

	private LoggerProduction() {
	}

	@Override
	public void run() {
		for (;;) {
			String log = "sorry, I come to fuck you!";
			log(log);
		}
	}

	public void log(String str) {
		if (isLoggerShuttingDown() || isLoggerTerminated())
			return;
		try {
			getLoggerPool().put(str);
		} catch (InterruptedException e) {
			Thread.currentThread().interrupt();
			throw new RuntimeException("程序发生意料之外的中断,错误消息:" + e.getMessage());
		}
	}

	public void shutDown() throws InterruptedException {
		setLoggerShuttingDown(true);
		getLoggerPool().put(SHUTDOWN_REQ);
	}

}
 

 

package com.taobao.log;

/**
 * just a tester
 * @author <a href="mailto:haojun.chenghj@163.com"><b>chenghaojun</b></a>,wangwang:tbjaver(Taobao site)
 * @since 
 * @see 
 * @version $Id:LoggerMain.java 2010-3-18 $
 */

public class LoggerTester {
	public static void main(String[] args) {
		Thread production = new Thread(LoggerProduction.getInstance());
		Thread consumption = new Thread(LoggerConsumption.getInstance());
		production.start();
		consumption.start();
	}
}
 
0
0
分享到:
评论

相关推荐

    RabbitMQ生产者消费者测试

    RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议实现的消息队列系统,被广泛应用于分布式系统、微服务架构以及任务调度等多个领域。本主题将深入探讨“RabbitMQ生产者消费者测试”的相关知识点。 ...

    ESWIN-EAM2011实现CAN和CAN FD通信(中断)

    ESWIN-EAM2011可能内置了调试功能,如日志记录、错误检查和模拟通信等功能,帮助开发者定位问题。 综上所述,"ESWIN-EAM2011实现CAN和CAN FD通信(中断)"涉及到的关键知识点包括CAN总线的基础原理、CAN FD的高速...

    java多线程处理教学案例

    本教学案例将深入探讨如何在Java中实现多线程,并通过一个具体的生产者消费者模式来进一步阐述其核心概念。 1. **Java线程创建** - **继承Thread类**:创建一个新的类,该类继承自`Thread`类,并重写`run()`方法。...

    websphere MQ 练习

    - 使用 `runmqlsr` 命令检查本地是否存在同名的队列管理器。 - 使用 `dspmq` 命令查看队列管理器的状态。 - 使用 `crtmqm` 命令创建新的队列管理器,并指定相应的参数。 2. **启动队列管理器**: - 使用 `...

    Python库 | python_logging_rabbitmq-1.1.1-py2.py3-none-any.whl

    3. 配置日志记录器:将`RabbitMQHandler`添加到Python的日志记录器中,并设置合适的日志级别。 4. 使用日志:在代码中调用`logging`模块的方法,如`logging.info()`或`logging.error()`,记录日志信息。 5. 配置...

    NXP i.MX RT1052实现UCOSIII任务内建消息队列【支持RT105X系列控制器_UCOS实战】.zip

    在本项目中,我们关注的是基于NXP i.MX RT1052微控制器实现的UCOSIII操作系统中的任务间通信机制,特别是消息队列的使用。NXP i.MX RT1052是一款高性能、低延迟的跨界处理器,特别适合实时应用。它集成了ARM Cortex-...

    海思gpio按键驱动(利用中断)源代码

    中断服务程序(ISR,Interrupt Service Routine)会处理中断事件,这里的任务通常是记录按键事件并唤醒等待的用户空间进程。 三、驱动程序结构 1. **初始化**:在驱动加载时,需要注册GPIO引脚,将其配置为输入并...

    WebSphere MQ开发教程

    - 应用场景:利用MQ集群特性,可以将消息均匀分布到多个队列管理器中处理,从而实现负载均衡。 4. **容错与恢复** - 应用场景:MQ提供了持久化存储选项,确保即使在系统崩溃或网络中断的情况下,消息也不会丢失。...

    WebSphere MQ for i5/OS 系统管理员

    - **队列管理器**:队列管理器是 WebSphere MQ 的核心组件之一,负责管理消息队列和其他相关资源。它可以独立运行,也可以作为更大的系统架构的一部分。 - **通道**:通道是两个队列管理器之间建立的连接,用于消息...

    《深入RabbitMQ》.pdf.zip

    9. **监控与日志**:了解如何使用RabbitMQ的管理界面和各种工具进行性能监控和故障排查,以及如何配置日志记录。 10. **实战案例**:书中可能会提供多个实际应用场景,如Web应用的异步任务处理、微服务间的通信等,...

    AN0009-RT-Thread-使用 SystemView 分析工具1

    - **兼容性要求**:由于 SystemView 使用 J-Link 的 RTT 技术,因此需要使用 J-Link 调试器进行连接。 3. 使用 SystemView 的步骤: - **添加 demo 代码**:在项目中集成 SystemView 的初始化代码,以便开始收集...

    Weblogic使用手册大全详解(中文).pdf

    - **创建域日志过滤器**:根据需要定制日志记录规则,提高日志的有效性和可读性。 #### 二十三、分发应用 - **分发格式**:支持的应用程序分发格式,包括WAR、EAR等。 - **用管理控制台分发应用**:通过管理控制台...

    STM32F103实现UCOSIII空闲任务钩子函数的使用【支持STM32F10X系列单片机】

    STM32F103系列微控制器是基于ARM Cortex-M3内核的高性能微控制器,广泛应用于嵌入式系统设计。UCOSIII(uC/OS-III)是一款实时操作系统(RTOS),它提供了多任务调度、内存管理、信号量、事件标志组、互斥信号量等...

    关于单片机的一些面试题.pdf

    - 利用日志记录、断点设置等手段定位问题。 9. **可重用性和模块化** - 设计模块化的代码结构,便于维护和扩展。 - 采用面向对象编程或函数库的形式提高代码复用率。 10. **DMA(直接内存访问)** - **优点**...

    安卓XMPP聊天通讯Socket相关-主功能。比如动态表情展示语音聊天表情拍照多图等.rar

    - 日志记录:通过Logcat记录关键步骤和错误信息,便于调试和优化。 由于提供的压缩包文件列表没有详细文件内容,以上分析基于一般实现方式,具体代码实现可能因项目结构和设计而异。实际应用开发中,开发者需要...

    RabbitMQ - test.rar_DEMO_RABBITMQ 测试_RabbitMQ的test_rabbitmq

    RabbitMQ是一个开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及提供可靠的消息传递。在本测试DEMO中,我们将探讨如何使用...

    StringQueue.zip

    字符串在许多嵌入式应用中都很常见,如日志记录、状态报告或用户界面反馈。 在“StringQueue”这个示例中,我们可以预见到以下关键知识点: 1. **消息队列创建**:在FreeRTOS中,开发者需要先定义消息队列的容量和...

    Laravel开发-laravel-queue-azure-restarter .zip

    7. **部署与监控**:最后,将这个解决方案部署到生产环境,并结合如Azure Monitor这样的服务进行监控,以便及时发现并解决任何可能导致队列处理中断的问题。 通过这个项目,开发者可以确保Laravel应用在使用Azure...

    laravel中Redis队列监听中断的分析

    当队列监听中断时,Laravel 会在日志中记录错误信息。例如,你可能看到类似 `The process has been sinaled with signal "1"` 的错误。这个错误意味着进程收到了 SIGHUP 信号,即终端挂起或控制进程终止的信号。 3...

Global site tag (gtag.js) - Google Analytics