`

ActiveMQ in Action(5)

    博客分类:
  • JMS
阅读更多

ActiveMQ in Action(5)

关键字: activemq

2.5 Clustering
    ActiveMQ从多种不同的方面提供了集群的支持。
2.5.1 Queue consumer clusters
    ActiveMQ支持订阅同一个queue的consumers上的集群。如果一个consumer失效,那么所有未被确认(unacknowledged)的消息都会被发送到这个queue上其它的consumers。如果某个consumer的处理速度比其它consumers更快,那么这个consumer就会消费更多的消息。
    需要注意的是,笔者发现AcitveMQ5.0版本的Queue consumer clusters存在一个bug:采用AMQ Message Store,运行一个producer,两个consumer,并采用如下的配置文件:

Xml代码 复制代码
  1. <beans>  
  2.   <broker xmlns="http://activemq.org/config/1.0" brokerName="BugBroker1" useJmx="true">  
  3.      
  4.     <transportConnectors>  
  5.       <transportConnector uri="tcp://localhost:61616"/>  
  6.     </transportConnectors>  
  7.        
  8.     <persistenceAdapter>  
  9.       <amqPersistenceAdapter directory="activemq-data/BugBroker1" maxFileLength="32mb"/>  
  10.     </persistenceAdapter>  
  11.         
  12.   </broker>  
  13. </beans>  
<beans>
  <broker xmlns="http://activemq.org/config/1.0" brokerName="BugBroker1" useJmx="true">
  
    <transportConnectors>
      <transportConnector uri="tcp://localhost:61616"/>
    </transportConnectors>
    
    <persistenceAdapter>
      <amqPersistenceAdapter directory="activemq-data/BugBroker1" maxFileLength="32mb"/>
    </persistenceAdapter>
     
  </broker>
</beans>

   那么经过一段时间后可能会报出如下错误:
ERROR [ActiveMQ Transport: tcp:///127.0.0.1:1843 - RecoveryListenerAdapter.java:58 - RecoveryListenerAdapter] Message id ID:versus-1837-1203915536609-0:2:1:1:419 could not be recovered from the data store!
    Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现。

 

2.5.2 Broker clusters
    一个常见的场景是有多个JMS broker,有一个客户连接到其中一个broker。如果这个broker失效,那么客户会自动重新连接到其它的broker。在ActiveMQ中使用failover:// 协议来实现这个功能。ActiveMQ3.x版本的reliable://协议已经变更为failover://。
    如果某个网络上有多个brokers而且客户使用静态发现(使用Static Transport或Failover Transport)或动态发现(使用Discovery Transport),那么客户可以容易地在某个broker失效的情况下切换到其它的brokers。然而,stand alone brokers并不了解其它brokers上的consumers,也就是说如果某个broker上没有consumers,那么这个broker上的消息可能会因得不到处理而积压起来。目前的解决方案是使用Network of brokers,以便在broker之间存储转发消息。ActiveMQ在未来会有更好的特性,用来在客户端处理这个问题。
    从ActiveMQ1.1版本起,ActiveMQ支持networks of brokers。它支持分布式的queues和topics。一个broker会相同对待所有的订阅(subscription):不管他们是来自本地的客户连接,还是来自远程broker,它都会递送有关的消息拷贝到每个订阅。远程broker得到这个消息拷贝后,会依次把它递送到其内部的本地连接上。有两种方式配置Network of brokers,一种是使用static transport,如下:

Xml代码 复制代码
  1. <broker brokerName="receiver" persistent="false" useJmx="false">  
  2.   <transportConnectors>  
  3.     <transportConnector uri="tcp://localhost:62002"/>  
  4.   </transportConnectors>  
  5.   <networkConnectors>  
  6.     <networkConnector uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/>  
  7.   </networkConnectors>  
  8.   …   
  9. </broker>  
<broker brokerName="receiver" persistent="false" useJmx="false">
  <transportConnectors>
    <transportConnector uri="tcp://localhost:62002"/>
  </transportConnectors>
  <networkConnectors>
    <networkConnector uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/>
  </networkConnectors>
  …
</broker>
    另外一种是使用multicast discovery,如下:
Xml代码 复制代码
  1. <broker name="sender" persistent="false" useJmx="false">  
  2.   <transportConnectors>  
  3.     <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>  
  4.   </transportConnectors>  
  5.   <networkConnectors>  
  6.     <networkConnector uri="multicast://default"/>  
  7.   </networkConnectors>  
  8.   ...   
  9. </broker>  
<broker name="sender" persistent="false" useJmx="false">
  <transportConnectors>
    <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>
  </transportConnectors>
  <networkConnectors>
    <networkConnector uri="multicast://default"/>
  </networkConnectors>
  ...
</broker>
    Network Connector有以下属性:
Property Default Value Description
name bridge name of the network - for more than one network connector between the same two brokers - use different names
dynamicOnly false if true, only forward messages if a consumer is active on the connected broker
decreaseNetworkConsumerPriority false decrease the priority for dispatching to a Queue consumer the further away it is (in network hops) from the producer
networkTTL 1 the number of brokers in the network that messages and subscriptions can pass through
conduitSubscriptions true multiple consumers subscribing to the same destination are treated as one consumer by the network
excludedDestinations empty destinations matching this list won't be forwarded across the network
dynamicallyIncludedDestinations empty destinations that match this list will be forwarded across the network n.b. an empty list means all destinations not in the excluded list will be forwarded
staticallyIncludedDestinations empty destinations that match will always be passed across the network - even if no consumers have ever registered an interest
duplex false if true, a network connection will be used to both produce AND Consume messages. This is useful for hub and spoke scenarios when the hub is behind a firewall etc.

    关于conduitSubscriptions属性,这里稍稍说明一下。设想有两个brokers,分别是brokerA和brokerB,它们之间用forwarding bridge连接。有一个consumer连接到brokerA并订阅queue:Q.TEST。有两个consumers连接到brokerB,也是订阅queue:Q.TEST。这三个consumers有相同的优先级。然后启动一个producer,它发送了30条消息到brokerA。如果conduitSubscriptions=true,那么brokerA上的consumer会得到15条消息, 另外15条消息会发送给brokerB。此时负载并不均衡,因为此时brokerA将brokerB上的两个consumers视为一个;如果conduitSubscriptions=false,那么每个consumer上都会收到10条消息。以下是关于NetworkConnector属性的一个例子:

Xml代码 复制代码
  1. <networkConnectors>  
  2.   <networkConnector uri="static://(tcp://localhost:61617)"  
  3.      name="bridge" dynamicOnly="false" conduitSubscriptions="true"  
  4.      decreaseNetworkConsumerPriority="false">  
  5.      <excludedDestinations>  
  6.        <queue physicalName="exclude.test.foo"/>  
  7.        <topic physicalName="exclude.test.bar"/>  
  8.      </excludedDestinations>  
  9.      <dynamicallyIncludedDestinations>  
  10.        <queue physicalName="include.test.foo"/>  
  11.        <topic physicalName="include.test.bar"/>  
  12.      </dynamicallyIncludedDestinations>  
  13.      <staticallyIncludedDestinations>  
  14.        <queue physicalName="always.include.queue"/>  
  15.        <topic physicalName="always.include.topic"/>  
  16.      </staticallyIncludedDestinations>  
  17.   </networkConnector>  
  18. </networkConnectors>  
<networkConnectors>
  <networkConnector uri="static://(tcp://localhost:61617)"
     name="bridge" dynamicOnly="false" conduitSubscriptions="true"
     decreaseNetworkConsumerPriority="false">
     <excludedDestinations>
       <queue physicalName="exclude.test.foo"/>
       <topic physicalName="exclude.test.bar"/>
     </excludedDestinations>
     <dynamicallyIncludedDestinations>
       <queue physicalName="include.test.foo"/>
       <topic physicalName="include.test.bar"/>
     </dynamicallyIncludedDestinations>
     <staticallyIncludedDestinations>
       <queue physicalName="always.include.queue"/>
       <topic physicalName="always.include.topic"/>
     </staticallyIncludedDestinations>
  </networkConnector>
</networkConnectors>

 

2.5.3 Master Slave
    在一个网络内运行多个brokers或者stand alone brokers时存在一个问题,这就是消息在物理上只被一个broker持有,因此当某个broker失效,那么你只能等待直到它重启后,这个broker上的消息才能够被继续发送(如果没有设置持久化,那么在这种情况下,消息将会丢失)。Master Slave 背后的想法是,消息被复制到slave broker,因此即使master broker遇到了像硬件故障之类的错误,你也可以立即切换到slave broker而不丢失任何消息。
    Master Slave是目前ActiveMQ推荐的高可靠性和容错的解决方案。以下是几种不同的类型:

Master Slave Type Requirements Pros Cons
Pure Master Slave None No central point of failure Requires manual restart to bring back a failed master and can only support 1 slave
Shared File System Master Slave A Shared File system such as a SAN Run as many slaves as required. Automatic recovery of old masters Requires shared file system
JDBC Master Slave A Shared database Run as many slaves as required. Automatic recovery of old masters Requires a shared database. Also relatively slow as it cannot use the high performance journal

 

2.5.3.1 Pure Master Slave
    Pure Master Slave的工作方式如下:

  • Slave broker消费master broker上所有的消息状态,例如消息、确认和事务状态等。只要slave broker连接到了master broker,它不会(也不被允许)启动任何network connectors或者transport connectors,所以唯一的目的就是复制master broker的状态。
  • Master broker只有在消息成功被复制到slave broker之后才会响应客户。例如,客户的commit请求只有在master broker和slave broker都处理完毕commit请求之后才会结束。
  • 当master broker失效的时候,slave broker有两种选择,一种是slave broker启动所有的network connectors和transport connectors,这允许客户端切换到slave broker;另外一种是slave broker停止。这种情况下,slave broker只是复制了master broker的状态。
  • 客户应该使用failover transport并且应该首先尝试连接master broker。例如:
    failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
    设置randomize为false就可以让客户总是首先尝试连接master broker(slave broker并不会接受任何连接,直到它成为了master broker)。

   Pure Master Slave具有以下限制:

  • 只能有一个slave broker连接到master broker。
  • 在因master broker失效而导致slave broker成为master之后,之前的master broker只有在当前的master broker(原slave broker)停止后才能重新生效。
  • Master broker失效后而切换到slave broker后,最安全的恢复master broker的方式是人工处理。首先要停止slave broker(这意味着所有的客户也要停止)。然后把slave broker的数据目录中所有的数据拷贝到master broker的数据目录中。然后重启master broker和slave broker。

   Master broker不需要特殊的配置。Slave broker需要进行以下配置

Xml代码 复制代码
  1. <broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">  
  2.     ...   
  3.     <transportConnectors>  
  4.       <transportConnector uri="tcp://slavehost:61616"/>  
  5.    </transportConnectors>  
  6. </broker>  
<broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">
    ...
    <transportConnectors>
	  <transportConnector uri="tcp://slavehost:61616"/>
   </transportConnectors>
</broker>

    其中的masterConnectorURI用于指向master broker,shutdownOnMasterFailure用于指定slave broker在master broker失效的时候是否需要停止。此外,也可以使用如下配置:

Xml代码 复制代码
  1. <broker brokerName="slave" useJmx="false"  deleteAllMessagesOnStartup="true"  xmlns="http://activemq.org/config/1.0">  
  2.   ...   
  3.   <services>  
  4.     <masterConnector remoteURI"tcp://localhost:62001" userName="user" password="password"/>  
  5.   </services>  
  6. </broker>  
<broker brokerName="slave" useJmx="false"  deleteAllMessagesOnStartup="true"  xmlns="http://activemq.org/config/1.0">
  ...
  <services>
    <masterConnector remoteURI= "tcp://localhost:62001" userName="user" password="password"/>
  </services>
</broker>

   需要注意的是,笔者认为ActiveMQ5.0版本的Pure Master Slave仍然不够稳定。

 

2.5.3.2 Shared File System Master Slave
    如果你使用SAN或者共享文件系统,那么你可以使用Shared File System Master Slave。基本上,你可以运行多个broker,这些broker共享数据目录。当第一个broker得到文件上的排他锁之后,其它的broker便会在循环中等待获得这把锁。客户端使用failover transport来连接到可用的broker。当master broker失效的时候会释放这把锁,这时候其中一个slave broker会得到这把锁从而成为master broker。以下是ActiveMQ配置的一个例子:

Xml代码 复制代码
  1. <broker useJmx="false"  xmlns="http://activemq.org/config/1.0">  
  2.    <persistenceAdapter>  
  3.       <journaledJDBC dataDirectory="/sharedFileSystem/broker"/>  
  4.    </persistenceAdapter>  
  5.    …   
  6. </broker>  
<broker useJmx="false"  xmlns="http://activemq.org/config/1.0">
   <persistenceAdapter>
      <journaledJDBC dataDirectory="/sharedFileSystem/broker"/>
   </persistenceAdapter>
   …
</broker>

 

2.5.3.3 JDBC Master Slave
    JDBC Master Slave的工作原理跟Shared File System Master Slave类似,只是采用了数据库作为持久化存储。以下是ActiveMQ配置的一个例子:

Xml代码 复制代码
  1. <beans>  
  2.   <broker xmlns="http://activemq.org/config/1.0" brokerName="JdbcMasterBroker">  
  3.     ...   
  4.     <persistenceAdapter>  
  5.       <jdbcPersistenceAdapter dataSource="#mysql-ds"/>  
  6.     </persistenceAdapter>  
  7.        
  8.   </broker>  
  9.      
  10.   <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  11.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  12.     <property name="url" value="jdbc:mysql://localhost:3306/test?relaxAutoCommit=true"/>  
  13.     <property name="username" value="username"/>  
  14.     <property name="password" value="passward"/>  
  15.     <property name="poolPreparedStatements" value="true"/>  
  16.   </bean>    
  17. </beans>  
<beans>
  <broker xmlns="http://activemq.org/config/1.0" brokerName="JdbcMasterBroker">
    ...
    <persistenceAdapter>
      <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
    </persistenceAdapter>
    
  </broker>
  
  <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?relaxAutoCommit=true"/>
    <property name="username" value="username"/>
    <property name="password" value="passward"/>
    <property name="poolPreparedStatements" value="true"/>
  </bean> 
</beans>

   需要注意的是,如果你使用MySQL数据库,需要首先执行以下三条语句:(Apache官方文档说,此bug已经被修正,预定在5.1.0版本上体现)

Sql代码 复制代码
  1. ALTER TABLE activemq_acks ENGINE = InnoDB;   
  2. ALTER TABLE activemq_lock ENGINE = InnoDB;   
  3. ALTER TABLE activemq_msgs ENGINE = InnoDB;  
分享到:
评论
1 楼 liqiaoqiaoz 2013-07-18  
请问ActiveMQ消费速度很慢的原因是什么呢?我这里消费速度为200/s,太慢了吧!

相关推荐

    java项目,课程设计-ssm病人跟踪治疗信息管理系统

    病人跟踪治疗信息管理系统采用B/S模式,促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着病人的不断增多,传统基于手工管理模式已经无法满足当前病人需求,随着信息化时代的到来,使得病人跟踪治疗信息管理系统的开发成了必然。 本网站系统使用动态网页开发SSM框架,Java作为系统的开发语言,MySQL作为后台数据库。设计开发了具有管理员;首页、个人中心、病人管理、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、分类管理、病人治疗状况管理、留言板管理、系统管理,病人;首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理,前台首页;首页、医生、医疗资讯、留言反馈、个人中心、后台管理、在线咨询等功能的病人跟踪治疗信息管理系统。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    liunx project 5

    liunx project 5

    PostgreSQL DBA实战视频教程(完整10门课程合集)

    分享课程——PostgreSQL DBA实战视频教程(完整10门课程合集)

    计算机科学基础期末考试试题

    计算机科学基础期末考试试题

    c语言实验设备管理系统

    练习与巩固《C语言程序设计》理论知识,通过实践检验和提高实际能力,进一步培养自己综合分析问题和解决问题的能力。掌握运用C语言独立地编写调试应用程序和进行其它相关设计的技能。

    提高图像在低光照条件下的清晰度和可见性,使用CNN的图像重建网络,来实现亮度调节,可用于小白学习

    1. 数据集资源 公开低光照数据集:用于模型训练的低光照图像数据集,这些数据集包含了多种低光照条件下的图像,并附有增强后的高质量图像。 合成数据:在不足数据的情况下,可以通过对高亮度图像进行暗化处理生成低光图像对,以增强数据量。 自建数据集:对于特定场景,如安防、医疗等,可以拍摄或收集特定条件下的低光照图像来创建数据集,满足特定应用需求。 2. 硬件资源 GPU:大规模模型训练需要高性能计算,以支持大规模图像处理和神经网络训练。 数据存储:由于图像数据较大,需要大容量的存储设备如HDD或SSD来存储数据集及中间结果。 3. 深度学习框架及工具 PyTorch:支持构建和训练神经网络模型,尤其适合卷积神经网络(CNN)和生成对抗网络(GAN)的实现。 CUDA和cuDNN:为GPU加速库,在模型训练时可显著提升运行效率。

    双哥微服务.md

    双哥微服务

    fb000f5e-12c5-a46b-102a-f08bdfa015f1.json

    fb000f5e-12c5-a46b-102a-f08bdfa015f1.json

    C#ASP.NET跑腿服务网站源码数据库 Access源码类型 WebForm

    ASP.NET跑腿服务网站源码 开发环境 :Asp.net + VS2010 + C# + ACCESS 网站介绍: 适合人群:跑腿服务行业公司,服务资讯公司或者其他行业企业、 做服务行业建站的技术人员、技术人员学习参考都行。 技术特点:非常清爽大气的网站,界面华丽,工整,采用全div布局, 含flash图片切换功能,强大的后台信息管理功能。 功能介绍: 后台功能:系统参数设置(网站标题,关键字,内容,站长联系方式等)、系统栏目频道设置、新闻管 理、服务项目管理、公司介绍内容管、系统模版管理(可管理前台页面模版内容,具体到头部页面,底 部页面,首页,内容页,新网页等)、系统日志管理、系统管理员管理、频道管理(频道类型、频道内 容、内容发布以及编辑)。 后台地址:网址/admin/login.aspx 账户:admin 密码:admin888

    KCP一个快速可靠的ARQ协议.zip

    c语言

    【小程序毕业设计】基于微信小程序的物流运输(仓储)系统开发与设计源码(完整前后端+mysql+说明文档+LW).zip

    环境说明: 开发语言:Java/php JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea 小程序框架:uniapp/原生小程序 开发工具:HBuilder X/微信开发者

    计算机中 人工智能的七大应用领域

    人工智能(Artificial Intelligence,缩写为AI)是一种通过计算机程序模拟人类智能与行为的技术和理论。它可以用于各种领域,例如:自动驾驶、机器翻译、语音识别、图像识别、医疗诊断等。近年来,人工智能逐渐成为了技术界和商业领域的热门话题。

    ESP32ESP32C2ESP32C3ESP32C6ESP8266的AT应用.zip

    c语言

    基于JAVA实现的离散数学题库管理系统.zip

    基于JAVA实现的离散数学题库管理系统

    【图像压缩】基于matlab GUI低比特率图像压缩(含比特率 压缩包 信噪比)【含Matlab源码 9132期】.mp4

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    (源码)基于C++的MiniSQL数据库系统.zip

    # 基于C++的MiniSQL数据库系统 ## 项目简介 MiniSQL是一个轻量级的关系型数据库管理系统,旨在提供基本的SQL解析和执行功能。该项目参考了CMU15445 BusTub框架,并在其基础上进行了修改和扩展,以兼容原MiniSQL实验指导的要求。MiniSQL支持缓冲池管理、索引管理、记录管理等核心功能,并提供了简单的交互式SQL解析和执行引擎。 ## 项目的主要特性和功能 1. 缓冲池管理实现了一个高效的缓冲池管理器,用于缓存磁盘上的数据页,以提高数据访问速度。 2. 索引管理支持B+树索引,提供高效的插入、删除和查找操作。 3. 记录管理实现了记录的插入、删除、更新和查询功能,支持持久化存储。 4. 元数据管理提供了表和索引的元数据管理功能,支持持久化存储和检索。 5. 并发控制实现了基本的锁管理器,支持事务的并发控制。 6. 查询执行提供了简单的查询执行引擎,支持基本的SQL语句解析和执行。 ## 安装使用步骤

    社会科学研究Top 10,000 Papers数据解析论文名称被引次数下载次数等

    社会科学研究Top 10,000 Papers数据解析被引次数下载次数等 一、数据背景与来源 该数据集来源于SSRN(Social Science Research Network)的社会科学研究Top 10,000 Papers,是根据多种学术影响力指标统计得出的,在其平台上最受关注的前10,000篇学术论文的汇总。这些数据反映了国际研究领域的热点话题和发展趋势,对于国内学者研究者来说,是了解社科领域研究进展的重要窗口。 二、数据内容概览 样本数量:数据集包含10,000条记录,每条记录代表一篇在SSRN平台上具有高影响力的学术论文。 论文范围:涵盖社会科学研究的各个领域,包括但不限于经济学、政治学、社会学、心理学、教育学等。 关键指标: 数据下载次数:反映了论文的受欢迎程度和研究者对其内容的关注度。 引用次数:体现了论文在学术界的认可度和影响力,是评估论文质量的重要指标之一。 Rank Paper Total New Downloads Total # of Downloads Total # of Citations # of Authors

    【北京理工大学-2024研报】中国碳达峰碳中和时间表与路线图研究.pdf

    行业研究报告、行业调查报告、研报

    基于 Java+Mysql 实现的企业人事管理系统【课程设计/毕业设计】(源码+设计报告)

    【作品名称】:基于 Java+Mysql 实现的企业人事管理系统【课程设计/毕业设计】(源码+设计报告) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: [1]管理员可以对员工的基本信息的增删改查,普通员工仅可查看; [2]对公司里所有员工进行分配工号,并进行基本信息的录入; [3]对新聘用的员工,将其信息加入到员工档案记录中; [4]对于解聘的员工,将其信息从员工档案记录中删除。 [5]当员工信息发生变动时,修改员工档案记录中相应的属性。 (三)员工岗位信息管理 [1]对公司里所有员工的职务及岗位信息(岗位职责)进行记录; [2]记录员工调动前后的具体职务,以及调动时间。 (四)考勤管理 [1]对员工上班刷卡的记录进行统一编号;登记员工上班时间(准时、迟到)。 [2]对员工下班刷卡的记录进行统一编号;登记员工下班时间(准时、早 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    (源码)基于Arduino编程的冰箱警报系统.zip

    # 基于Arduino编程的冰箱警报系统 ## 项目简介 这是一个基于Arduino编程的项目,通过连接到冰箱门开关的警报系统来提醒用户冰箱门开启时间过长。用户可以在设定的时间内关闭冰箱门,否则警报会响起。项目使用LCD控制器面板来设置和配置警报延迟时间。 ## 项目的主要特性和功能 1. 警报功能在冰箱门开启后,系统会开始计时,如果用户在设定的时间内未关闭冰箱门,警报会响起。 2. LCD配置面板使用LCD控制器面板设置和配置警报延迟时间。 3. 可配置警报时间用户可以根据需要调整警报延迟时间。 4. 状态显示LCD面板显示冰箱门的状态(开启关闭)。 ## 安装使用步骤 1. 下载并解压项目文件。 2. 准备硬件部件根据提供的物料清单(Bill of Materials)准备所需的硬件部件。 3. 连接硬件部件按照项目文档中的连接表(Connection Table)将硬件部件连接到Arduino主板和LCD控制器面板。

Global site tag (gtag.js) - Google Analytics