在上图的模型中,有以下概念:
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接受者,会一直等待消息到来。
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
1.1 生产者生产消息[Java] 纯文本查看 复制代码
public class Producer1 {
//队列名称
private static final String QUEUE="helloWord";
public static void main(String[] args) throws IOException,TimeoutException {
Connection connection=null;
Channel channel=null;
try {
//创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
//rabbitmq服务所在ip
connectionFactory.setHost("192.168.56.130");
//rabbitmq的连接端口
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");//账户名
connectionFactory.setPassword("guest");//密码
//当前账户绑定的虚拟主机
connectionFactory.setVirtualHost("/");
//获取连接
connection = connectionFactory.newConnection();
//创建与交换机的通道,可以创建多个,每一个通道代表一个会话任务
channel = connection.createChannel();
//绑定队列
channel.queueDeclare(QUEUE,true,false,false,null);
String message="hello: "+System.currentTimeMillis();
//发送消息
channel.basicPublish("",QUEUE,null,message.getBytes());
System.out.println("send+++++++++++++++++");
} catch (Exception e) {
e.printStackTrace();
} finally {
channel.close();
connection.close();
}
}
}
1.1.1 绑定队列(queueDeclare)方法参数详解:声明队列:
channel.queueDeclare(QUEUE,true,false,false,null);
param1(queue):
队列名称
param2(durable):
是否持久化,如果持久化,mq重启后队列还在
param3(exclusive):
是否独占连接,队列只允许在该连接中访问,如果connection连接关闭队列则自动删除,如果将此参数设置true可用于临时队列的创建
param4(autoDelete):
队列不在使用的时候是否自动删除此队列,如果将此参数和exclusive参数设置为true就可以实现临时队列(队列不用了就自动删除)
param5(arguments):
队列参数,可以设置一个队列的扩展参数,比如:可设置存活时间
1.1.2 发送消息(basicPublish)方法参数详解:发送消息:
channel.basicPublish("",QUEUE,null,message.getBytes());
param1:
Exchange(交换机)的名称,如果没有指定使用默认的,default exchange交换机
param2:
routingkey,消息的路由key, 交换机根据路由绑定的队列,发送消息
param3: 消息包含的属性
param4: 消息体
如果不指定交换机,消息会发送给默认交换机,队列也会绑定默认交换机,但是不能显示绑定或者解除绑定。如果使用默认交换机,routingkey等于队列名称。
1.1.1 运行生产者控制台结果: