显示导航

带有365bet地区和RabbitMQ的消息队列

365bet地区了解如何通过365bet地区和RabbitMQ Native插件使用消息队列

s本·莱茵·塞尔吉奥·德尔阿莫

365bet地区版本 3.3.2

训练

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,我们将向您展示如何设置和使用兔子MQ365bet地区使用365bet地区应用程序我们将使用Rabbitmq原生插入

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区365bet地区指南存储库包含三个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成

  • 完整的分析

365bet地区在本指南中,您将创建两个365bet地区应用程序完成完整的分析应用是一个完整的示例,它是按照指南中介绍的步骤进行操作并将这些更改应用到初始

要完成指南,请转到初始

  • 光盘进入grails指南grails rabbitmq初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails rabbitmq完成grails指南grails rabbitmq完整分析.

应用概述

在本指南中,我们设置了一个可在两个不同应用程序之间工作的消息队列。在本指南中,我们有一个应用程序,其中列出了书籍和书籍的详细信息。我们希望跟踪每本书的阅读次数,并添加一个单独的分析应用程序,以保持跟踪查看每个人的次数

总结

消息队列RabbitMQ

消息队列的构造提供了异步通信,这意味着发送方和接收方不需要同时与消息队列进行交互。发送消息时,它将被添加到队列中并进行存储,直到接收者检索到它们为止。消息队列可以在内部使用在一个应用程序中或在外部有多个应用程序的应用程序中,存在许多不同的消息队列实现,但是其中一种较为流行,我们将在本指南中使用的一种是RabbitMQ

设置RabbitMQ服务

要在系统上启动RabbitMQ并运行,可以使用多种不同的方法进行设置和运行。您可以选择遵循RabbitMQ本身的指示。这里但我们建议您遵循我们为奇偶校验设置的方式

为了具有与现实世界类似的设置,我们选择使用以下方法设置RabbitMQ码头工人Docker是一个容器引擎,它可以快速,简单地安装许多不同的框架和产品,并避免在本地系统中出现差异,从而提供有保证的干净实例,这是因为它的快速,简便,易于拆卸和重新设置(如果遇到任何问题)您要运行的产品我们假设您已经在系统上安装了Docker,但是如果不这样做,则可以从以下位置安装这里.

确保Docker在本地系统上运行您应该会看到一点鲸鱼

在您知道Docker已启动并从终端运行后,运行以下命令

docker run d主机名我的兔子名某些兔子p p p p p p rabbitmq管理

上面的命令为您下载并运行了dockerized的RabbitMQ实例,它为您做了很多工作,设置了主机名,为该实例提供了一个名称,该名称配置了成功访问RabbitMQ所需的端口,并包括管理界面,因此我们可以对消息的处理方式有更深入的了解队列正常工作命令完成后,您将看到类似于以下内容的输出

dockerCmdSuccess

除了Docker外,您可能还希望有一个更直观的界面来查看RabbitMQ容器的运行情况。如果是这样,请下载Kitematic,这是基础Docker服务的GUI界面。Docker甚至可以帮助您从其菜单中获取Kitematic。

dockerMenu

如果您安装了Kitematic,现在应该看到您的RabbitMQ实例在左侧运行

kitematic兔子

如上所述,我们包含了RabbitMQ管理界面,因此我们可以查看有关消息队列的一些详细信息。您可以访问位于以下位置的管理界面本地主机.

rabbitMQAdminLogin

要使用来宾来宾的用户名进行登录,成功登录后,您将看到以下页面

有关此特定Docker容器的更多信息,请查看文档这里.

图书申请

我们已经将必要的资产书封面图像添加到了最初的grails应用程序资产图像给你的文件夹

展望未来,我们将需要向我们的应用程序添加其他功能,因为我们将不再仅使用一个应用程序。首先,我们需要添加一个

365bet地区应用程序域演示书groovy
演示进口 grails编译器365bet地区CompileStatic

365bet地区CompileStatic
  {
    图片标题作者关于href静态的映射图像可为空: 标题可为空: 作者可为空: 关于可为空: href可为空: 关于类型: '文本'
    }
}

我们将使用自定义找到所有返回我们的书籍清单,为此,我们需要使用其他BookImage对象首先创建您的BookImage在里面src主界面目录

src main groovy演示BookImage groovy
演示进口 常规转换CompileStatic

