(java)一个简单的原生的RabbitMQ的例子。

生产者(发送端):

package com.centerm.ivycloud.web.share.mqueue;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class MyFirstSender {
	
      private static final String message = "星辰大海,生命长河"; 
      private static String QUEUE_NAME = "hello";
      
      public static void main(String[] args){
    	  Channel channel = null;
    	  Connection conn = null;
    	  try {
			  //初始化连接
			  ConnectionFactory factory = new ConnectionFactory();
			  factory.setHost("localhost");
			  factory.setPort(5672);
			  factory.setUsername("guest");
			  factory.setPassword("guest");
			  factory.setConnectionTimeout(0);
			  //创建连接 
			  conn = factory.newConnection();
			  //创建通道
			  channel = conn.createChannel();
			  //声明队列
			  /**
			   * queue: "QUEUE_NAME",
                           * durable: true,
                           * exclusive: false,
                           * autoDelete: false,
                           * arguments: null
			   */
			  channel.queueDeclare(QUEUE_NAME, false, false, true, null);
			  //发送消息
			  for(int i=1;i<6;i++){
				  /**
				   * exchange: "",
                   * routingKey: "task_queue",
                   * basicProperties: properties,
                   * body: body
				   * 
				   */
				  channel.basicPublish("", QUEUE_NAME, null, (message+i).getBytes());  
			  }
			  System.out.println("我创建了一个队列,并发送一条消息");
		  } catch (Exception e) {
				e.printStackTrace();
		  } finally{
				try {
					if(channel != null){
						channel.close();
					}
					if(conn != null){
						conn.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
		  } 
      }
}


消费者(接收端):

import java.io.IOException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class MyFirstReceiver {
    
	public static String QUEUE_NAME = "hello";
	public static Channel channel = null;
	public static Connection conn = null;
	
	public static void main(String[] args){
	  try {
		  //初始化连接
		  ConnectionFactory factory = new ConnectionFactory();
		  factory.setHost("localhost");
		  factory.setPort(5672);
		  factory.setUsername("guest");
		  factory.setPassword("guest");
		  //创建连接 
		  conn = factory.newConnection();
		  //创建通道
		  channel = conn.createChannel();
		  //声明队列
		  channel.queueDeclare(QUEUE_NAME, false, false, true, null);
		  /**
            * 设置通道同时处理的最大的消息数量,此处设置为1,那么当该消费者有未完成的任务时,而且没有其他空闲消费者
            * 那么消息会堆积在队列中等待处理
            */
		  channel.basicQos(1);
		  //定义消费者
		  Consumer consumer = new DefaultConsumer(channel){
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
					byte[] body) throws IOException {
				String message = new String(body,"UTF-8");
				System.out.println(message);
				try {
					Thread.sleep(5000);
					//System.out.println(1/0);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}finally{
					/**
					 * 返回任务执行结果给rabbitMQ服务器,
					 * 若任务已经处理完,则返回结果,若中途失败,则无结果返回,服务器根据有无结果是否删掉消息。
					 * 
					 */
					channel.basicAck(envelope.getDeliveryTag(), false);
				}
				
			}
		  };
		    /**
	         * 设置自动确认为false时,rabbitmq不会自动确认消息的消费
	         * (在发送方未收到消费者确认之前不会删除队列中的消息)
	         * 以此来保证消息不丢失,即使消费者被杀死或断开连接
	         * 启动两个worker,发送一个耗时5秒的任务,在任务执行期间断开正在执行任务的消费者连接
	         * 会发现正在处理的消息被转发给另一个空闲的消费者处理了
	         */
	      boolean autoAck = false;
		  channel.basicConsume(QUEUE_NAME, autoAck, consumer);
		  System.out.println("我是第一个接受者");
		  
		} catch (Exception e) {
			e.printStackTrace();
		}
	     
     }
}
简单的使用无名的交换机,发送消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值