连接RabbitMQ
方式1:使用指定的参数
ConnectionFactory factory=new ConnectionFactory();
factory.setUsername(this.userName);
factory.setPassword(this.password);
factory.setVirtualHost(this.vhost);
factory.setHost(this.ip);
factory.setPort(this.port);
Connection connection=factory.newConnection();
Channel channel=conn.createChannel();
方式2:使用URI
factory.setUri(String.format("amqp://%s:%s@%s:%s/%s",this.userName,this.password,this.ip,this.port,this.vhost));
Connection conn=factory.newConnection();
Channel channel=conn.createChannel();
Connection可以创建多个Channel实例,但是这些实例不能在线程中共享,实战中每一个线程都开启一个单独的Channel。
交换器、队列的使用
交换器
exchangeDeclare定义交换器
完整的定义如下:
Exchange.DeclareOk exchangeDeclare(String exchange ,String type, boolean durable,boolean autoDelete , boolean internal ,Map<String,Object> arguments)
throws IOException ;
- exchange:交换器的名称
- type:交换器类型(fanout、direct、topic等),可使用枚举BuiltinExchangeType
- durable:是否持久化。true表示把交换器持久化,服务器重启时不会丢失
- autoDelete:是否自动删除。true表示当与该交换器绑定的队列都解绑后,RabbitMQ自动删除该交换器
- inernal:是否内置。true表示内置,客户端无法发消息到该交换器,只能通过其他交换器到该交换器
- argument:其他参数
exchangeDelete删除交换器
// 通过交换器名称删除该交换器
Exchange . DeleteOk exchangeDelete(String exchange, boo1ean ifUnused)
throws IOException;
- exchange:交换器名称
- ifUnused:true表示该交换器没有被使用的情况下才允许被删除,否则强制删除
队列
queueDeclare 定义队列
Queue.DeclareOk queueDeclare (String queue, boolean durable, boolean exclusive,boolean autoDelete, Map<String,Object> arguments)
throws IOException;
- queue:队列名称
- durable:是否持久化。true表示队列会持久化,服务器重启时不会丢失
- exclusive:是否排他。true表示首次声明队列的Connection(该连接下的多个信道都可以)可以访问该队列,并且其他Connection不能再创建同名排他队列,另外,无论是否持久化,客户端断开后都会被删除。
- autoDelete:是否自动删除。参照 exchangeDeclare中的介绍
- arguments:其他参数
queueDelete删除队列
Queue.De1eteOk queueDelete(String queue, boo1ean ifUnused, boolean ifEmpty )
throws IOException;
- queue:队列名称
- ifUnused:true表示只有该队列没有被使用的情况下才允许删除,否则强制删除
- ifEmpty:true表示队列为空才允许删除,否则强制删除
queuepurge清空队列
Queue.PurgeOk queuePurge(String queue ) throws IOException;
queueBind交换器和队列绑定
Queue.BindOk queueBind(String queue , String exchange , String routingKey,Map<String, Object> arguments)
throws IOException;
- queue:队列名称
- exchange:交换器名称
- routingKey:用来绑定队列和交换器的路由键
- arguments:其他参数
exchangeBind交换器和交换器绑定
Exchange.BindOk exchangeBind(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException ;
因为rabbitmq的消息存储在队列中,所以交换器等几乎不占用资源,考虑队列占用资源就可以。 虽然按照官网建议消费者和生产者都应该尝试创建队列,但建议在使用前,根据业务实际情况,提前预置队列,规划好资源。