应该在下一个企业应用程序中使用 JMS 吗?

21、Spring JMS 与企业应用部署考量 本文深入探讨了 Spring JMS 的相关属性及其在企业应用部署中的关键考量因素。内容涵盖了 Spring JMS 的核心配置属性、性能与可扩展性测试方法、硬件需求评估、长期可靠性测试以及 IP 组播的应用与挑战。通过详细的实操建议和测试流程,帮助开发者更好地优化 JMS 应用,确保系统的高效、稳定运行。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 欢迎来到 Java 理论与实践专栏,这是由经验丰富的 Java 开发人员 Brian Goetz 撰写的一个新的专栏月刊。本专栏旨在探索设计原则如何满足解决实际问题的需求这一难以捉摸的结合点。每个月我们都将探索设计模式、可靠软件设计的原则以及为什么“最佳实践”是最好的,同时也关注如何将它们应用于实际问题。这个月,Brian 讨论企业消息排队技术。 最近几年,开发人员可以更广泛地得到企业消息排队(MQ)产品。适当地使用 MQ 技术经常可以改善应用程序的组织、性能和可伸缩性。Java 消息服务(Java Message Service (JMS))是集成到 J2EE 中的一部分,它使得 MQ 服务可以为任何 J2EE 应用程序所用。在本文(也是本专栏系列的第一部分)中,Brian 概述了在 Java 应用程序中使用消息排队的一些好处,并探讨了能够从 MQ 技术中获益最大的问题类型。请在论坛上(或者通过单击本文顶部或底部的讨论)同作者及其他读者分享您对本文的想法。 消息排队(MQ)工具没有数据库工具(例如关系(SQL)数据库)为人所知或为人理解,数据库工具是几乎所有企业应用程序和大量比较简单的应用程序中的关键组件。开发人员总是可以采用多种类型的数据产品,其范围包括从廉价的、只能在台式机上使用的数据库(例如 dBase 或 Microsoft Access),到工作组数据库服务器(例如 Sybase SQL/Anywhere),再到企业数据库服务器(例如 DB2 或 Oracle)。 无论您的项目是什么样子的,总有一个价格、性能及功能都适合的数据库产品可供您使用。 和数据库相似,MQ 产品有时被称为面向消息的中间件(MOM),已经出现相当一段时间了。然而,直到最近,MQ 服务器还一直是昂贵的、只能被资金最充足的企业开发人员所用的高端产品。结果,只有非常少的开发人员可以享受在其应用程序中使用消息传递所带来的好处。 大众化的消息排队 幸运的是,这一状况正在开始改变;现在市场上已经出现了几种价格较低的 MQ 服务器。1997 年,Microsoft 发布了 MSMQ,它是一个事务性消息排队产品,作为 Windows NT Server 中的集成部分 — 无需额外的许可费用。Sun 将 JMS API 包括在最初的 J2EE 规范中,这极大地促进了消息传递的大众化。在 J2EE 规范的版本 1.3 中,所有的 J2EE 容器都要求包含 JMS 提供程序(provider)。 JMS,也就是 Java 消息服务,它是一种允许 Java 应用程序通过标准化的接口访问范围广泛的 MQ 服务器(或者,按照 JMS 的说法,是提供程序)的 API,就象 JDBC 允许程序通过一个公共接口访问许多不同的数据库服务器一样。大多数 J2EE 容器包含 JMS 提供程序;将来,所有 J2EE 容器都将包含 JMS 提供程序。没有 J2EE 容器也可以使用 JMS;市场上有几种独立的 JMS 提供程序实现。此外,EJB 2.0 规范引入了一种新的 EJB 类型 — 消息驱动 bean — 它使得创建利用实体和会话 bean 的消息驱动的组件非常容易。 既然我们都可以使用 JMS 服务,我们就应该学会在应用程序中使用消息传递的能力。Willy Farrell 是 IBM 的一名电子商务设计师,他写了一本优秀的关于使用 JMS 的介绍性教程(参阅参考资料)。 它涉及创建消息和队列的基本知识,以及对消息划分优先级、检索消息和编码消息的所有选项。 消息传递和数据库起了相互补充的作用,在许多情况下,同时使用消息传递和关系数据库可以产生比只使用它们中的一个好得多的解决方案。 历史上,曾经将 MQ 服务器用于面向事件的应用程序(例如财务服务应用程序)或者作为一种与完全不同的系统进行相互操作的方式(例如连接完全不同的数据库应用程序或将一个企业同另一个在供应链网络中的企业相连接)。术语“面向消息的中间件”经常应用于 MQ 服务器,它强调 MQ 技术主要用途是连接完全不同的系统。然而,随着 MQ 产品成本的降低,许多其它应用程序现在也可以从消息排队中获益。 MQ 服务器做什么? 用 MQ 的说法,消息只是一个字节流(这个字节流可以是一个 XML 文档、一个序列化的 Java 对象、一个文本字符串或甚至是一条空消息)。对消息的解释留给应用程序域来做;MQ 基础结构不对消息施加任何语义和结构限制。消息存储在队列里,MQ 服务器允许您将消息加入到队列以及从队列中取走消息。 到目前为止,消息队列听起来很象简单的链表。从其最简单形式来说,的确是这样的,但是企业 MQ 服务器通过将一些功能特性封装进这一链表管理而增强了其功能: 控制谁可以向队列中写以及谁可以从队列中读的安全性 网络接口,它允许消息生产者和消费者位于不同的地方 事务性支持,这样入队和出队操作都具有事务特性:原子性、一致性、隔离性以及可持久性 分布式事务支持,这样队列操作可以同其它资源管理器(如 SQL 数据库)一起参加分布式事务 持久存储性 负载均衡 故障转移 管理 MQ 的长处 MQ 的长处源自消息处理的异步性质所带来的固有的松散耦合。一个实体向队列发布消息与另一个实体除去并处理消息的过程是完全分离的。这两个实体无须同时运行,也无须位于同一系统上,甚至无须知道另一个实体的标识;它们仅按照自己的时间表同队列交互。它们只须就彼此将接收的消息的格式达成一致;此外,它们无须知道对方的任何其它事情。 松散耦合有许多优点。它提供了一个自然的机制,将一个工作单元分成更小的、独立的组件,这种机制在处理请求的各阶段之间隐式地创建了抽象。这种细分允许我们方便地一个接一个地抽象每个组件的实现,更好地衡量和管理每个组件对资源的利用,或者使用提供具有类似功能的组件替换一个组件而无需改变其它组件。 JMS 规范要求 JMS 提供程序也实现发布和订阅功能,该功能允许您创建不同的、应用程序定义的且名称为主题的通道,并允许单个实体订阅这些主题。排队到主题的消息自动放置在任何订阅过该主题的实体的专用队列中。主题在财务服务或新闻发送应用程序中执行有价值的排序功能。例如,虽然有 5000 多种股票在美国的主要交易所交易,但每个投资者可能只对其中的 30 种股票感兴趣。因此您可以为每个订单符号创建一个主题,让用户订阅他们感兴趣的符号,然后让 MQ 引擎执行仅仅显示每个投资者想要的报价,避免发送重复的股价。用 SQL 数据库实现这一过程要困难得多。 经典的 MQ 用法模式 有一些最适合于使用消息排队的常见用法模式。当在您的应用程序中看到这些模式之一时,您应该考虑使用消息传递。 面向事件的应用程序 高度面向事件的应用非常适于使用 MQ 技术。这些包括财务服务应用程序(请考虑一个证券交易所,它显示股票价格更新,根据价格变化或其它订单的执行来启动交易,报告订单状态等等),新闻发送服务应用程序以及供应链应用程序。在金融市场中,必须对事件进行迅速处理;当发生了重要的事情时,您希望在它一发生时就得到通知。 轮询数据库 数据库在持久存储数据方面是非常优秀的,但是存储瞬时数据并在数据改变时通知我们却不是它们的长处。 虽然它不是高效的,但是轮询数据库却非常常见。每个机场的显示监视器不断轮询数据库以更新它们显示的信息。有许多出纳窗口的银行经常使用电子信号来指示下一个空闲出纳员的位置。电子商务站点内的订单处理系统可能轮询数据库以查看是否有任何新订单需要处理。或者保险索赔工作流系统可能轮询以查看是否有任何新的索赔可以分配给空闲的索赔调解人(claims adjusters)。 所有这些轮询都产生了许多额外的工作。如果有许多实体频繁地轮询(并且如果它们想要迅速地反映数据的更新,它们就必须这么做),就可能给数据库服务器和网络造成很大的负载。在大多数时候,轮询不返回数据,更糟的是,会返回我们已经见过的数据,但又必须再次处理或标识为已经处理过。 数据库不只是为轮询或事件而设计的。如果在事件发生或数据更改之后必须采取相对迅速的行动,那么异步消息传递是完成这一任务更容易和更有效的方法。无论何时在需要知道更新而轮询数据库时,请考虑使用 JMS 来替代数据库。 工作流 根据工作流门户网站(它是 Workflow Management Coalition 和 Workflow And Reengineering International Association 共同努力的结果)的定义,工作流是“……整个或部分商业过程的自动化,在这一过程中,根据一套过程规则,将文档、信息或任务从一个参与者传递给另一个参与者。”MQ 解决方案特别适合于工作流应用程序(例如文档路由和批准、保险索赔处理等等),这是因为 MQ 技术对如何处理大量使用纸张的办公室里的工作流问题进行了精细的建模,在这种办公室内每个参与者都有一个收件箱和发件箱。 工作流应用程序的特征是有许多代理(代理可以是人,自动处理步骤甚至是物理装备,例如机器和打印机),每个代理都执行任务的一小部分并将其传递给由业务规则所确定的下一代理。请考虑批准和支付电子支出报表这一过程。雇员创建并提交报表,接下来该报表需要由雇员的经理批准(如果美元数目超出了规定的数目,则需要由另外一级管理部门批准)。接下来到了人力资源部,在那里对它进行核查以确定其准确性,还要进行细查以确保该开支是有效的业务支出并符合公司的政策。如果批准了,将会创建支付请求并安排打印支票。这之后,可能进入财务部,在那里单个收费记录将会应用到适当的帐户和成本中心。在这些阶段的每一个,支出报表都可能被弹回给雇员或雇员经理。 在构建工作流应用程序过程中,主要设计目标是确保工作能够从一个代理迅速地传入到另一个代理,并确保任务不崩溃。MQ 服务器同数据库一起携手工作,它使得向您的应用程序中构建灵活、可伸缩、可扩展的工作流处理变得容易。 使用 MQ 以从关键路径去除风险大的操作 在电子商务或供应链应用程序中的接收、批准和填写订单同工作流应用程序有许多共同之处,虽然大多数步骤涉及的是电子参与者而不是人。接收并履行订单可能会包含下列步骤中的一些或全部: 接收订单并将其存储在数据库中。 对于消费者顾客,验证信用卡。 对于商业顾客,通过信用报告代理处或通过您公司的信用部门检查该顾客的信用。 执行一些欺诈核查分析。 核查库存。 在有多个履行中心的情况下,决定由哪个中心填写该订单。 向顾客发送一封确认电子邮件。 向顾客的销售代表发送一个通知。 生成挑选列表并将其交付给履行中心。 交付订单。 向用户收费并给其开票据。 由于您不想顾客在为获取确认号码和收据而单击“Buy”之后等很久,因此无论在提交之后执行哪一条代码,该代码路径都应该简短并且有可预见的执行时间。但是这些步骤中的许多步骤都需要访问一些资源,这些资源在客户下订单时可能可用也可能不可用,或者这些资源的响应时间可能无法预料。在这种情况下,应该从关键路径去除它们;让订购的启动动态设置事件链,而通过将提交步骤的工作减到绝对最小来开始订单,来尽可能快地使用户脱离循环。除了将给顾客一个更好的用户经历之外,将订单处理分成多个离散的(较短)的步骤还改进了资源利用并减少了竞争 — 这意味着事务更短(因此锁定也释放得更早),并且在一步(例如网络和数据库连接)中所用到的资源也释放得更早。 在订单处理过程中,最不可预见的步骤之一是发送确认电子邮件。邮件服务器经常会拥塞,可能会要好长时间才能接收一条消息,也可能完全拒绝连接。如果顾客的邮件服务器拒绝确认消息,那么您就想要稍后重新尝试发送该消息。这样,发送确认电子邮件就“有风险”,这是因为第一次发送可能不成功,或者发送需要很长时间来处理,而您又不想让顾客(或有关这件事的任何其它的东西)一直等到确认到来。类似地,库存可能存储在同订单处理分离的数据库中(库存数据库可能由一个外包的履行服务拥有),并且在订购时可能不可用。或者信用部门可能在星期五不上班。 通过使用消息队列来存储暂挂的确认电子邮件、库存检查或者信用检查,您可以将“有风险的”操作同过程的其余部分分离,因此也使过程的其余部分避免了操作失败或花费很长时间的风险。由于每个处理步骤只完成一项简单的任务,因而也将极大简化了每个任务的错误处理。 结束语 如果应用得当,消息排队技术通过将任务分解成子任务,可以极大地简化复杂任务的处理,还能增加应用程序的灵活性和可伸缩性。自 J2EE 版本 1.3 起,每个 J2EE 容器都将包含一个 JMS 提供程序,这意味着我们都能在我们的应用程序中利用异步消息排队的强大功能。 下个月,我们将探索 Java 事务服务(Java Transaction Service (JTS))的工作原理了。虽然它不如 EJB 或 J2EE 的其它元素引人注意,但 JTS 可能是 J2EE 的最关键部分 — 事务使我们能够构建可靠的分布式应用程序。我们将在今后的某篇专栏文章中重述 MQ,并且构建一个工作流应用程序,以演示消息排队和关系型数据库是如何相互协作和取长补短的。 参考资料 请通过单击本文顶部或底部的讨论来参与关于本文的论坛。 从 Sun 获取关于 JMS 的规范、参考资料和示例。 Richard Monson-Haefel 和 David Chappell 的 Java Message Service (O'Reilly and Associates,2000)全面介绍了 JMS API 并提供了许多运用它的实际示例。 Richard Monson-Haefel 的 Enterprise JavaBeans (O'Reilly and Associates,2000)是一个全面更新的版本,它详细介绍了 EJB 2.0 规范中的变化。 Willy Farrell 在他的教程 Introducing the Java Message Service(developerWorks,2001 年 8 月)中对 JMS 做了一个极好的概述,并提供了开发使用 JMS 的程序的基础知识。 作为 IBM 的电子体系架构设计师,Willy Farrell 对于如何使用 MQSeries 和 VisualAge for Java 来开发和测试 JMS 应用程序十分精通。他的两部分系列文章 Writing Java Message Service programs using MQSeries and VisualAge for Java, Enterprise Edition 和 Writing Java Message Service programs using MQSeries and VisualAge for Java, Enterprise Edition, Part 2 中有详细的论述。 Gordon Van Huizen 的 Messaging: The transport part of the XML puzzle(developerWorks,2000 年 7 月)介绍了主要传输层选项,并比较了它们如何可靠地在各方之间传输 XML。 您将发现有关 XML-RPC、SOAP、WDDX、ebXML 和 JMS 用于 XML 传输的方法的概述。 e-workflow 工作流门户网站是 Workflow Management Coalition 和 Workflow And Reengineering International Association 共同努力的结果,它为开发工作流应用程序的工程师提供了全面的参考资料。 MQSeries Primer 是一份 IBM 红皮书,它提供了企业消息传递中所用概念及术语的清晰的解释。 在 WebSphere 开发者园地中的 MQSeries with JSP technolog 这篇文章中学习如何与 JSP 技术一起使用 MQSeries。 Ryan Cox 描述了为 WebSphere 配置 JMS 服务。 在 developerWork Java 技术专区查找与 Java 有关的其它参考资料。 关于作者 Brian Goetz 是一名软件顾问,过去 15 年来他一直是一名专业的软件开发人员。他是位于加利福尼亚州洛斯阿尔托斯市 Quiotix 的首席顾问,该公司是一家软件开发和咨询公司。请阅读流行的业界出版物上 Brian 的已出版和即将出版的文章。可以通过 brian@quiotix.com 和他联系。
内核工作FAST‘25 Artifact Evaluation流程记录 在我们的paper中,复现需要用到傲腾持久化内存,因此,需要AE Reviewer访问到内网服务器中。我们的思路是购买云服务器,将其作为跳板机,内网服务器通过SSH反向代理与公网服务器建立隧道,AE Reviewer通过隧道访问内网服务器。我们在AE过程中使用。然后,把一切复现需要的代码环境,在chroot里面配置完成。 阅读详情

