前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站。引言你是否遇到过两个多个系统间需要通过定时任务来同步某些数据你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎如果是那么恭喜你消息服务让你可以很轻松地解决这些问题。消息服务擅长于解决多系统、异构系统间的数据交换消息通知/通讯问题你也可以把它用于系统间服务的相互调用RPC。本文将要介绍的RabbitMQ就是当前最主流的消息中间件之一。RabbitMQ简介AMQP即Advanced Message Queuing Protocol高级消息队列协议是应用层协议的一个开放标准为面向消息的中间件设计。消息中间件主要用于组件之间的解耦消息的发送者无需知道消息使用者的存在反之亦然。AMQP的主要特征是面向消息、队列、路由包括点对点和发布/订阅、可靠性、安全。RabbitMQ是一个开源的AMQP实现服务器端用Erlang语言编写支持多种客户端如Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等支持AJAX。用于在分布式系统中存储转发消息在易用性、扩展性、高可用性等方面表现不俗。Rabbitmq试用业务范围场景1单发送单接收使用场景简单的发送与接收没有特别的处理。场景2单发送多接收使用场景一个发送端多个接收端如分布式的任务派发。为了保证消息发送的可靠性不丢失消息使消息持久化了。同时为了防止接收端在处理消息时down掉只有在消息处理完成后才发送ack消息场景3Publish/Subscribe使用场景发布、订阅模式发送端发送广播消息多个接收端接收。场景4Routing (按路线发送接收)使用场景发送端按routing key发送消息不同的接收端按不同的routing key接收消息。场景5Topics (按topic发送接收)使用场景发送端不只按固定的routing key发送消息而是按字符串“匹配”发送接收端同样如此。1:下载所需的tar.gz包1)ncurses-5.2.tar(它是一个可以使应用程序直接控制终端屏幕显示的库,在安装rabbitmq-server中会报错缺少这个库)2)simplejson-3.8.0.tar(它是 Python解析JSON的程序库。)3)otp_src_R15B01.tar(RabbitMQ是基于Erlang的所以首先必须配置Erlang环境,otp_src_R15B01是提供该环境的包)4)rabbitmq-server-3.5.4.tar#########################搭建Erlang环境##############################2:登录到指定的一台linux服务器选择要创建一个文件夹我选择的目录是(目录名称可随便)/data/rabbitMQ3进入到该目录,做以下操作cd /data/rabbitMQtar xvzf otp_src_R15B01.tar.gzcd otp_src_R15B01./configure最后一步执行完可能会报一个错No curses library functions found(这是缺少ncurses-5.2.tar包)把ncurses-5.2.tar放到指定路径我这里放到的是/data/ncurses 下最好和之前放同一个路径执行以下操作tar zxvf ncurses-5.2.tar #解压缩并且释放 文件包cd ncurses-5.2 #进入解压缩的目录注意版本./configure #按照你的系统环境制作安装配置文件make #编译源代码并且编译NCURSES库su root #切换到root用户环境make install #安装编译好的NCURSES库等操作完以上命令在重新执行搭建Erlang环境的 ./configure 命令编译后的输出如下图提示没有wxWidgets和fop但是问题不大。继续makesudo make install如果没报错说明已经安装完Erlang开始安装RabbitMQ-Server。#########################搭建simplejson环境##############################安装RabbitMQ-Server之前必须先安装simplejson主要参考官方文档http://www.rabbitmq.com/build-server.html需要安装simplejson。从此处下载最新的版本 http://pypi.python.org/pypi/simplejson#downloads 。我下载的版本是 simplejson-3.8.0.tar.gz安装这个很简单执行以下3个步骤即可进入到该目录tar xvzf simplejson-3.8.0.tar.gzcd simplejson-3.8.0sudo python setup.py install#########################安装RabbitMQ Server环境##############################最后安装RabbitMQ Server。从此处下载源代码版本的RabbitMQ http://www.rabbitmq.com/server.html。我下载的版本是 rabbitmq-server-3.5.4.tar.gz进入该目录所需要的包yum install xmltotar xvzf rabbitmq-server-3.5.4.tar.gzcd rabbitmq-server-3.5.4makeTARGET_DIR/usr/local SBIN_DIR/usr/local/sbin MAN_DIR/usr/local/man make install安装成功。运行找到sbin/目录默认目录在/usr/local/sbin/下运行程序rabbitmq-server –detached停止程序rabbitmqctl stop安装管理插件mkdir /etc/rabbitmqcd /usr/local/sbin/./rabbitmq-plugins enable rabbitmq_management./rabbitmq-server -detached重新启动RabbitMQ输入http://server-name:15672 就能够进入到监控页面。默认的用户名和密码是 guest 和 guest。server-name:你指定的linux服务器ip我的是10.1.100.67浏览器输入http://10.1.100.67:15672/ 则说明环境搭建成功输入默认用户名和密码guest 提示登陆失败翻看官方的release文档后得知由于账号guest具有所有的操作权限并且又是默认账号出于安全因素的考虑guest用户只能通过localhost登陆使用并建议修改guest用户的密码以及新建其他账号管理使用rabbitmq(该功能是在3.3.0版本引入的)。解决方法进入/data/rabbitMQ/rabbitmq-server/rabbitmq-server-3.5.4/ebin目录下rabbit.app中找到loopback_users里的“guest”删除。并重启rabbitmq则可以用guest账号登陆管理控制台。成功界面如下Java 代码与spring集成1发送者配置文件?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:rabbithttp://www.springframework.org/schema/rabbit xmlns:phttp://www.springframework.org/schema/p xmlns:chttp://www.springframework.org/schema/c xsi:schemaLocation http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.3.xsd !-- #################################################################### -- !-- # RabbitMQ 消息转换器 -- !-- #################################################################### -- bean idrabbitMessageConverter classorg.springframework.amqp.support.converter.Jackson2JsonMessageConverter property nameclassMapper bean classorg.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper / /property /bean !-- #################################################################### -- !-- # RabbitMQ 异常处理程序 -- !-- #################################################################### -- bean idlogAndPropagateErrorHandler classorg.springframework.beans.factory.config.FieldRetrievingFactoryBean property namestaticField valueorg.springframework.scheduling.support.TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER/value /property /bean !-- #################################################################### -- !-- # rabbit 连接工厂 -- !-- #################################################################### -- rabbit:connection-factory idrabbitConnectionFactory addresses10.1.100.67 usernameguest passwordguest} / !-- #################################################################### -- !-- # RabbitMQ 管理员 -- !-- #################################################################### -- rabbit:admin connection-factoryrabbitConnectionFactory / !-- #################################################################### -- !-- # RabbitMQ 队列 -- !-- #################################################################### -- !-- 入库自动上架消息消息队列 -- rabbit:queue idqueues.inbound.putway namequeues.inbound.putway rabbit:queue-arguments !-- 开启集群环境镜像队列 -- entry keyx-ha-policy valueall / /rabbit:queue-arguments /rabbit:queue !-- #################################################################### -- !-- # RabbitMQ Exchange -- !-- # PSRabbitMQ 中所有生产者提交的消息都由 Exchange 来接受再由 Exchange 按照特定的策略转发到 Queue 进行存储/处理 -- !-- # 策略规则pattern 表达式中 # 表示0个或若干个关键字 * 表示一个关键字 -- !-- # 示例Aqueues.# 能匹配 queues.sample 也能匹配 queues.sample.one -- !-- # 示例Bqueues.* 能匹配 queues.sample 不能匹配 queues.sample.one -- !-- #################################################################### -- rabbit:topic-exchange nameamq.topic rabbit:bindings rabbit:binding queuequeues.inbound.putway patternqueues.inbound.#/ /rabbit:bindings /rabbit:topic-exchange !-- #################################################################### -- !-- # RabbitMQ 模板生产者 -- !-- #################################################################### -- rabbit:template idrabbitTemplate connection-factoryrabbitConnectionFactory channel-transactedtrue message-converterrabbitMessageConverter / /beans首先导入jarspring-rabbit-1.2.2.RELEASE.jar引入jarAutowired private RabbitTemplate rabbitTemplate; 发送者java代码 rabbitTemplate.convertAndSend(queues.inbound.putway,productPutaway); Queues.inbound.putway :xml 里面定义的id productPutaway:要发送的消息可以为字符串对象集合map等形式2消费者配置文件?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:rabbithttp://www.springframework.org/schema/rabbit xmlns:phttp://www.springframework.org/schema/p xmlns:chttp://www.springframework.org/schema/c xsi:schemaLocation http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.3.xsd !-- #################################################################### -- !-- # RabbitMQ 消息转换器 -- !-- #################################################################### -- bean idrabbitMessageConverter classorg.springframework.amqp.support.converter.Jackson2JsonMessageConverter property nameclassMapper bean classorg.springframework.amqp.support.converter.DefaultJackson2JavaTypeMapper / /property /bean !-- #################################################################### -- !-- # RabbitMQ 异常处理程序 -- !-- #################################################################### -- bean idlogAndPropagateErrorHandler classorg.springframework.beans.factory.config.FieldRetrievingFactoryBean property namestaticField valueorg.springframework.scheduling.support.TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER/value /property /bean !-- #################################################################### -- !-- # rabbit 连接工厂 -- !-- #################################################################### -- rabbit:connection-factory idrabbitConnectionFactory addresses10.1.100.67 usernameguest passwordguest} / !-- #################################################################### -- !-- # RabbitMQ 管理员 -- !-- #################################################################### -- rabbit:admin connection-factoryrabbitConnectionFactory / !-- #################################################################### -- !-- # RabbitMQ 队列 -- !-- #################################################################### -- !-- #################################################################### -- !-- # RabbitMQ 模板生产者 -- !-- #################################################################### -- rabbit:template idrabbitTemplate connection-factoryrabbitConnectionFactory channel-transactedtrue message-converterrabbitMessageConverter / !-- #################################################################### -- !-- # RabbitMQ 监听容器消费者 -- !-- #################################################################### -- rabbit:listener-container connection-factoryrabbitConnectionFactory message-converterrabbitMessageConverter channel-transactedtrue error-handlerlogAndPropagateErrorHandler !-- 货品上架单消费者 -- rabbit:listener queuesqueues.inbound.putway refproductPutAwayMessageConsumer methodsaveProductPutaway / /rabbit:listener-container /beans接收者Java代码/** * 收货入库单插入上架单消息对象介绍处理类 * author Min.Wang * */ Component public class ProductPutAwayMessageConsumer { Autowired private ProductPutawayService productPutawayService; /** * 保存上架单/给收货完成是调用 * author Min.Wang */ public void saveProductPutaway(ProductPutaway productPutaway){ //根据收到的消息数据处理对应的业务逻辑 } } 更多扩展请了解rabbitmq官网http://www.rabbitmq.com/