静态编译
 BookImage {
    longID图片

为创建默认的CRUD操作借力GORM数据服务.

365bet地区应用服务演示BookDataService groovy
演示进口 grails gorm services服务
进口 grails gorm交易ReadOnly
进口 常规转换CompileDynamic
进口 常规转换CompileStatic
进口 组织grails数据存储区映射查询api BuildableCriteria
进口 组织休眠转换变形金刚

接口iBookDataService保存标题作者关于href图片计数findByIdlongID服务()
抽象  BookDataService 实施iBookDataService动态编译
    只读
    清单findAll BuildableCriteria ccreateCriteria c列表resultTransformer变形金刚aliasToBean BookImage projections属性'ID', 'ID'属性'图片', '图片')
            }
        }
    }
}

接下来,将新控制器连接到我们刚刚创建的服务上,索引将利用我们的自定义找到所有返回完整的书籍清单,而我们的展览将利用数据服务findById.

365bet地区应用控制器演示BookController groovy
演示进口 常规转换CompileStatic

静态编译
 BookController {

    静态的allowedMethods指数: '得到', 节目: '得到'BookDataService bookDataService定义 指数() {
        [bookListbookDataService findAll定义 节目(longIDbookInstancebookDataService findById ID

然后,我们需要使用Bootstrap常规

grails应用程序初始化演示Bootstrap groovy
演示进口 常规转换CompileStatic

静态编译
 引导带 {

    上市 最后 静态的 清单< 地图<, GRAILS BOOKS标题'365bet地区格劳斯一步一步',
                    作者: '克里斯蒂安·奥拉鲁(Cristian Olaru)',
                    href: 'https grailsthreebook com'关于'365bet地区了解如何使用配置文件和插件使用365bet地区快速有效地实现完整的绿地应用程序。以本书随附的示例应用程序为例。',
                    图片: '一步一步png'标题'365bet地区实用365bet地区',
                    作者: '埃里克·赫尔格森'href'https www grails book com'关于'365bet地区通过第一本专门针对365bet地区的书,学习构建365bet地区应用程序背后的基本概念。提供了最新的代码示例,使您可以轻松地继续学习。',
                    图片: '实用的grails书籍封面png'标题'365bet地区谈到365bet地区',
                    作者: '恩里克·罗伯·魏斯曼'href'http www casadocodigo com br产品grails书'关于'365bet地区这是365bet地区上最好的参考,用葡萄牙语编写。它是处理许多用户往往忽略的细节的框架的出色指南。',
                    图片: '格雷斯·魏斯曼png'标题'365bet地区365bet地区善良笔记本',
                    作者: '休伯特·克莱因·伊金克'href'https leanpub com grails善良笔记本'关于'365bet地区通过代码片段体验365bet地区框架通过代码示例和简短文章发现365bet地区隐藏的功能这些文章和代码将帮助您快速入门,并提供对365bet地区的更深入了解。',
                    图片: 'grailsgood png'标题'365bet地区权威指南',
                    作者: 'Jeff Scott Brown和Graeme Rocher'href'http www apress com'关于'365bet地区如标题所示,这是由开发团队核心成员编写的有关365bet地区框架的权威性参考',
                    图片: 'grocher jbrown封面jpg'标题'365bet地区行动中的365bet地区',
                    作者: '格伦·史密斯和彼得·莱德布鲁克'href'http www manning com gsmith'关于'365bet地区《 365bet地区 in Action》的第​​二版全面介绍了365bet地区,旨在帮助您快速提高生产力',
                    图片: 'gsmith封面jpg'标题'365bet地区365bet地区快速入门指南',
                    作者: '戴夫·克莱因和本·克莱因'href'http www亚马逊com gp产品标签misa'关于'365bet地区此修订和更新的版本通过迭代构建一个唯一的工作应用程序向您展示了如何使用365bet地区。'图片'bklein封面jpg'标题'365bet地区编程365bet地区',
                    作者: '伯特·贝克维斯'href'http shop oreilly com产品吗'关于'365bet地区深入研究365bet地区架构,发现此应用程序框架如何发挥其魔力',
                    图片: 'beckwith封面gif'
            ]
    ]  清单< 地图<, > >

    上市 最后 静态的 清单< 地图<, 古籍书标题: '使Java Groovy',
                    作者: '知道丝袜',
                    href: 'http www manning com kousen',
                    关于: '通过添加Groovy使Java开发更容易每章重点介绍Java开发人员所做的任务,例如构建测试或使用数据库或静态Web服务,并展示Groovy如何使这些任务更容易',
                    图片: '丝袜MJG png',
            ],
            [
                    标题: 'Groovy in Action nd Edition',
                    作者: 'DierkKönig纪尧姆·拉福格Paul KingCédricChampeau Hamlet D\'艾西·埃里克·普拉格特(Arcy Erik Pragt)和乔恩·斯基特(Jon Skeet)',
                    href: 'http www manning com koenig',
                    关于: '这是开发团队核心成员撰写的有关Groovy语言的无可争议的权威参考。',
                    图片: '里贾纳png',
            ],
            [
                    标题: '针对特定领域语言的Groovy',
                    作者: '菲加尔·迪尔',
                    href: '针对特定领域语言的http www packtpub com groovy DSL书',
                    关于: '了解Groovy如何帮助Java开发人员轻松将领域特定的语言构建到他们的应用程序中',
                    图片: 'gdsl jpg',
            ],
            [
                    标题: 'Groovy食谱',
                    作者: '安德烈·亚当莫维奇(Andrey Adamovitch)',
                    href: 'http www packtpub com常规食谱书',
                    关于: '本书不仅仅包含使用Groovy强大功能来开发针对日常编程挑战的解决方案的食谱',
                    图片: '克果汁',
            ],
            [
                    标题: '编程Groovy',
                    作者: '文卡特·苏布拉马尼亚姆(Venkat Subramaniam)',
                    href: 'http pragprog com book vslg编程groovy',
                    关于: '本书可帮助经验丰富的Java开发人员学习使用Groovy的知识,包括该语言的基础知识及其最新进展。',
                    图片: 'vslg zpg'
            ],
    ]  清单< 地图<, BookDataService bookDataService定义初始化ServletContext对于 (地图<, bookInfo GRAILS BOOKS GROOVY BOOKS bookDataService保存bookInfo标题bookInfo作者bookInfo关于bookInfo href bookInfo图像定义破坏

最后,我们更新了网址映射,以便我们的默认网址将显示图书清单

grails应用程序控制器演示UrlMappings groovy
演示 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "/"(控制者: "") (1)
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}
1 更新了默认网址

运行应用

gradlew bootRun
图书首页

RabbitMQ发布者

将RabbitMQ Native插件添加到初始应用程式

建立gradle
编译"org grails插件Rabbitmq本机"

添加依赖项后,我们就可以继续并添加必要的配置以连接到RabbitMQ

grails应用配置会议应用yml
Rabbitmq:
    连接数:
      - 主要名称(1)
        主办: 本地主机(2)
        港口: 5672
        用户名: 客人(3)
        密码: 客人(4)
    s列:
      - 名称bookQueue (5)
1 所有连接都需要一个名称,但是您可以随意命名
2 在这种情况下,RabbitMQ位于我们的本地系统上,但是它也可以是网址或ip地址
3 默认用户名客人
4 默认密码客人
5 创建一个书队

当查看某本书的详细信息时,我们会向RabbitMQ发布一条消息,以便创建一个拦截器.

在中创建一个新的拦截器365bet地区应用控制器演示BookShowInterceptor常规.

365bet地区应用控制器演示BookShowInterceptor groovy
演示进口 com budjb rabbitmq发布者RabbitMessagePublisher
进口 常规转换CompileStatic

静态编译
 BookShowInterceptorRabbitMessagePublisher rabbitMessagePublisher(1)BookShowInterceptor(2)比赛控制者:"", 行动:"节目")
    }

    布尔值(3)
        最后 样板书实例(4)rabbitMessagePublisher发送(5)routingKey"bookQueue"身体ID书号标题书名真正
    }
}
1 注入rabbitMessagePublisher
2 调用书本控制器show方法时进行拦截
3 方法在操作之后但在视图呈现之前执行。它返回true以继续处理视图
4 型号可在检索有关当前对象的数据的方法
5 使用特定队列发送指定的消息使用发送发送消息时,不希望返回消息

