RabbitMQ client 的使用
连接 RabbitMQ
private static Channel _getChannelBySetter() throws IOException, TimeoutException {
ConnectionFactory factory = _getConnectionFactoryBySetter();
Connection connection = factory.newConnection();
// channel 不建议线程共享, 多线程使用 Channel 可能造成错误的通信帧交错, 也会影响发送方确认的机制
return channel = connection.createChannel(); // 可能返回 null
// Optional<Channel> optionalChannel = connection.openChannel(); // optional 封装 createChannel 的结果
}
private static Channel _getChannelByUri() throws IOException, TimeoutException, NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
ConnectionFactory factory = _getConnectionFactoryByUri();
Connection connection = factory.newConnection();
return connection.createChannel();
}
private static ConnectionFactory _getConnectionFactoryBySetter() {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("root");
factory.setPassword("root");
factory.setHost("localhost");
factory.setPort(5672);
factory.setVirtualHost("/");
return factory;
}
private static ConnectionFactory _getConnectionFactoryByUri() throws NoSuchAlgorithmException, KeyManagementException, URISyntaxException {
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("root");
factory.setPassword("root");
factory.setHost("localhost");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUri("amqp://root:root@localhost:5672//");
return factory;
}
connection 或者channel 继承了 isOpen() 可以判断 connection 或 channel 是否正常建立,但是内部使用 Synchronized,,会造成线程竞争
而且依赖的是内部的一个状态值,随时可能被修改。
public boolean isOpen() {
synchronized(this.monitor) {
return this.shutdownCause == null;
}
}
不能依赖该方法的结果。 作后续处理。除非业务代码也使用锁。
比如像下面的代码&