相关推荐

LVI-SAM适配KITTI数据集避坑指南:IMU频率与数据同步问题解析

本文深入解析了将LVI-SAM框架适配KITTI数据集时,在IMU频率与多传感器数据同步方面遇到的核心挑战与解决方案。针对KITTI数据集中sync与extract两种数据包的差异,文章提供了从数据选择、参数调优到时间戳诊断与修复的完整避坑指南,帮助开发者实现稳定高效的SLAM系统部署。

7z8x2c4v6b9的博客 254

什么时候用JMS

在么基于B/S架构的系统,怎么做消息提送啊?是页面做定时刷新?有没有其他方法啊http长连接有没有什么示例代码啊好的,我自己google看现在还忙啊,你们http://leonardleonard.iteye.com/blog/276166忙很忙忙死了http://leonardleonard.iteye.com/blog/276167一般用下面这个链接中的方式实现。。。好的,谢了,还有个问题,就...

chesman的专栏 261

利用按键精灵实现批量截图与智能命名的高效工作流

本文详细介绍了如何利用按键精灵软件构建高效的批量截图与智能命名自动化工作流。通过基础脚本编写、循环逻辑实现及高级命名策略,解决手动操作耗时易错的问题,帮助用户实现一键自动截图、智能保存与文件重命名,大幅提升软件测试、教程制作及数据报告等场景的工作效率。

