android之RabbitMQ使用

一.導入包

implementation ‘com.rabbitmq:amqp-client:4.2.0’

二.項目使用

1.設置工程連接
 factory = new ConnectionFactory();
 factory.setHost(hostname);
 factory.setPort(port);
 factory.setUsername(MQConfig.username);
 factory.setVirtualHost("/");
 factory.setPassword(MQConfig.password);
 factory.setConnectionTimeout(10000);         //連接時間設置爲10秒
 factory.setAutomaticRecoveryEnabled(true);   //恢復連接,通道
 factory.setTopologyRecoveryEnabled(true);    //恢復通道中 轉換器,隊列,綁定關係等
 factory.setNetworkRecoveryInterval(10000);    //恢復連接間隔,默認5秒
 factory.setRequestedHeartbeat(10);
2.監聽消息與發送消息

定義線程池

ExecutorService executor = Executors.newFixedThreadPool(2); 

監聽隊列消息

	executor.execute(new Runnable() {
            @Override
            public void run() {
                if (instance != null) {
                    receiveMessageByQueue(queueName);
                }
            }
        });
        
    public  void receiveMessageByQueue(final String queueName) {
        try {
            if (connection == null || !connection.isOpen()) {
                connection = factory.newConnection();
            }
            if (!channelMap.containsKey(FLAG_RECEIVE + queueName)) {
                final Channel channel = connection.createChannel();
                channel.queueDeclare(queueName, true, false, false, null);
                channel.basicQos(100);
                channel.basicConsume(queueName, false, 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");
                        if (mqMessageReceiver != null) {
                            mqMessageReceiver.onMQMessage(queueName, message, channel, envelope);
                        }
                    }
                });
                channelMap.put(FLAG_RECEIVE + queueName, channel);
            }
        } catch (IOException | TimeoutException | AlreadyClosedException e) {
            SystemClock.sleep(5000);
            receiveMessageByQueue(queueName);
        }
    }

發送消息

 executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    if (connection == null || !connection.isOpen()) {
                        connection = factory.newConnection();
                    }
                    Channel channel;
                    if (channelMap.containsKey(FLAG_SEND + queueName)) {
                        channel = channelMap.get(FLAG_SEND + queueName);
                    } else {
                        channel = connection.createChannel();
                        channel.queueDeclare(queueName, true, false, false, null);
                        channelMap.put(FLAG_SEND + queueName, channel);
                    }
                    channel.confirmSelect();
                    channel.basicPublish("", queueName, null, message.getBytes());
                    boolean success = channel.waitForConfirms();
                    if (success) {
                        if (listener != null) {
                            listener.sendMessage(true);
                        }
                    } else {
                        if (listener != null) {
                            listener.sendMessage(false);
                        }
                    }
                } catch (IOException | InterruptedException | TimeoutException e) {
                    e.printStackTrace();
                    if (listener != null) {
                        listener.sendMessage(false);
                    }
                }
            }
        });

關閉資源

    public void close() {
        instance = null;

        if(executor!=null){
            executor.shutdown();
        }

        if(factory!=null){
            factory=null;
        }

        if (channelMap != null && channelMap.size() > 0) {
            for (Channel channel : channelMap.values()) {
                if (channel != null && channel.isOpen()) {
                    try {
                        Connection connection = channel.getConnection();

                        if(channel!=null&&channel.isOpen()){
                            channel.close();
                        }

                        if(connection!=null&&connection.isOpen()){
                            connection.close();
                        }
                    } catch (IOException | TimeoutException e) {
                        e.printStackTrace();
                    }catch (Exception e1){
                        e1.printStackTrace();
                    }
                }
            }
            channelMap.clear();
        }

        if (connection != null && connection.isOpen()) {
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章