1.创建Maven工程,pom.xml引入依赖:

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.1.0</version>
</dependency>

  2.生产者:

public class MyProducer {
private final static String EXCHANGE_NAME = "SIMPLE_EXCHANGE"; public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
// 连接IP
factory.setHost("192.168.254.137");
// 连接端口
factory.setPort(5672);
// 虚拟机
factory.setVirtualHost("/");
// 用户
factory.setUsername("guest");
factory.setPassword("guest"); // 建立连接
Connection conn = factory.newConnection();
// 创建消息通道
Channel channel = conn.createChannel(); // 发送消息
String msg = "Hello world, Rabbit MQ"; // String exchange, String routingKey, BasicProperties props, byte[] body
channel.basicPublish(EXCHANGE_NAME, "wuzz.test", null, msg.getBytes()); channel.close();
conn.close();
}
}

  3.消费者:

public class MyConsumer {
private final static String EXCHANGE_NAME = "SIMPLE_EXCHANGE";
private final static String QUEUE_NAME = "SIMPLE_QUEUE"; public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
// 连接IP
factory.setHost("192.168.254.137");
// 默认监听端口
factory.setPort(5672);
// 虚拟机
factory.setVirtualHost("/"); // 设置访问的用户
factory.setUsername("guest");
factory.setPassword("guest");
// 建立连接
Connection conn = factory.newConnection();
// 创建消息通道
Channel channel = conn.createChannel(); // 声明交换机
// String exchange, String type, boolean durable, boolean autoDelete, Map<String, Object> arguments
channel.exchangeDeclare(EXCHANGE_NAME,"direct",false, false, null); // 声明队列
// String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" Waiting for message...."); // 绑定队列和交换机
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"wuzz.test"); // 创建消费者
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String msg = new String(body, "UTF-8");
System.out.println("Received message : '" + msg + "'");
System.out.println("consumerTag : " + consumerTag );
System.out.println("deliveryTag : " + envelope.getDeliveryTag() );
}
}; // 开始获取消息
// String queue, boolean autoAck, Consumer callback
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}

参数说明:

声明交换机的参数:

  String type:交换机的类型,direct, topic, fanout中的一种。

  boolean durable:是否持久化,代表交换机在服务器重启后是否还存在。

  boolean autoDelete:是否自动删除。

声明队列的参数:

  boolean durable:是否持久化,代表队列在服务器重启后是否还存在。

  boolean exclusive:是否排他性队列。排他性队列只能在声明它的Connection中使用,连接断开时自动删除。

  boolean autoDelete:是否自动删除。如果为true,至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,队列会自动删除。

  Map<String, Object> arguments:队列的其他属性,例如x-message-ttl、x-expires、x-max-length、x-maxlength-bytes、x-dead-letter-exchange、x-dead-letter-routing-key、x-max-priority。

消息属性BasicProperties:

  消息的全部属性有14个,以下列举了一些主要的参数:

  Map<String,Object> headers 消息的其他自定义参数

  Integer deliveryMode 2持久化,其他:瞬态

  Integer priority 消息的优先级

  String correlationId 关联ID,方便RPC相应与请求关联

  String replyTo 回调队列

  String expiration TTL,消息过期时间,单位毫秒

  登陆 RabbitMQ 后台管理界面,先运行消费端,建立连接,创建通道,声明交换机,队列,创建消费者监听队列,打开后台管理页面可以看到如下信息:

  交换机的信息:

  后台管理界面可以看到当前的连接,Channel,Exchange,Queue等信息。

  由消费者来创建对象(交换机、队列、绑定关系)。

RabbitMQ常见配置:

1、TTL(Time To Live)消息的过期时间:

  有两种设置方式:通过队列属性设置消息过期时间,设置单条消息的过期时间。

// 通过队列属性设置消息过期时间
Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-message-ttl",6000); // 声明队列(默认交换机AMQP default,Direct)
// String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
channel.queueDeclare("TEST_TTL_QUEUE", false, false, false, argss); // 对每条消息设置过期时间
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
  .deliveryMode(2) // 持久化消息
  .contentEncoding("UTF-8")
  .expiration("10000") // TTL
  .build(); // 此处两种方式设置消息过期时间的方式都使用了,将以较小的数值为准 // 发送消息
channel.basicPublish("", "TEST_DLX_QUEUE", properties, msg.getBytes());