weixin_29268267的博客 570

什么情景下应当考虑使用JMS(Java Message Service )技术

Java消息服务 ( JavaMessaging Service, JMS ) 是一种允许应用程序创建、发送、接受和读取消息的Java API 。       据我个人的理解,JMS和RMI完全是两个不同应用场景中的技术,没有可比性。      Java 消息服务(Java Message Service (JMS))是集成到 J2EE 中的一部分,它使得 MQ 服务可以为任何 J2EE 应用

zolalad的专栏 5282

PSpice 导入 LTspice 仿真实验 --(如何解决PSpice模型无法使用的错误)

参考了网上第三方器件导入LTspice的博客和资料,不论是哪个公司下载的SPICE模型导入LTspice的方法都类似。如果遇到导入报错的情况可以先看一下报错提示,如果通过语法修改实现功能的则说明可以进行仿真,当然性能可能与官方给的模型存在一点出入,但做一个基本的功能验证本人认为还是可以的,总比做出板子用不了或者完全不匹配的要好一些。

伊丽莎白的学习之路 9007

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 367

该在下一个企业应用程序中使用 JMS 吗

最近几年,开发人员可以更广泛地得到企业消息排队(MQ)产品。适当地使用 MQ 技术经常可以改善应用程序的组织、性能和可伸缩性。Java 消息服务(Java Message Service (JMS))是集成到 J2EE 中的一部分,它使得 MQ 服务可以为任何 J2EE 应用程序所用。在本文(也是本专栏系列的第一部分)中,Brian 概述了在 Java 应用程序中使用消息排队的一些好处,并探讨了能...

