java rabbitmq 配置文件_005 Java 消息服务 JMS 和 RabbitMQ

问题

在java中,两个独立的应用程序之间进行通讯,每当程序A触发某事件之后,程序B(或者一组类似B的程序)得到信息之后执行一些操作。例如:用户注册程序在用户提交之后,会通知邮件发送程序给用户发送提示邮件。这个过程应该是完全解偶的互不知道对方的细节。

Java消息服务(JMS)

首先Java消息服务(JMS)是一个「接口」,是一组「API」,是一个技术规范,不提供任何实现。它制定了在整个消息服务提供过程中的所有数据结构和交互流程。

Java消息服务(JMS)指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。

在J2EE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的「消息收发服务」连接起来,达到解耦的效果。

消息队列(MQ)

MQ则是消息队列服务,是最终「实现」,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准,比如下面提到的AMQP。

AMQP

AMQP(advanced message queuing protocol),顾名思义,AMQP是一种协议(他自己说自己是先进的)。

这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。从这一点看,AQMP可以用http来进行类比,不关心实现的语言,只要大家都按照相应的数据格式去发送报文请求,不同语言的接受者均可以和不同语言的服务提供者链接。

总之

不管是不管是基于哪种技术标准实现的「消息队列」,最终都可以解决开头提出来的问题。

RabbitMQ

RabbitMQ , 是一个使用 erlang 编写的 AMQP (高级消息队列协议) 的服务实现。是一个具体的MQ, 就是一个功能强大的消息队列服务。

RabbitMQ分为消息生产者、消息消费者、交换器和队列。

消息生产者发送消息至交换器,交换器根据调度策略将消息分发给消息消费者。消息的生产者无需知道消息消费者的存在。

Producing , 生产者, 产生消息的角色。

Exchange , 交换器, 在得到生产者的消息后, 把消息扔到队列的角色。

Queue , 队列, 消息暂时呆的地方。

Consuming , 消费者, 把消息从队列中取出的角色。

安装RabbitMQ

「https://www.rabbitmq.com/download.html」官网地址

在官网中,我们可以获取到针对各种不同操作系统的安装包和说明文档。这里,我们将对mac平台说明。

brew更新到最新版本,执行:brew update

安装Erlang,执行:brew install erlang

安装RabbitMQ Server,执行:brew install rabbitmq

启动RabbitMQ:

brew services start rabbitmq

打开浏览器并访问:http://localhost:15672/,并使用默认用户guest登录,密码也为guest。我们可以看到管理页面。

在此说明一下RabbitMQ的端口,以防混淆。以上访问的15672是管理页面的端口,其server端口为5672,在工程中配置的便是server端口。

SpringBoot中整合RabbitMQ

1.首先在pom文件中添加依赖:

org.springframework.boot

spring-boot-starter-amqp

2.在application.properties中配置关于RabbitMQ的连接和用户信息:

spring.application.name=rabbitmq-hello

spring.rabbitmq.host=localhost

spring.rabbitmq.port=5672

spring.rabbitmq.username=guest

spring.rabbitmq.password=guest

3.建立生产者类:

package com.tang.demo1;

import org.springframework.amqp.core.AmqpTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import java.util.Date;

@Component

public class Sender{

@Autowired

private AmqpTemplate rabbitTemplate;

public void send(){

String context = "hello " + new Date();

System.out.println("Sender : " + context);

this.rabbitTemplate.convertAndSend("hello", context);

}

}

创建消息生产者Sender。通过注入AmqpTemplate接口的实例来实现消息的发送。在Spring Boot中会根据配置来注入其具体实现。在该生产者,我们会产生一个字符串,并发送到名为hello的队列中。

4.建立消费者类:

package com.tang.demo1;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;

import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.stereotype.Component;

@Component

@RabbitListener(queues = "hello")

public class Receiver{

@RabbitHandler

public void process(String context){

System.out.println("Receiver : " + context);

}

}

创建消息消费者Receiver。通过@RabbitListener注解定义该类对hello队列的监听,并用@RabbitHandler注解来指定对消息的处理方法。所以,该消费者实现了对hello队列的消费,消费操作为输出消息的字符串内容。

5.建立配置类:

package com.tang.demo1.config;

import org.springframework.amqp.core.Queue;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class RabbitMQConfig{

@Bean

public Queue queue(){

return new Queue("hello");

}

}

值得注意的是,Queue类是org.springframework.amqp.core.Queue的队列。

6.建立单元测试类

package com.tang.demo1.controller;

import com.tang.demo1.Sender;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)

@SpringBootTest

public class RabbitTest{

@Autowired

private Sender sender;

@Test

public void hello(){

sender.send();

}

7.运行

启动应用主类,可以看到console中尝试链接到RabbitMQ server,连接成功后建立了一个新的链接。

2018-03-03 15:02:26.540 INFO 38013 --- [cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]

2018-03-03 15:02:26.633 INFO 38013 --- [cTaskExecutor-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#1fc793c2:0/SimpleConnection@209ddf37 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 53316]

运行单元测试类,我们可以看到控制台中输出下面的内容,消息被发送到了RabbitMQ Server的hello队列中。

Sender : hello Sat Mar 03 15:02:26 CST 2018

切换到应用主类的控制台,我们可以看到类似如下输出,消费者对hello队列的监听程序执行了,并输出了接受到的消息信息。

Receiver : hello Sat Mar 03 15:02:26 CST 2018

以上就是RabbitMQ的简单开发内容,可以看出我们并没有对Receiver直接操作,而是通过消息队列发送消息,消费者通过监听,当队列有变化时来执行的。

// 微服务的应用,就是把一个服务器拆分成40个服务器,再加五个服务器来管理他们!(逃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值