maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.3</version>
</dependency>
生产者
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* Create By zhk on 2019-12-24
*/
public class Producer01 {
private static final String QUENE = "helloworld";
public static void main(String[] args) {
//通过连接工厂创建新的连接
ConnectionFactory connectionFactory = new ConnectionFactory();
//和mq建立连接
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("root");
connectionFactory.setPassword("root");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
connection = connectionFactory.newConnection();
//创建会话通道,生产者和mq所有通信都在channel通道中完成
channel = connection.createChannel();
//声明队列
/**
* 参数明细
* 1.队列名称
* 2.是否持久化,持久化mq重启后队列还在
* 3.是否排他 是否独占连接,队列只允许在该连接中访问 ,如果连接关闭队列自动删除,如果将参数设置为true
* 可用于临时队列的创建
* 4.自动删除,队列不在使用时是否自动删除此队列,如果和3同时为true,
* 可以实现临时队列(队列不用了就自动删除)
* 5.参数可以设置一个队列的扩展参数,比如存活时间
*/
channel.queueDeclare(QUENE,true,false,false,null);
//发送消息
/**
* 参数明细
* 1.exchange,交换机,如果不指定将使用磨人的交换机
* 2.路由key交换机根据路由key来将消息转发到指定队列,如果使用默认交换机,routingkey需要设置为队列名称
* 3.props 消息的属性
* 4.消息内容
*/
String message = "hello world";
channel.basicPublish("",QUENE,null,message.getBytes());
System.out.println("send to mq");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}finally {
//关闭连接
//先关通道
try {
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
}
消费者
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* Create By zhk on 2019-12-24
*/
public class Consumer01 {
private static final String QUENE = "helloworld";
public static void main(String[] args) {
//通过连接工厂创建新的连接
ConnectionFactory connectionFactory = new ConnectionFactory();
//和mq建立连接
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("root");
connectionFactory.setPassword("root");
connectionFactory.setVirtualHost("/");
Connection connection = null;
try {
connection = connectionFactory.newConnection();
//创建会话通道,生产者和mq所有通信都在channel通道中完成
Channel channel = connection.createChannel();
//声明队列
/**
* 参数明细
* 1.队列名称
* 2.是否持久化,持久化mq重启后队列还在
* 3.是否排他 是否独占连接,队列只允许在该连接中访问 ,如果连接关闭队列自动删除,如果将参数设置为true
* 可用于临时队列的创建
* 4.自动删除,队列不在使用时是否自动删除此队列,如果和3同时为true,
* 可以实现临时队列(队列不用了就自动删除)
* 5.参数可以设置一个队列的扩展参数,比如存活时间
*/
channel.queueDeclare(QUENE,true,false,false,null);
//实现消费方法
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
/**
*
* @param consumerTag 消费者标签 可在监听队列时设置,也可不填
* @param envelope 信封,通过envelope获取交换机,消息id
* @param properties 消息属性
* @param body 消息内容
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
//交换机
String exchange = envelope.getExchange();
//消息id
long deliverTag = envelope.getDeliveryTag();
String message = new String(body,"utf-8");
System.out.println("receive message"+message);
}
};
/**
* 队列名称
* 自动回复 消费者接收到消息后要告诉mq消息已接收,true自动回复mq,false通过编程实现
* 消费方法 接收到消息后要执行的方法
*/
channel.basicConsume(QUENE,true,defaultConsumer);
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}