iteye_5816的博客 148

免ROOT、不刷机、不依赖Xposed实现Android改机的思路

最近在一个项目中需要模拟多种Android设备的环境。无奈市面上的大部分改机工具,要么需要ROOT权限,要么依赖Xposed,甚至还得重启设备。为了实现更灵活、更干净的改机方式,我开始了漫长的技术探索,最终找到了免ROOT、不刷机、拒绝Xposed的实现路径。Android_IDIMEI手机序列号手机型号、品牌、CPU型号等硬件信息GPS位置、Wi-Fi参数、通话记录、短信等软硬件数据这些信息通常用于标识设备唯一性,而改机就是对这些标识数据进行模拟或篡改。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2675

jms应用程序_您是否应该在下一个企业应用程序中使用JMS?

消息队列(MQ)工具不像数据库工具(例如关系(SQL)数据库)那样广为人知或理解,它们是几乎所有企业应用程序和大量简单应用程序的关键组件。 开发人员始终可以访问各种数据库产品,从廉价的仅台式机数据库(例如dBase或Microsoft Access)到工作组数据库服务器(例如Sybase SQL / Anywhere),再到企业数据库服务器(例如DB2或Oracle。)无论您的项目是什么,都有...

cusi77914的博客 217

【Godot】【工程】中文字体与多语言(缺字/体积/打包:一次性配置到位)