2.死信队列:

  有三种情况消息会进入DLX(Dead Letter Exchange)死信交换机。
    1、(NACK || Reject ) && requeue == false  设置手动应答ACK,且没有应答并且拒绝了消息,禁止消息入队。
    2、消息过期
    3、队列达到最大长度(先入队的消息会被发送到DLX)

// 创建消费者,并接收消息
Consumer consumer = new DefaultConsumer(channel) {
  @Override
  public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
    String msg = new String(body, "UTF-8");
    System.out.println("Received message : '" + msg + "'");     if (msg.contains("拒收")){
      // 拒绝消息
      // requeue:是否重新入队列,true:是;false:直接丢弃,相当于告诉队列可以直接删除掉
      // TODO 如果只有这一个消费者,requeue 为true 的时候会造成消息重复消费
      channel.basicReject(envelope.getDeliveryTag(), false);
    } else if (msg.contains("异常")){
      // 批量拒绝
      // requeue:是否重新入队列
      // TODO 如果只有这一个消费者,requeue 为true 的时候会造成消息重复消费
      channel.basicNack(envelope.getDeliveryTag(), true, false);
    } else {
      // 手工应答
      // 如果不应答,队列中的消息会一直存在,重新连接的时候会重复消费
      channel.basicAck(envelope.getDeliveryTag(), true);
    }
  }
};
// 开始获取消息,注意这里开启了手工应答
// String queue, boolean autoAck, Consumer callback
channel.basicConsume(QUEUE_NAME, false, consumer);

  可以设置一个死信队列(Dead Letter Queue)与DLX()死信交换机绑定,即可以存储Dead Letter,消费者可以监听这个队列取走消息。

Map<String,Object> arguments = new HashMap<String,Object>();
arguments.put("x-dead-letter-exchange","DLX_EXCHANGE");
// 指定了这个队列的死信交换机
channel.queueDeclare("TEST_DLX_QUEUE", false, false, false, arguments);
// 声明死信交换机
channel.exchangeDeclare("DLX_EXCHANGE","topic", false, false, false, null);
// 声明死信队列
channel.queueDeclare("DLX_QUEUE", false, false, false, null);
// 绑定
channel.queueBind("DLX_QUEUE","DLX_EXCHANGE","#");

3.优先级队列,可以让消息优先得到消费:

  可以通过创建队列的时候设置一个队列的优先级的最大值,然后设置指定消息的优先级的值。优先级高的消息可以优先被消费,但是:只有消息堆积(消息的发送速度大于消费者的消费速度)的情况下优先级才有意义。

Map<String, Object> argss = new HashMap<String, Object>();
argss.put("x-max-priority",10); // 队列最大优先级
channel.queueDeclare("ORIGIN_QUEUE", false, false, false, argss); Map<String, Object> headers = new HashMap<String, Object>();
headers.put("name", "gupao");
headers.put("level", "top"); AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
    .deliveryMode(2) // 2代表持久化
    .contentEncoding("UTF-8") // 编码
    .expiration("10000") // TTL,过期时间
    .headers(headers) // 自定义属性
    .priority(5) // 优先级,默认为5,配合队列的 x-max-priority 属性使用
    .messageId(String.valueOf(UUID.randomUUID()))
    .build();
channel.basicPublish("", "ORIGIN_QUEUE", properties, msg.getBytes());

4.延迟队列:

  RabbitMQ本身不支持延迟队列。可以使用TTL结合DLX的方式来实现消息的延迟投递,即把DLX跟某个队列绑定,到了指定时间,消息过期后,就会从DLX路由到这个队列,消费者可以从这个队列取走消息。

  另一种方式是使用rabbitmq-delayed-message-exchange插件。当然,将需要发送的信息保存在数据库,使用任务调度系统扫描然后发送也是可以实现的。

5.服务端流控(Flow Control):

  RabbitMQ 会在启动时检测机器的物理内存数值。默认当 MQ 占用 40% 以上内存时,MQ 会主动抛出一个内存警告并阻塞所有连接(Connections)。可以通过修改 rabbitmq.config 文件来调整内存阈值,默认值是 0.4,如下所示: [{rabbit, [{vm_memory_high_watermark, 0.4}]}].

  默认情况,如果剩余磁盘空间在 1GB 以下,RabbitMQ 主动阻塞所有的生产者。这个阈值也是可调的。

  注意:调整队列长度只在消息堆积的情况下有意义,而且会删除先入队的消息,不能实现服务端限流。

