package demo.java.web.amqp.rabbitmq.demo2; import java.io.IOException; import java.net.URISyntaxException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.concurrent.TimeoutException; import org.junit.Test; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * 连接RabbitMQ * * @author jiangkd * @date 2020/10/12 */ public class ConnectRabbitMQDemo { final private String IP_ADDRESS = "127.0.0.1"; final private int PORT = 5672; final private String USERNAME = "root"; final private String PASSWORD = "root123"; final private String VIRTUALHOST = ""; // 每个VirtualHost相当月一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的 /** * 在给定的参数(IP地址, 端口, 用户名, 密码等)下连接rabbitmq * * @throws TimeoutException * @throws IOException */ @Test public void connect1() throws IOException, TimeoutException { // ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(IP_ADDRESS); connectionFactory.setPort(PORT); // connectionFactory.setVirtualHost(VIRTUALHOST); connectionFactory.setUsername(USERNAME); connectionFactory.setPassword(PASSWORD); // Connection connectioin = connectionFactory.newConnection(); // 创建信道 Channel channel = connectioin.createChannel(); } /** * 也可以选择使用URI的方式来实现 * * @throws URISyntaxException * @throws NoSuchAlgorithmException * @throws KeyManagementException * @throws TimeoutException * @throws IOException */ @Test public void connect2() throws KeyManagementException, NoSuchAlgorithmException, URISyntaxException, IOException, TimeoutException { // ConnectionFactory connectionFactory = new ConnectionFactory(); // amqp://username:password@host:port/virtualHost connectionFactory.setUri("amqp://root:root123@127.0.0.1:5672/"); // Connection connectioin = connectionFactory.newConnection(); // 创建信道 Channel channel = connectioin.createChannel(); } }
注意要点:Connection 可以用来创建多个Channel 实例, 但是Channel 实例不能在线程问共享, 应用程序应该为每一个线程开辟一个Channel
Channel和Connection中有个isOpen方法可以用来检测其是否已处于开启状态, 但是不推荐在生产环境中使用此方法. 通常在调用createXXX或newXXX方法之后, 我们可以简单的认为Connection或Channel已经处于开启状态, 而不会使用isOpen方法, 如果在使用Channel的时候其处于关闭状态, 那么程序会抛出一个com.rabbitmq.client.ShutdownSignalException, 我们只需要捕获这个异常即可, 当然同时也要试着捕获IOException或者SocketException, 以防Connection意外关闭。
代码中连接RabbitMQ的时候还可以设置virtualHost, 那么virtualHost是什么呢?
RabbitMq的VirtualHost(虚拟消息服务器),每个VirtualHost相当于一个相对独立的RabbitMQ服务器;每个VirtualHost之间是相互隔离的,exchange、queue、message不能互通。
拿数据库(用MySQL)来类比:RabbitMq相当于MySQL,RabbitMq中的VirtualHost就相当于MySQL中的一个库。
Virtual Name一般以/开头
如上图在创建完vhost后可以在All Virtual Host标签看到新建的VirtualHost。
默认的virtualHost是[/], 和其他virtual host 是平级对等关系;