本文介绍了Godot游戏开发中的中文字体配置与多语言支持方案。主要内容包括:1)中文字体的全局与局部设置;2)使用子集化技术减小字体体积;3)多语言资源管理及翻译系统实现;4)语言切换机制与控件刷新方法;5)字体回退策略优化显示效果;6)打包优化建议。文章提供了从字体导入到多语言实现的完整解决方案,帮助开发者系统性解决中文显示和多语言支持问题,同时优化资源体积和性能表现。配套案例可供学习参考。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 598

高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述

总结与展望先总结现状,说明前人已经做到什么地步了,再指出缺口,前人没解决什么问题、方法有什么局限等等,最后再在这个缺口的基础上,提出你的未来研究方向。当你有个复杂的研究题目,但没办法拆解出关键词,就可以让Gemini 3 Pro来辅助帮你拆解,并帮你写专业的检索式,若是找英文文献,还能帮你将中文关键词翻译成地道的专业术语。做文献笔记,可以建立文献笔记矩阵,可以用Excel建个表格,横向是文献,纵向是关键要素,包括作者/年份、研究问题/假设、理论框架/模型、研究方法/数据来源、核心结论、局限性/Gap。

智能AI让学术科研更容易 993

JMS之ActiveMQ

什么是JMS Java Message Service是由Sun开发的,它为 Java程序提供一种访问企业消息系统的方法。       企业消息系统,即面向消息的中间件(MOM),提供了以松散耦合的灵活方式集成应用程序的一种机制。它们提供了基于存储和转发的应用程序之间的异步数据发送,即应用程序彼此不直接通信,而是与作为中介的MOM 通信。MOM提供了有保证的消息发送,应用程序开发人员无需了

