Java使用RabbitMQ(二)--发送和接收信息

原创 2018年04月16日 16:07:20

发送和接收信息

发送方:

public class BaseTest2 {
    public static String queueName="q1";

    public static ConnectionFactory factory;
    public static Connection getConnection(String username,String password,String host,int port,String virtualhost) {
        if (factory==null){
            factory=getFactory(username,password,host,port,virtualhost);
        }
        try {
            return factory.newConnection();
        } catch (Exception e) {
            throw new RuntimeException("创建rabbit client 连接失败"+e);
        }
    }

    private synchronized static ConnectionFactory getFactory(String username, String password, String host, int port, String virtualhost) {
        if (factory!=null)
            return factory;
        ConnectionFactory factory=new ConnectionFactory();
        factory.setUsername(username);
        factory.setPassword(password);
        factory.setVirtualHost(virtualhost);
        factory.setHost(host);
        factory.setPort(port);

        return factory;
    }
    private static String getMessage(String[] strings){
        if (strings.length < 1)
            return "Hello World!";
        return joinStrings(strings, " ");
    }

    private static String joinStrings(String[] strings, String delimiter) {
        int length = strings.length;
        if (length == 0) return "";
        StringBuilder words = new StringBuilder(strings[0]);
        for (int i = 1; i < length; i++) {
            words.append(delimiter).append(strings[i]);
        }
        return words.toString();
    }
    private static void doWork(String task) throws InterruptedException {
        for (char ch: task.toCharArray()) {
            if (ch == '.') Thread.sleep(1000);
        }
    }
    public static void main(String[] args) {
        try(Connection connection=getConnection("guest","guest","localhost",5672,"/");
            Channel channel=connection.createChannel()) {

//            channel.exchangeDeclare("交流所1","direct",true);
             channel.queueDeclare(queueName,false,false,false,null);

            String message=getMessage(new String[]{"a","b","c"});
            channel.basicPublish("",queueName,null,message.getBytes("utf-8"));

//            Thread.sleep(2000);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException("连接超时"+e);
        }
    }
}

接收方:

public class BasicTest3 {
    public static void main(String[] args) {
        try(Connection connection=BaseTest2.getConnection("guest","guest","localhost",5672,"/");
            Channel channel=connection.createChannel()) {

//            channel.exchangeDeclare("交流所1","direct",true);
            channel.queueDeclare(BaseTest2.queueName,false,false,false,null);

            Consumer consumer=new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    try {
                        doWork(message);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        System.out.println(message+" [x] Done");
                    }
//                    channel.basicAck(envelope.getDeliveryTag(),false);
                }
            };
            channel.basicConsume(BaseTest2.queueName,false, consumer);
            Thread.sleep(2000);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
    private static String getMessage(String[] strings){
        if (strings.length < 1)
            return "Hello World!";
        return joinStrings(strings, " ");
    }

    private static String joinStrings(String[] strings, String delimiter) {
        int length = strings.length;
        if (length == 0) return "";
        StringBuilder words = new StringBuilder(strings[0]);
        for (int i = 1; i < length; i++) {
            words.append(delimiter).append(strings[i]);
        }
        return words.toString();
    }
    private static void doWork(String task) throws InterruptedException {
        for (char ch: task.toCharArray()) {
            if (ch == '.') Thread.sleep(1000);
        }
    }
}

在消费方,channel.basicConsume(BaseTest2.queueName,false, consumer);
false是指不自动确认(自动确认的话,rabbit中存的消息会被消费掉。)
为true时,会被自动消费,然后别人就收不到这条消息了。

修改下 生产者的代码:

 public static void main(String[] args) {
        try(Connection connection=getConnection("guest","guest","localhost",5672,"/");
            Channel channel=connection.createChannel()) {

//            channel.exchangeDeclare("交流所1","direct",true);
             channel.queueDeclare(queueName,false,false,false,null);
            String message=getMessage(new String[]{"a","b","c"});
            int i=0;
            while (true){
                Thread.sleep(1000);
                channel.basicPublish("",queueName,null,(i+++message).getBytes("utf-8"));
            }

//            Thread.sleep(2000);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException("连接超时"+e);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

生产者循环生产新的消息

然后开2个消费者,运行结果如下:

10a b c [x] Done
12a b c [x] Done
14a b c [x] Done
16a b c [x] Done
18a b c [x] Done

另一个消费者:

11a b c [x] Done
13a b c [x] Done
15a b c [x] Done
17a b c [x] Done

可以看出,是rabbit交替发送的。每个消费者获取的消息是平均的 ,这也叫循环。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljz2016/article/details/79961971

java调用rabbitmq消息队列发送和接收消息实例

消费者Consumer.java代码 package com.rabbitMQ.pro; import com.rabbitmq.client.ConnectionFactory; import c...
  • nuli888
  • nuli888
  • 2016-07-11 18:51:23
  • 17354

RabbitMQ消息的发送和接收C#

  • 2014年02月25日 11:43
  • 408KB
  • 下载

rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1....
  • is_zhoufeng
  • is_zhoufeng
  • 2013-08-17 12:54:18
  • 11862

使用RabbitMQ简单发送接收消息

参考:http://blog.csdn.net/lmj623565791/article/details/37607165            http://blog.csdn.net/anzhso...
  • lom9357bye
  • lom9357bye
  • 2017-04-11 20:51:39
  • 4843

rabbitmq学习10:使用spring-amqp发送消息及异步接收消息

前面我们已经学习了发送消息及同步接收消息的例子了。下面我们来看看如何通过spring配置来实现异步接收消息。    现在我们建立两个WEB项目。发送消息的项目命名为”rabbitmq-demo-...
  • l192168134
  • l192168134
  • 2016-04-22 14:30:59
  • 3472

RabbitMQ+Spring Quartz 实现消息的定时发送和接收

因公司需要使用RabbitMQ作为中间件实现消息的发送和接收。同时加入Spring Quartz 实现消息的定时发送。所以做了个Dome.只是做个演示。 主要有4个项目。 两个消费者一个生产者...
  • iuie_sl
  • iuie_sl
  • 2017-10-06 16:13:25
  • 535

RabbitMQ之最简单的消息的发送与接收

RabbitMQ是一个消息代理,它的核心原理非常简单:接收和发送消息,你可以把它想象成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处,RabbitMQ是一个邮箱、邮局、投递员。 我们...
  • xiaoyatouvsanan
  • xiaoyatouvsanan
  • 2014-06-27 15:19:14
  • 1339

SpringBoot 系列 | 第十篇:使用RabbitMQ收发消息

SpringBoot 系列 | 第十篇:使用RabbitMQ收发消息 本篇文章参考了官方文档:Messaging with RabbitMQ Spring Boot中使用RabbitQM需...
  • u012943767
  • u012943767
  • 2018-03-02 16:18:44
  • 9592

rabbitmq三种exchange

  • 2013年05月17日 14:40
  • 317KB
  • 下载
收藏助手
不良信息举报
您举报文章:Java使用RabbitMQ(二)--发送和接收信息
举报原因:
原因补充:

(最多只允许输入30个字)