建筑分析应用

365bet地区为此其他应用程序创建一个新的365bet地区应用程序,例如通过使用365bet地区应用伪造或命令行

grails创建应用程序初始分析配置文件其余api

对于本指南的多应用程序部分,我们将需要能够同时运行两个应用程序,以避免运行中的端口冲突,请更新您的初步分析应用程式yml应用程序包括以下内容

grails应用配置会议应用yml
服务器:
  港口: 8090

创建一个域类BookPageView这将跟踪查看过一本书的次数

365bet地区应用程序域演示BookPageView groovy
演示进口 grails编译器365bet地区CompileStatic
进口 grails rest资源

资源资源
365bet地区CompileStatic
 BookPageView {
    longbookIdbookName整数意见静态的约束bookId可为空: , 独特: 真正bookName可为空: 意见可为空: , : 0
    }
}

和以前一样,为我们的创建默认操作BookPageView利用数据服务

365bet地区应用服务演示BookPageViewDataService groovy
演示进口 grails gorm服务查询
进口 grails gorm services服务
进口 grails gorm Transactions事务性
进口 常规转换CompileStatic

静态编译
接口IBookPageViewDataService虚空删除可序列化id BookPageView保存longbookIdbookName整数视图BookPageView findByBookIdlongbookId询问("选择$b来自的意见${BookPageView b}哪里$bbookId$bookIdParam") (1)
    清单<整数findViewsByBookIdlongbookIdParam询问("更新${BookPageView b}${意见} = ${意见}哪里$bbookId$bookIdParam") (2)
    updateViewslongbookIdParam服务BookPageView抽象  BookPageViewDataService 实施IBookPageViewDataService交易性
    虚空增量longbookIdbookName清单<整数视图findViewsByBookId bookId如果查看自己bookId bookName1)
        } 其他updateViews bookId