qq_29675447的博客 503

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jms 教程_JMS教程–什么是JMS

jms 教程Nowadays, most of the enterprise applications are using messaging concept for asynchronous communication between heterogeneous applications using JMS or AMQP. I’m going to deliver a series of po...

从零开始的教程世界 1293

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【JMS】JMS详解

一、JMS介绍 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或者在分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。 &amp;nbsp;

lmb55的专栏 2718

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

四、JMS规范

【代码】四、JMS规范。

青啊青斯博客 1090

运用JMS传递消息

有很多可选方法可以发送和确认接收消息,这就使开发人员可以灵活地在应用程序之间传递消息。 by Peter Varhol 企业中的消息传递(messaging)越来越被公认为是创建企业应用程序的重要工具,对于创建应用程序本身来说,它的重要性也许不太明显,但对于跨商业过程的应用和集成来说,其重要性就很大了。消息传递可以使我们在不能同步工作的应用程序或应用程序组件之间建立异步的通讯通道。建立这些类型

kiOm的专栏 3407

JMS简介

1什么是JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。 JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(java Database Connectiv...

小花生编程 1507

什么是 JMS?

 MessageDrivenBean 在 EJB 2.0 中,对规范的一个基础性更改是添加了一种全新的企业级 bean 类型,即 MessageDrivenBean。MessageDrivenBean 专门设计来处理入网的 JMS 消息。对于许多开发人员来说,JMS 是一种新的范例,所以本文将花一些时间逐步说明对 JMS 的理解,以及它们在 EJB 2.0 中的用法。 什么是 JMS? JMS

自由引导码民! 1120

MQ、JMS以及ActiveMQ

MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要

Eliot 1万+

JMS —— ActiveMQ入门

JMS:Java 消息服务(Java Message Service),是 Java 平台上有关面向 MOM 的技术规范,旨在通过提供标准的产生、发送、接收和处理消息的 API 简化企业应用的开发,类似于 JDBC 和关系型数据库通信方式的抽象。 Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是) Domains:消息传递方式,包括点对点(P2...

DOONDO的技术窝 247

什么是JMS(Java消息服务)

{转} 在不同系统之间交换信息的一大障碍是如何在精确交换和格式化数据方面取得一致。Java Message Service( Java消息服务,简称JMS)通过提供一种与J2EE应用程序或传统系统交互的方法部分的解决了这个问题。   JMS的通用接口集合以异步方式发送或接收消息。异步方式接收消息显然是使用间断网络连接的客户机,诸如移动电话和PDA的最好的选择。另外, JMS采用一种宽松结合方式整合

javaActor的专栏 605

Java中间件JMS(五)之JMS入门

JMS 的概念 JMS(Java Message Service),即 Java 消息服务,是一组 Java 应用程序接口,用以提供创 建、发接、接收、读取消息的服务。SUN 只提供接口,由不同的厂商根据该接口提供自己 的实现。 JMS 的中间件 � IBM MQ 系列产品提供的服务使得应用程序可以使用消息队列进行交流,通过一系列 基于 Java 的 API 提供了 MQseri

dwc_fly的专栏 3581
上一篇: 关于applet写入文件的处理
下一篇: WebLogic在线代码例程
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值