6.消费端限流:

  在AutoACK为false的情况下,如果一定数目的消息(通过基于consumer或者channel设置Qos的值)未被确认前,不进行消费新的消息。类似ActiveMQ的 FetchSize预取大小,这里也有这么一个概念。

channel.basicQos(2); // 如果超过2条消息没有发送ACK,当前消费者不再接受队列消息
channel.basicConsume(QUEUE_NAME, false, consumer);

Spring 集成 RabbitMQ:

ConnectionFactory:

  Spring AMQP 的连接工厂接口,用于创建连接。CachingConnectionFactory 是ConnectionFactory 的一个实现类。

RabbitAdmin:

  RabbitAdmin 是 AmqpAdmin 的实现,封装了对 RabbitMQ 的基础管理操作,比如对交换机、队列、绑定的声明和删除等。为什么我们在配置文件(Spring)或者配置类(SpringBoot)里面定义了交换机、队列、绑定关系,并没有直接调用 Channel 的 declare 的方法,Spring 在启动的时候就可以帮我们创建这些元数据?这些事情就是由 RabbitAdmin 完成的。RabbitAdmin 实 现 了 InitializingBean 接 口 , 里 面 有 唯 一 的 一 个 方 法afterPropertiesSet(),这个方法会在 RabbitAdmin 的属性值设置完的时候被调用。在 afterPropertiesSet ()方法中,调用了一个 initialize()方法。这里面创建了三个Collection,用来盛放交换机、队列、绑定关系。最后依次声明返回类型为 Exchange、Queue 和 Binding 这些 Bean,底层还是调用了 Channel 的 declare 的方法。

Message:

  Message 是 Spring AMQP 对消息的封装。两个重要的属性:

  • body:消息内容。
  • messageProperties:消息属性。

RabbitTemplate 消息模板:

  RabbitTemplate 是 AmqpTemplate 的一个实现(目前为止也是唯一的实现),用来简化消息的收发,支持消息的确认(Confirm)与返回(Return)。跟 JDBCTemplate一 样 , 它 封 装 了 创 建 连 接 、 创 建 消 息 信 道 、 收 发 消 息 、 消 息 格 式 转 换(ConvertAndSend→Message)、关闭信道、关闭连接等等操作。针对于多个服务器连接,可以定义多个 Template。可以注入到任何需要收发消息的地方使用。

Messager Listener 消息 侦听:

  MessageListener 是 Spring AMQP 异步消息投递的监听器接口,它只有一个方法onMessage,用于处理消息队列推送来的消息,作用类似于 Java API 中的 Consumer。

MessageListenerContainer:

  MessageListenerContainer可以理解为MessageListener的容器,一个Container只有一个 Listener,但是可以生成多个线程使用相同的 MessageListener 同时消费消息。Container 可以管理 Listener 的生命周期,可以用于对于消费者进行配置。例如:动态添加移除队列、对消费者进行设置,例如 ConsumerTag、Arguments、并发、消费者数量、消息确认模式等等。

转换器 MessageConvertor:

  MessageConvertor 的 作用?RabbitMQ 的消息在网络传输中需要转换成 byte[](字节数组)进行发送,消费者需要对字节数组进行解析。在 Spring AMQP 中,消息会被封装为 org.springframework.amqp.core.Message对象。消息的序列化和反序列化,就是处理 Message 的消息体 body 对象。如果消息已经是 byte[]格式,就不需要转换。如果是 String,会转换成 byte[]。如果是 Java 对象,会使用 JDK 序列化将对象转换为 byte[](体积大,效率差)。在 调 用 RabbitTemplate 的 convertAndSend() 方 法 发 送 消 息 时 , 会 使 用MessageConvertor 进行消息的序列化,默认使用 SimpleMessageConverter。在某些情况下,我们需要选择其他的高效的序列化工具。如果我们不想在每次发送消息时自己处理消息,就可以直接定义一个 MessageConvertor。如何 自定义 MessageConverter ?例如:我们要使用 Gson 格式化消息:创建一个类,实现 MessageConverter 接口,重写 toMessage()和 fromMessage()方法。

