2.RabbitMQ运行流程

2019-08-06  本文已影响0人  JiangCheng97

文章参考:Rabbit实战指南

交换机的类型

RabbitMQ运转流程

连接RabbitMQ

下面代码用来在给定的参数(IP地址、端口号、用户名、密码等)下连接RabbitMQ:
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(USERNAME);
factory.setPassword(PASSWORD);
factory.setVirtualHost(virtualHost);
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
Connection conn = factory.newConnection();

也可以选择使用URI的方式来实现,
ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://userName:password@ipAddress:portNumber/virtualHost");
Connection conn = factory.newConnection();
创建之后,Channel可以用来发送或者接收消息了。
Channel channel = conn.createChannel();

Channel或者Connection中有个isOpen方法可以用来检测其是否处于开启状态,不推荐在生产环境上使用isOpen方法,这个方法的返回值依赖于shutdownCause的存在,有可能会产生竞争。

isOpen方法的源码
public boolean isOpen(){
    synchronized(this.monitor){
        return this.shutdownCause == null;
    }
}
错误的使用isOpen方法
public void brokenMethod(Channel channel){
    if(channel.isOpen()){
        //The following code depends on the channel being in open state.
        //However there is a possibility of the change in the channel state
        //between isOpen() and basicQos(1) call
        ...
        channel.baseicQos(1);
    }
}

通常情况下,在调用createXXX或者newXXX方法之后,我们可以简单地认为Connection或者Channel已经成功地处于开启状态,而并不会在代码中使用isOpen这个检测方法。如果在使用Channel的时候其已经处于关闭状态,那么程序会抛出个 com. rabbitmq. client. ShutdownSignalException,我们只需捕获这个异常即可。当然同时也要试着捕获I0Exception 或者SocketException, 以防Connection意外关闭。示例代码如下:

public void validMethod(Channel channel){
    try{
        ...
        channel.basicQos(1);
    } catch (ShutdownSignalException sse){
        //possibly check if channel was closed 
        //by the time we started action and reasons for 
        //closing it
        ...
    } catch (IOException ioe) {
        // check why connection was closed
        ...
    }
}
上一篇 下一篇

猜你喜欢

热点阅读