1 使用JPA QL查询执行投影
2 使用JPA QL实施更新操作

添加集成测试

完整的src集成测试groovy演示BookPageViewDataServiceSpec groovy
演示进口 grails测试mixin集成集成
进口 spock lang忽略
进口 spock lang规格

忽略( { 系统盖滕'特拉维斯')  布尔值 } )
积分
 BookPageViewDataServiceSpec 延伸规格BookPageViewDataService bookPageViewDataService定义 "测试增量"() {
        期望bookPageViewDataService findByBookId2)

        什么时候bookPageViewDataService增量2, '实用365bet地区'BookPageView bookPageView bookPageViewDataService findByBookId2)

        然后bookPageView bookPageViewDataService findByBookId2意见1

        什么时候bookPageViewDataService增量2, '实用365bet地区'bookPageView bookPageViewDataService findByBookId2)

        然后bookPageView bookPageViewDataService findByBookId2意见2

        清理bookPageViewDataService删除bookPageView ID

RabbitMQ消费者

我们需要创建一个新的消费者,我们将在初步分析应用程序首先导航到分析应用程序

cd yourProjectLocation初始分析

然后像以前一样创建一个新的消费者

grailsw创建消费者演示BookPageViewConsumer

编辑生成的使用者,如下所示

365bet地区应用程序兔子消费者演示BookPageViewConsumer groovy
演示进口 com budjb rabbitmq消费者MessageContext
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j

自我
静态编译
 BookPageViewConsumerBookPageViewDataService bookPageViewDataService(1)

    静态的rabbitConfig(2)
            队列: "bookQueue"
    ]

    处理传入的RabbitMQ消息参数主体传入消息参数上下文的已转换主体传入消息的属性返回
    定义 贸易消息(地图正文MessageContext messageContext日志调试'{}'正文toString bookPageViewDataService增量long身体ID正文标题(3)
    }
}
1 添加我们的页面查看服务
2 告诉我们的消费者连接哪个队列
3 告诉我们的消费者收到消息后该怎么做致电我们的自定义增量操作

运行应用

要查看我们的两个应用程序使用RabbitMQ异步通信,我们必须同时运行两个应用程序,以打开两个单独的终端。

cd yourProjectLocation初始

然后

gradlew bootRun

第二航站楼的下一个

cd yourProjectLocation初始分析

然后

gradlew bootRun

现在,两个应用程序都运行,打开两个浏览器选项卡。在选项卡一中,导航至HTTP本地主机而且您应该会看到可用的书籍清单

然后在第二个标签中导航到http本地主机BookPageView你应该看到一个空数组

选择一本要单击的书,单击后应该会看到书的描述

而且,如果您刷新分析页面,您现在将看到该书已经被查看了

在几本书上尝试一下,然后返回并重新访问上一本书,然后刷新分析页面以查看每本书有多少次浏览

此外,如果您查看运行分析应用程序的终端,则可以看到其收到的消息

ConsumerMessageReceived

兔子管理

如本节前面所述setupRabbit我们可以访问位于的Rabbit管理控制台HTTP本地主机继续并导航到控制台并登录登录后选择Queue列从菜单

messageQueues

从这里您可以看到我们使用我们的应用程序创建的两个队列现在选择Overview选项卡并返回到管理主页在查看主页时,请注意队列中有消息

emptyQueue

此时,请从终端停止您的分析应用Ctrl C然后返回到仍在运行的应用程序,然后单击并查看更多的书一旦查看了更多的书,将返回到您的管理主页,您将看到已生成新消息并在队列中等待

UpdatedAdminHome

继续并立即从终端重新启动分析应用程序

gradlew bootRun

分析应用重新启动后,您将看到它处理等待的消息,当您返回Rabbit管理员时,您将看到消息队列已返回到

processingPrePostedMessages

下一步

为了进一步理解,请通读所找到的插件文档这里此外,请随时阅读RabbitMQ文档这里看看其中有许多可用不同语言的示例这里.

您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队