rabbitmq六种工作模式

1.简略模式

RabbitMQ是一个消息中间件,你能够设想它是一个邮局。当你把函件放到邮箱里时,可能确信邮递员会正确地递送你的函件。RabbitMq就是一个邮箱、一个邮局和一个邮递员。

  • 发送音讯的程序是生产者
  • 队列就代表一个邮箱。尽管音讯会流经RbbitMQ和你的应用程序,但音讯只能被存储在队列里。队列存储空间只受服务器内存和磁盘限度,它实质上是一个大的音讯缓冲区。多个生产者能够向同一个队列发送音讯,多个消费者也能够从同一个队列接管音讯.
  • 消费者期待从队列接管音讯

1.pom.xml
增加 slf4j 依赖, 和 rabbitmq依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.tedu</groupId>    <artifactId>rabbitmq</artifactId>    <version>0.0.1-SNAPSHOT</version>    <dependencies>        <dependency>            <groupId>com.rabbitmq</groupId>            <artifactId>amqp-client</artifactId>            <version>5.4.3</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.8.0-alpha2</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.8.0-alpha2</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <version>3.8.0</version>                <configuration>                    <source>1.8</source>                    <target>1.8</target>                </configuration>            </plugin>        </plugins>    </build></project>

2.生产者发送音讯

public class Test1 {    public static void main(String[] args) throws Exception {        //创立连贯工厂,并设置连贯信息        ConnectionFactory f = new ConnectionFactory();        f.setHost("192.168.64.140");        f.setPort(5672);//可选,5672是默认端口        f.setUsername("admin");        f.setPassword("admin");        /*         * 与rabbitmq服务器建设连贯,         * rabbitmq服务器端应用的是nio,会复用tcp连贯,         * 并开拓多个信道与客户端通信         * 以加重服务器端建设连贯的开销         */        Connection c = f.newConnection();        //建设信道        Channel ch = c.createChannel();        /*         * 申明队列,会在rabbitmq中创立一个队列         * 如果曾经创立过该队列,就不能再应用其余参数来创立         *          * 参数含意:         *   -queue: 队列名称         *   -durable: 队列长久化,true示意RabbitMQ重启后队列仍存在         *   -exclusive: 排他,true示意限度仅以后连贯可用         *   -autoDelete: 当最初一个消费者断开后,是否删除队列         *   -arguments: 其余参数         */        ch.queueDeclare("helloworld", false,false,false,null);        /*         * 公布音讯         * 这里把音讯向默认交换机发送.         * 默认交换机隐含与所有队列绑定,routing key即为队列名称         *          * 参数含意:         *     -exchange: 交换机名称,空串示意默认交换机"(AMQP default)",不能用 null          *     -routingKey: 对于默认交换机,路由键就是指标队列名称         *     -props: 其余参数,例如头信息         *     -body: 音讯内容byte[]数组         */        ch.basicPublish("", "helloworld", null, "Hello world!".getBytes());        System.out.println("音讯已发送");        c.close();    }}

3.消费者接管队列

public class Test2 {    public static void main(String[] args) throws Exception {        //连贯工厂        ConnectionFactory f = new ConnectionFactory();        f.setHost("192.168.64.140");        f.setUsername("admin");        f.setPassword("admin");        //建设连贯        Connection c = f.newConnection();        //建设信道        Channel ch = c.createChannel();        //申明队列,如果该队列曾经创立过,则不会反复创立        ch.queueDeclare("helloworld",false,false,false,null);        System.out.println("期待接收数据");                //收到音讯后用来解决音讯的回调对象        DeliverCallback callback = new DeliverCallback() {            @Override            public void handle(String consumerTag, Delivery message) throws IOException {                String msg = new String(message.getBody(), "UTF-8");                System.out.println("收到: "+msg);            }        };                //消费者勾销时的回调对象        CancelCallback cancel = new CancelCallback() {            @Override            public void handle(String consumerTag) throws IOException {            }        };                ch.basicConsume("helloworld", true, callback, cancel);    }}