包含三个功能类(1~3)以及一个测试类(4):
- AbstractLogger
- LoggerConsumption
- LoggerProduction
- 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();
}
}
分享到:
相关推荐
RabbitMQ是基于AMQP(Advanced Message Queuing Protocol)协议实现的消息队列系统,被广泛应用于分布式系统、微服务架构以及任务调度等多个领域。本主题将深入探讨“RabbitMQ生产者消费者测试”的相关知识点。 ...
ESWIN-EAM2011可能内置了调试功能,如日志记录、错误检查和模拟通信等功能,帮助开发者定位问题。 综上所述,"ESWIN-EAM2011实现CAN和CAN FD通信(中断)"涉及到的关键知识点包括CAN总线的基础原理、CAN FD的高速...
本教学案例将深入探讨如何在Java中实现多线程,并通过一个具体的生产者消费者模式来进一步阐述其核心概念。 1. **Java线程创建** - **继承Thread类**:创建一个新的类,该类继承自`Thread`类,并重写`run()`方法。...
- 使用 `runmqlsr` 命令检查本地是否存在同名的队列管理器。 - 使用 `dspmq` 命令查看队列管理器的状态。 - 使用 `crtmqm` 命令创建新的队列管理器,并指定相应的参数。 2. **启动队列管理器**: - 使用 `...
3. 配置日志记录器:将`RabbitMQHandler`添加到Python的日志记录器中,并设置合适的日志级别。 4. 使用日志:在代码中调用`logging`模块的方法,如`logging.info()`或`logging.error()`,记录日志信息。 5. 配置...
在本项目中,我们关注的是基于NXP i.MX RT1052微控制器实现的UCOSIII操作系统中的任务间通信机制,特别是消息队列的使用。NXP i.MX RT1052是一款高性能、低延迟的跨界处理器,特别适合实时应用。它集成了ARM Cortex-...
中断服务程序(ISR,Interrupt Service Routine)会处理中断事件,这里的任务通常是记录按键事件并唤醒等待的用户空间进程。 三、驱动程序结构 1. **初始化**:在驱动加载时,需要注册GPIO引脚,将其配置为输入并...
- 应用场景:利用MQ集群特性,可以将消息均匀分布到多个队列管理器中处理,从而实现负载均衡。 4. **容错与恢复** - 应用场景:MQ提供了持久化存储选项,确保即使在系统崩溃或网络中断的情况下,消息也不会丢失。...
- **队列管理器**:队列管理器是 WebSphere MQ 的核心组件之一,负责管理消息队列和其他相关资源。它可以独立运行,也可以作为更大的系统架构的一部分。 - **通道**:通道是两个队列管理器之间建立的连接,用于消息...
9. **监控与日志**:了解如何使用RabbitMQ的管理界面和各种工具进行性能监控和故障排查,以及如何配置日志记录。 10. **实战案例**:书中可能会提供多个实际应用场景,如Web应用的异步任务处理、微服务间的通信等,...
- **兼容性要求**:由于 SystemView 使用 J-Link 的 RTT 技术,因此需要使用 J-Link 调试器进行连接。 3. 使用 SystemView 的步骤: - **添加 demo 代码**:在项目中集成 SystemView 的初始化代码,以便开始收集...
- **创建域日志过滤器**:根据需要定制日志记录规则,提高日志的有效性和可读性。 #### 二十三、分发应用 - **分发格式**:支持的应用程序分发格式,包括WAR、EAR等。 - **用管理控制台分发应用**:通过管理控制台...
STM32F103系列微控制器是基于ARM Cortex-M3内核的高性能微控制器,广泛应用于嵌入式系统设计。UCOSIII(uC/OS-III)是一款实时操作系统(RTOS),它提供了多任务调度、内存管理、信号量、事件标志组、互斥信号量等...
- 利用日志记录、断点设置等手段定位问题。 9. **可重用性和模块化** - 设计模块化的代码结构,便于维护和扩展。 - 采用面向对象编程或函数库的形式提高代码复用率。 10. **DMA(直接内存访问)** - **优点**...
- 日志记录:通过Logcat记录关键步骤和错误信息,便于调试和优化。 由于提供的压缩包文件列表没有详细文件内容,以上分析基于一般实现方式,具体代码实现可能因项目结构和设计而异。实际应用开发中,开发者需要...
RabbitMQ是一个开源的消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议实现,广泛应用于分布式系统中,用于处理异步任务、解耦组件以及提供可靠的消息传递。在本测试DEMO中,我们将探讨如何使用...
字符串在许多嵌入式应用中都很常见,如日志记录、状态报告或用户界面反馈。 在“StringQueue”这个示例中,我们可以预见到以下关键知识点: 1. **消息队列创建**:在FreeRTOS中,开发者需要先定义消息队列的容量和...
7. **部署与监控**:最后,将这个解决方案部署到生产环境,并结合如Azure Monitor这样的服务进行监控,以便及时发现并解决任何可能导致队列处理中断的问题。 通过这个项目,开发者可以确保Laravel应用在使用Azure...
当队列监听中断时,Laravel 会在日志中记录错误信息。例如,你可能看到类似 `The process has been sinaled with signal "1"` 的错误。这个错误意味着进程收到了 SIGHUP 信号,即终端挂起或控制进程终止的信号。 3...