`
sillycat
  • 浏览: 2578981 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring Hot(3)Spring with RabbitMQ

    博客分类:
  • JAVA
 
阅读更多

Spring Hot(3)Spring with RabbitMQ

1. Some Concepts
Work Queue
Exchange: direct, topic, headers, fanout

Core Classes —> ConnectionFactory, Connection, Channel, QueueingConsumer
http://wubin850219.iteye.com/blog/1007984

Core Features
spring-amqp, spring-erlang, spring-rabbit
Message
Exchange —> DirectExchange, TopicExchange, FanoutExchange, HeadersExchange
Queue
Binding  —> Exchange, Queue, RoutingKey
AmqpTemplate ——> Send the Message
AmqpAdmin/RabbitAdmin ——> Queue, Exchange, Binding
MessageConverter ——> Convert the message
SimpleMessageListenerContainer ——> Listener

2. Working with Spring Send Message
Reading the samples from official website.
>git clone https://github.com/spring-projects/spring-amqp-samples.git

Import that into our Eclipse
>mvn eclipse:eclipse

3. Configuration on Spring
Here is the dependency configuration
<!-- spring RabbitMQ --><dependencyorg="org/springframework/amqp"  name="spring-rabbit"rev="1.3.4.RELEASE"/><dependencyorg="org/springframework/amqp"  name="spring-amqp"rev="1.3.4.RELEASE"/><dependencyorg="com/rabbitmq"name="amqp-client"rev="3.3.3"/>

Here is the spring configuration
<?xml version="1.0” encoding=“UTF-8”?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd             http://www.springframework.org/schema/tx            http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

 

<rabbit:connection-factory

   id="connectionFactory"      

   addresses="localhost:5672,localhost:5673"

   username="guest" password="guest"/>    

<rabbit:template

   id="amqpTemplate"

   connection-factory="connectionFactory" />    

<rabbit:admin

   id="containerGuest"

   connection-factory="connectionFactory" />   

<rabbit:queue

   name="myqueue1"

   declared-by="containerGuest" />   

<rabbit:queue

   name="myqueue2"

   declared-by="containerGuest" />       

 

<bean id="messageConverter"                class="org.springframework.amqp.support.converter.SimpleMessageConverter">      </bean>       

 

<bean id="receiveMessageHandler"    class="com.sillycat.easyspringrabbitmqpublisher.main.ReceiveMessageHandler" />         

<bean id="messageListenerAdapter"  class="org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter">         <constructor-arg ref="receiveMessageHandler" />         

        <property name="defaultListenerMethod" value="handleMessage"></property>          <property name="messageConverter" ref="messageConverter"></property>      </bean>        

<bean id="listenerContainer"          class="org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer">          <constructor-arg ref="connectionFactory" />       

        <property name="queues" ref="myqueue2" />       

        <property name="messageListener" ref="messageListenerAdapter" />     </bean>

</beans>


Sync Send and Receive Message
package com.sillycat.easyspringrabbitmqpublisher.main;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class SendOneMessageApp {

     public static void main(String[] args) {
          ApplicationContext context = new GenericXmlApplicationContext(
                    "classpath:main-context.xml");
          AmqpTemplate template = context.getBean(AmqpTemplate.class);

          // Sync send Message
          template.convertAndSend("myqueue1", "message1");
          System.out.println("Done");
     }
}

package com.sillycat.easyspringrabbitmqpublisher.main;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class ReceiveOneMessageApp {

     public static void main(String[] args) {
          ApplicationContext context = new GenericXmlApplicationContext(
                    "classpath:main-context.xml");
          AmqpTemplate template = context.getBean(AmqpTemplate.class);

          // Sync receive Message
          String foo = (String) template.receiveAndConvert("myqueue1");
          System.out.println("What I get from Sync = " + foo);
     }
}

Async Handle Message
package com.sillycat.easyspringrabbitmqpublisher.main; import java.util.Date; publicclass ReceiveMessageHandler { publicvoid handleMessage(String message){      System.out.println("Received " + message + " at " + new Date()); } }

All the details are in project easyspringrabbitmqpublisher.

Tips
1. Permission Problem
Error Message:
Caused by: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:338)at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:590)

Solutions:
Visit this page and change what you want.
http://localhost:15672/#/users



References:
http://wubin850219.iteye.com/blog/1002932  Simple Working Queue, Buffering
http://wubin850219.iteye.com/blog/1003840  Working Queue, Split tasks to workers
http://wubin850219.iteye.com/blog/1004921   Publish/Subscribe
http://wubin850219.iteye.com/blog/1004948   Routing
http://wubin850219.iteye.com/blog/1004973   Topics
http://wubin850219.iteye.com/blog/1007984   Core Class

http://sillycat.iteye.com/blog/2066116  Configure the Cluster

http://projects.spring.io/spring-amqp/#quick-start
http://docs.spring.io/spring-amqp/docs/1.3.4.RELEASE/reference/html/quick-tour.html#d4e59
http://wubin850219.iteye.com/blog/1050279   sync 
http://wubin850219.iteye.com/blog/1050328   async

Samples
https://github.com/spring-projects/spring-amqp-samples

User Management
https://www.rabbitmq.com/man/rabbitmqctl.1.man.html

分享到:
评论

相关推荐

    spring-boot-reference.pdf

    4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. Getting Started 8. Introducing Spring Boot 9. System Requirements 9.1. Servlet ...

    Java开发宝典与高阶技术实战第一版

    11. Spring Boot还支持与多种第三方库的集成,如数据库(MySQL、PostgreSQL、MongoDB等)、缓存(Redis、Ehcache等)、消息队列(RabbitMQ、Kafka等)以及安全框架(Spring Security、OAuth2等),使得开发者可以...

    呼伦贝尔市-鄂温克族自治旗-街道行政区划_150724_Shp数据-wgs84坐标系.rar

    呼伦贝尔市-鄂温克族自治旗-街道行政区划_150724_Shp数据-wgs84坐标系.rar

    Cruise纯电动汽车仿真输入模板详解:涵盖8大核心模块参数设置与代码实现

    内容概要:本文详细介绍了用于Cruise纯电动汽车仿真的输入模板,该模板由8个表单组成,覆盖了从整车参数到计算输出的各个方面。每个表单都包含了关键参数的设置方法及其背后的逻辑,如校核清单、整车参数、电池参数、电机参数、传动系参数、制动轮胎参数、能量回收参数以及最终的计算输出。文中不仅提供了具体的参数定义和计算公式,还附有Python代码示例,帮助用户更好地理解和应用这些参数。此外,作者还分享了一些实用技巧,如防止参数遗漏的校验函数、处理电池温度效应的实际容量计算函数等。 适合人群:从事纯电动汽车仿真工作的工程师和技术人员,尤其是那些需要频繁处理复杂输入参数的人群。 使用场景及目标:① 提高纯电动汽车仿真工作的效率和准确性;② 规范参数收集流程,减少因参数错误导致的仿真失败;③ 提供详细的参数设置指导和代码实现,帮助用户更好地理解和应用Cruise仿真平台。 其他说明:本文不仅提供了一个全面的输入模板,还分享了许多实践经验,旨在帮助用户在实际工作中少走弯路,提高工作效率。

    张家口市-桥西区--街道行政区划_130703_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    通辽市-通辽市-街道行政区划_150500_Shp数据-wgs84坐标系.rar

    街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用

    【预编码】基于matlab大规模多用户MIMO系统低复杂度混合预编码(Rayleigh信道)【含Matlab源码 13197期】.zip

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

    CTF竞赛基于杂项题目的隐写术与编码挑战:涵盖LSB隐写、摩斯密码、进制转换及文件格式转换技巧了文档的核心内容

    内容概要:本文档是作者在bugku平台进行CTF(夺旗赛)杂项题目练习的解题思路总结,涵盖第25至33题。题目类型多样,包括但不限于隐写术、进制转换、音频分析、图像处理等。每道题都详细介绍了背景信息、解题步骤和所使用的工具,如Stegsolve用于图片隐写分析、Python脚本处理进制转换、Audacity解析音频中的摩尔斯电码等。通过这些实例,展示了如何运用各种技术手段解决实际问题,强调了理论与实践相结合的重要性。 适合人群:对信息安全、逆向工程感兴趣的读者,特别是有一定编程基础和技术积累的安全爱好者或初学者。 使用场景及目标:①学习隐写术的基本原理及其在CTF比赛中的应用;②掌握不同进制间的转换方法及其实现;③熟悉音频文件中提取摩尔斯电码的技术;④了解图像处理技巧,如调整尺寸、解析隐藏信息等;⑤掌握压缩文件的明文攻击技巧,以及如何利用已知信息破解加密文件。 阅读建议:由于每道题涉及的知识点较为独立且专业性强,建议读者根据自己的兴趣选择相关题目深入研究。同时,在学习过程中应注重动手实践,尝试复现文中提到的操作流程,并结合网络资源进一步拓展知识面。对于遇到的工具和概念,可以通过查阅官方文档或参考教程加深理解。

    Qt时间标尺控件:实现丝滑缩放与自适应刻度的高效可视化组件

    内容概要:本文详细介绍了如何在Qt中实现一个高效的时间标尺控件,重点讲解了时间标尺的缩放功能、刻度自动生成以及曲线绘制的技术细节。首先,通过重载wheelEvent方法,利用QGraphicsView框架实现了基于鼠标的缩放功能,确保缩放过程中鼠标位置对应的时间点不变。其次,针对不同的时间范围,采用对数分级算法自动调整刻度间隔,使刻度线既美观又实用。最后,在曲线绘制方面,使用QPainterPath进行路径构建,并通过预处理和分段绘制优化性能,确保即使面对大量数据点也能保持流畅的用户体验。 适合人群:具有一定Qt开发经验的程序员,尤其是从事数据可视化项目的开发者。 使用场景及目标:适用于需要展示时间序列数据的应用程序,如金融图表、监控系统、日志分析工具等。主要目标是提供一个响应迅速、视觉效果优秀的交互式时间标尺控件,帮助用户更好地理解和分析数据。 其他说明:文中还提到了一些性能优化的小技巧,如数据预处理、路径分段绘制等,有助于提高大型数据集的渲染速度。同时,作者强调了在时间转换函数中避免使用低效的方法,推荐自行实现高效的缓存机制。

    天津市-静海区-街道行政区_120118_Shapefile_wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    石家庄市-石家庄市-石家庄市-赵县-街道行政区划_130133_Shp数据wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    赤峰市-喀喇沁旗-街道行政区划_150428_Shp数据-wgs84坐标系.rar

    赤峰市-喀喇沁旗-街道行政区划_150428_Shp数据-wgs84坐标系.rar

    【时间序列预测】基于Python和LSTM的时间序列预测系统设计与实现:从环境搭建到案例实战

    内容概要:本文详细介绍了使用Python和LSTM(长短期记忆网络)进行时间序列预测的方法及其应用场景。首先阐述了时间序列预测的重要性,指出传统ARIMA模型在处理复杂模式和长期依赖关系时的局限性,进而引出LSTM的优势。LSTM通过引入门控机制(输入门、遗忘门、输出门)和记忆单元,有效解决了长期依赖问题,能更好地捕捉时间序列中的复杂模式。接着,文章详细讲解了LSTM的工作原理,包括各个门控机制的作用和计算流程。随后,通过股票价格预测和气温预测两个案例,逐步演示了从环境搭建、数据准备(包括数据读取、归一化处理)、模型构建(使用Keras搭建LSTM模型)、模型编译、训练与评估到预测结果可视化的全过程。最后,文章总结了LSTM的关键技术和实现要点,并展望了其在自然语言处理、计算机视觉、生物学等领域的应用前景及未来研究方向。 适合人群:具备一定编程基础,尤其是对深度学习和时间序列预测感兴趣的开发者、数据科学家和研究人员。 使用场景及目标:①帮助读者掌握LSTM的基本原理和工作流程;②提供详细的Python实现步骤,包括环境配置、数据处理、模型搭建与训练;③通过具体案例展示LSTM在时间序列预测中的应用,如股票价格预测和气温预测;④探讨LSTM在其他领域的潜在应用,如自然语言处理、计算机视觉和生物学等。 阅读建议:本文内容详尽,涵盖理论与实践两方面,建议读者在阅读过程中结合代码实践,逐步理解LSTM的工作原理和实现细节,特别是注意数据处理和模型参数的选择对预测效果的影响。

    三菱FX5U机床双轴定位控制系统解析与优化 - 结构化编程及应用实例

    内容概要:本文详细介绍了基于三菱FX5U PLC的机床X轴和Y轴工作台定位控制系统的开发与优化过程。主要内容涵盖:使用J4-A系列伺服驱动器进行绝对位置控制,通过ST语言和结构化梯形图实现复杂的20组直线插补工序;手动模式下的点动与长按操作逻辑;MODBUS通讯协议的应用;以及详细的报警诊断和统计功能。文中展示了如何利用结构体封装参数,提高代码可读性和维护性,并通过具体案例解释了关键技术和调试经验。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是熟悉三菱PLC编程的从业者。 使用场景及目标:适用于需要深入了解三菱FX5U PLC编程技巧及其在实际工程项目中应用的人群。目标是掌握高级编程方法如结构化编程、ST语言特性、MODBUS通讯优化等,从而提升工作效率并减少调试时间。 其他说明:文章不仅提供了理论知识,还包括大量实用的编程技巧和实践经验分享,有助于读者更好地理解和应用于实际工作中。

    大同市-大同市-街道行政区划_140200_Shp数据-wgs84坐标系.rar

    大同市-大同市-街道行政区划_140200_Shp数据-wgs84坐标系.rar

    火电厂协调仿真机:提升PID参数调试效率与安全性

    内容概要:本文详细介绍了火电厂协调仿真机的应用及其优势,特别是在PID参数调试方面的高效性和安全性。文中通过具体的Python代码示例展示了如何构建锅炉和汽轮机的仿真模型,并解释了PID控制器的工作原理。重点讨论了PID参数调试的关键点,如响应延迟、采样时间设定以及前馈控制的叠加效果。此外,还提到了实时曲线对比、参数扫描、自整定算法等功能的实际应用,强调了仿真机在提高调试效率和降低现场调试风险方面的重要作用。 适合人群:从事火电厂自动化控制领域的工程师和技术人员,尤其是需要进行PID参数调试的专业人士。 使用场景及目标:① 提高PID参数调试效率,减少现场调试时间和成本;② 降低现场调试的安全风险;③ 实现更加精确和平稳的控制系统性能。 其他说明:文章不仅提供了理论指导,还结合了大量的实战经验和具体代码示例,帮助读者更好地理解和掌握协调仿真机的使用方法。

    邢台市-襄都区--街道行政区划_130502_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    保定市-博野县--街道行政区划_130637_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接使用。

    学号-姓名-作业二编写程序.ipynb

    学号-姓名-作业二编写程序.ipynb

    正弦内插算法的FPGA实现.docx

    正弦内插算法的FPGA实现.docx

Global site tag (gtag.js) - Google Analytics