1.在导入Spring 的相关依赖之外,导入 RabbitMQ的依赖:

<!--rabbitmq依赖 -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>

2. applicationContext.xml :

<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <import resource="classpath*:rabbitMQ.xml" /> <!-- 扫描指定package下所有带有如 @Controller,@Service,@Resource 并把所注释的注册为Spring Beans -->
<context:component-scan base-package="com.wuzz.*" /> <!-- 激活annotation功能 -->
<context:annotation-config /> <!-- 激活annotation功能 -->
<context:spring-configured />
</beans>

3.配置rabbitMQ.xml:

<?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:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd"> <!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory" virtual-host="/" username="guest" password="guest" host="127.0.0.1" port="5672" /> <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin id="connectAdmin" connection-factory="connectionFactory" /> <!--######分隔线######-->
<!--定义queue -->
<rabbit:queue name="MY_FIRST_QUEUE" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!--定义direct exchange,绑定MY_FIRST_QUEUE -->
<rabbit:direct-exchange name="MY_DIRECT_EXCHANGE" durable="true" auto-delete="false" declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="MY_FIRST_QUEUE" key="FirstKey">
</rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange> <!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="MY_DIRECT_EXCHANGE" /> <!--消息接收者 -->
<bean id="messageReceiver" class="com.gupaoedu.consumer.FirstConsumer"></bean> <!--queue listener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="MY_FIRST_QUEUE" ref="messageReceiver" />
</rabbit:listener-container> <!--定义queue -->
<rabbit:queue name="MY_SECOND_QUEUE" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!-- 将已经定义的Exchange绑定到MY_SECOND_QUEUE,注意关键词是key -->
<rabbit:direct-exchange name="MY_DIRECT_EXCHANGE" durable="true" auto-delete="false" declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="MY_SECOND_QUEUE" key="SecondKey"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange> <!-- 消息接收者 -->
<bean id="receiverSecond" class="com.gupaoedu.consumer.SecondConsumer"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="MY_SECOND_QUEUE" ref="receiverSecond" />
</rabbit:listener-container> <!--######分隔线######-->
<!--定义queue -->
<rabbit:queue name="MY_THIRD_QUEUE" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!-- 定义topic exchange,绑定MY_THIRD_QUEUE,注意关键词是pattern -->
<rabbit:topic-exchange name="MY_TOPIC_EXCHANGE" durable="true" auto-delete="false" declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="MY_THIRD_QUEUE" pattern="#.Third.#"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange> <!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate2" connection-factory="connectionFactory" exchange="MY_TOPIC_EXCHANGE" /> <!-- 消息接收者 -->
<bean id="receiverThird" class="com.gupaoedu.consumer.ThirdConsumer"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="MY_THIRD_QUEUE" ref="receiverThird" />
</rabbit:listener-container> <!--######分隔线######-->
<!--定义queue -->
<rabbit:queue name="MY_FOURTH_QUEUE" durable="true" auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!-- 定义fanout exchange,绑定MY_FIRST_QUEUE 和 MY_FOURTH_QUEUE -->
<rabbit:fanout-exchange name="MY_FANOUT_EXCHANGE" auto-delete="false" durable="true" declared-by="connectAdmin" >
<rabbit:bindings>
<rabbit:binding queue="MY_FIRST_QUEUE"></rabbit:binding>
<rabbit:binding queue="MY_FOURTH_QUEUE"></rabbit:binding>
</rabbit:bindings>
</rabbit:fanout-exchange> <!-- 消息接收者 -->
<bean id="receiverFourth" class="com.gupaoedu.consumer.FourthConsumer"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener queues="MY_FOURTH_QUEUE" ref="receiverFourth" />
</rabbit:listener-container>
</beans>

4.生产者:

@Service
public class MessageProducer {
private Logger logger = LoggerFactory.getLogger(MessageProducer.class); @Autowired
@Qualifier("amqpTemplate")
private AmqpTemplate amqpTemplate; @Autowired
@Qualifier("amqpTemplate2")
private AmqpTemplate amqpTemplate2; /**
* 演示三种交换机的使用
*
* @param message
*/
public void sendMessage(Object message) {
logger.info("Send message:" + message); // amqpTemplate 默认交换机 MY_DIRECT_EXCHANGE
// amqpTemplate2 默认交换机 MY_TOPIC_EXCHANGE // Exchange 为 direct 模式,直接指定routingKey
amqpTemplate.convertAndSend("FirstKey", "[Direct,FirstKey] "+message);
amqpTemplate.convertAndSend("SecondKey", "[Direct,SecondKey] "+message); // Exchange模式为topic,通过topic匹配关心该主题的队列
amqpTemplate2.convertAndSend("msg.Third.send","[Topic,msg.Third.send] "+message); // 广播消息,与Exchange绑定的所有队列都会收到消息,routingKey为空
amqpTemplate2.convertAndSend("MY_FANOUT_EXCHANGE",null,"[Fanout] "+message);
}
}

5.消费者,需要实现 MessageListener 接口:

public class FirstConsumer implements MessageListener {
private Logger logger = LoggerFactory.getLogger(FirstConsumer.class); public void onMessage(Message message) {
logger.info("The first consumer received message : " + message.getBody());
}
}

SpringBoot 集成 RabbitMQ:

  基于下面这个结构图去集成:

  消费者的配置:

1.构建Springboot项目导入依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.Rabbit配置类,生成交换机,队列,以及匹配规则:

@Configuration
public class RabbitConfig { //1.定义三个交换机
@Bean
public DirectExchange directExchange(){
return new DirectExchange("DIRECT_EXCHANGE");
} @Bean
public TopicExchange topicExchange(){ return new TopicExchange("TOPIC_EXCHANGE");
} @Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("FANOUT_EXCHANGE");
}
//2.定义四个队列
@Bean
public Queue firstQueue(){
return new Queue("FIRST_QUEUE");
} @Bean
public Queue secondQueue(){
return new Queue("SECOND_DQUEUE");
} @Bean
public Queue thirdQueue(){
return new Queue("THIRD_DQUEUE");
} @Bean
public Queue fourthQueue(){
return new Queue("FOURTH_DQUEUE");
}
//3.定义四个绑定关系
@Bean
public Binding bindFirst(@Qualifier("firstQueue") Queue queue,
@Qualifier("directExchange") DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("wuzz.test");
} @Bean
public Binding bindSecond(@Qualifier("secondQueue") Queue queue,
@Qualifier("topicExchange") TopicExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("*.wuzz.*");
} @Bean
public Binding bindThird(@Qualifier("thirdQueue") Queue queue,
@Qualifier("fanoutExchange") FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
} @Bean
public Binding bindFourth(@Qualifier("fourthQueue") Queue queue,
@Qualifier("fanoutExchange") FanoutExchange exchange){
return BindingBuilder.bind(queue).to(exchange);
}
}

3.定义4个消费者:

@Configuration
@RabbitListener(queues = "FIRST_QUEUE")
public class FirstConsumer { @RabbitHandler
public void process(String msg){
System.out.println("First Queue received msg : " + msg);
}
}
@Configuration
@RabbitListener(queues = "SECOND_DQUEUE")
public class SecondConsumer { @RabbitHandler
public void process(String msg){
System.out.println("second Queue received msg : " + msg);
}
}
@Configuration
@RabbitListener(queues = "THIRD_DQUEUE")
public class ThirdConsumer { @RabbitHandler
public void process(String msg){
System.out.println("third Queue received msg : " + msg);
}
}
@Configuration
@RabbitListener(queues = "FOURTH_DQUEUE")
public class FourthConsumer { @RabbitHandler
public void process(String msg){
System.out.println("fourth Queue received msg : " + msg);
}
}

4.配置application.properties,定义链接地址等信息:

spring.application.name=spirng-boot-rabbitmq-consumer
spring.rabbitmq.host=192.168.254.137
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

  启动消费者,可以通过管理页面看到有4个链接通道及交换机队列信息。

  生产者:

1.构建SpringBoot项目导入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.通过 RabbitTemplate 构建自己的生产者类,发送4条消息:

@Component
public class MyProducer { @Autowired
private RabbitTemplate rabbitTemplate; public void send(){
rabbitTemplate.convertAndSend("DIRECT_EXCHANGE","wuzz.test","DIRECT_EXCHANGE message");
rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","hangzhou.wuzz.test","TOPIC_EXCHANGE hangzhou message");
rabbitTemplate.convertAndSend("TOPIC_EXCHANGE","wenzhou.wuzz.test","TOPIC_EXCHANGE wenzhou message");
rabbitTemplate.convertAndSend("FANOUT_EXCHANGE","","FANOUT_EXCHANGE message"); }
}

