【RabbitMQ 実戦】02 生産者と消費者の例

前のセクションでは、docker を使用して RabbitMQ をデプロイしましたが、このセクションでは、プロデューサー コードとコンシューマー コードを作成します。RabbitMQ のネイティブ API は、メッセージの作成と送信に使用されます。

1. 準備作業

開始する前に、まず RabbitMQ コンソールで関連データを作成します。
ローカルの RabbitMQ デプロイメント マシンは 192.168.56.201 です。
コンソールのアドレスは
http://192.168.56.201:15672/です
。コンソール アカウントを入力した後、次のように入力できます。
1、最初にユーザーを作成します ユーザー
名: hello、パスワード: world
ここに画像の説明を挿入します
2. 次に、仮想ホスト: virtual01 を作成します
ここに画像の説明を挿入します
3. ユーザーの仮想ホストへのアクセス権限を設定します
ここに画像の説明を挿入します
設定後、hello ユーザーには virtual01 の権限が付与されます
ここに画像の説明を挿入します

2. コード

まず依存関係を導入しますが、後で springboot を使用してプロデューサーとコンシューマのコードを記述するため、ここでは springboot パッケージを直接導入します。ネイティブ クライアントのみを使用したい場合は、ネイティブ パッケージをインポートできます。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

プロデューサとコンシューマのコードは次のとおりです。

public class RabbitMqSimpleTest {
    
    
    private static final String EXCHANGE_NAME = "hello_exchange";
    private static final String QUEUE_NAME = "hello_queue";

    private static final String ROUTING_KEY = "hello_routing";

    @Test
    public void send() throws IOException, TimeoutException {
    
    

        ConnectionFactory connectionFactory = new ConnectionFactory();

        connectionFactory.setHost("192.168.56.201");
        connectionFactory.setPort(5672);//5672是RabbitMQ的默认端口号
        connectionFactory.setUsername("hello");
        connectionFactory.setPassword("world");
        connectionFactory.setVirtualHost("virtual01");

        //获取TCP长连接
        Connection conn = connectionFactory.newConnection();
        //创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();

        //创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列
        //第一个参数:队列名称ID
        //第二个参数:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失
        //第三个参数:是否队列私有化,false则代表所有消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用,其他消费者不让访问
        //第四个:是否自动删除,false代表连接停掉后不自动删除掉这个队列
        //其他额外的参数, null
        //手动创建一个队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
        //exchange 交换机
        //队列名称
        //额外的设置属性
        //最后一个参数是要传递的消息字节数组
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, (System.currentTimeMillis() + ",hello this is my first message!").getBytes());
        channel.close();
        conn.close();
        System.out.println("===发送成功===");
    }

    @Test
    public void consumer() throws IOException, TimeoutException {
    
    
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.56.201");
        connectionFactory.setPort(5672);//5672是RabbitMQ的默认端口号
        connectionFactory.setUsername("hello");
        connectionFactory.setPassword("world");
        connectionFactory.setVirtualHost("virtual01");

        //获取TCP长连接
        Connection conn = connectionFactory.newConnection();
        //创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();

        //创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        //从MQ服务器中获取数据
        //创建一个消息消费者
        //第一个参数:队列名
        //第二个参数代表是否自动确认收到消息,false代表手动编程来确认消息,这是MQ的推荐做法
        //第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume(QUEUE_NAME, false, new Receiver(channel));
    }
}

コンシューマコールバックの実装

public class Receiver extends DefaultConsumer {
    
    

    private Channel channel;
    //重写构造函数,Channel通道对象需要从外层传入,在handleDelivery中要用到
    public Receiver(Channel channel) {
    
    
        super(channel);
        this.channel = channel;
    }


    @Override
    public void handleDelivery(String consumerTag,
                               Envelope envelope,
                               AMQP.BasicProperties properties,
                               byte[] body)
            throws IOException
    {
    
    
        String message = new String(body);
        System.out.println("消费者接收到的消息:"+message);

        System.out.println("消息的TagId:"+envelope.getDeliveryTag());
        //false只确认签收当前的消息,设置为true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(), false);
    }
}

send を実行してメッセージを送信すると、成功します。
コンソールの背景に移動して見てください。
キューは正常に作成されました
。メッセージは正常に送信されました。キューには消費されるメッセージがあります。
ここに画像の説明を挿入します
ここで送信されたメッセージの内容を確認できます。
ここに画像の説明を挿入します
ここで次のことができます。キューとエクスチェンジの間のバインディング関係を参照してください。
ここに画像の説明を挿入します
コンソールには興味深い機能がたくさんあるので、実際に試してみることもできます。
同時に消費者を活性化し、消費を成功させることができます。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/suyuaidan/article/details/133171528