3.编写测试类测试,并且启动:

@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest { @Autowired
private MyProducer myProducer; @Test
public void send(){
myProducer.send();
}
}

  同样需要配置application.properties,顺利的话消费者方会收到消息如下,这样就集成完了:

RabbitMQ的Java API编程的更多相关文章

  1. 利用SparkLauncher 类以JAVA API 编程的方式提交Spark job

    一.环境说明和使用软件的版本说明: hadoop-version:hadoop-2.9.0.tar.gz spark-version:spark-2.2.0-bin-hadoop2.7.tgz jav ...

  2. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

  3. 使用JAVA API编程实现简易Habse操作

    使用JAVA API编程实现下面内容: 1.创建<王者荣耀>游戏玩家信息表gamer,包含列族personalInfo(个人信息).recordInfo(战绩信息).assetsInfo( ...

  4. 9. 使用ZooKeeper Java API编程

    ZooKeeper是用Java开发的,3.4.6版本的Java API文档可以在http://zookeeper.apache.org/doc/r3.4.6/api/index.html上找到. Ti ...

  5. HBase环境搭建、shell操作及Java API编程

    一. 1.掌握Hbase在Hadoop集群体系结构中发挥的作用和使过程. 2.掌握安装和配置HBase基本方法. 3.掌握HBase shell的常用命令. 4.使用HBase shell命令进行表的 ...

  6. MyBatis(七):mybatis Java API编程实现增、删、改、查的用法

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  7. MyBatis(六):Mybatis Java API编程实现一对多、一对一

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  8. Hbase/Hadoop Java API编程常用语句

    从scanner获取rowkey: for(Result rr : scanner){ String key =Bytes.toString(rr.getRow())} HBase API - Res ...

  9. 与HDFS交互- By java API编程

    环境(ubuntu下) jdk eclipse jar(很烦,整了很久才清楚) - 导包方法 查看:https://www.cnblogs.com/floakss/p/9739030.html ()” ...

随机推荐

  1. oracle--数据筛选

    一:当统一社会信用代码或者工商注册号两个字段中,有的时候只有一个字段含有数据,但是所取的值必须要拥有字段,这个时候,语句为下: select t.entname, case when t.unisci ...

  2. map遍历性能记录

    map遍历可以通过keySet或者entrySet方式. 性能上:entrySet略胜一筹,原因是keySet获取到key后再根据key去获取value,在查一遍,所以慢一些. keySet: //先 ...

  3. mysql 基本语句

    求知若渴 虚心若愚   博客园 首页 新随笔 联系 管理 随笔-391  文章-0  评论-7  mysql sql常用语句大全   SQL执行一次INSERT INTO查询,插入多行记录 inser ...

  4. Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核

    软件版本: Modelsim10.4SE ISE14.7 仿真IP:时钟管理IP(clock wizard)   流程: 1.对于Modelsim10.4SE,并不自带Xilinx家的仿真库,因此首先 ...

  5. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  6. P1494 [国家集训队]小Z的袜子

    题目 P1494 [国家集训队]小Z的袜子 解析 在区间\([l,r]\)内, 任选两只袜子,有 \[r-l+1\choose2\] \[=\frac{(r-l+1)!}{2!(r-l-1)!}\] ...

  7. npm后台启动nuxt服务之 kill

    后台启动 npm run start & ps aux | grep start 根据项目对应的id执行如下命令 kill xxxx

  8. eMMC真能优化成UFS?谈谈手机闪存的文件系统

    和UFS闪存相比,eMMC的性能更弱,同一型号的手机混用这两种规格的闪存,让一些消费者感到了不满.对此,厂商称通过优化,eMMC的产品也可以获得优秀的体验.这个优化到底是怎么回事?根据以往的一些宣传, ...

  9. openstack项目【day24】:VLAN模式

    本节内容 一 二层基础知识 1.1 vlan介绍 1.1.1:vlan的含义 1.1.2:vlan的类型 1.1.3:vlan的不足 1.2 : 二层交换的基础知识 1.2.1:二层交换机最基本的功能 ...

  10. java集合分割

    java集合分割成等份的小集合: private <T> List<List<T>> getSubList(List list,int len) { if(list ...