Android端接收RabbitMQ推送出来的消息

消息推送方式挺多的,这次用了下RabbitMQ这一款,下面简单介绍一下android端应该如何接受服务端那边发送的消息

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class MainActivity extends AppCompatActivity {
    private final static String EXCHANGE = "Signal";
    Thread subscribeThread;
    ConnectionFactory factory;
    private String mMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        factory = new ConnectionFactory();
		//下面参数这里要根据实际改
        factory.setHost("10.168.2.92");
        factory.setUsername("Test");
        factory.setPassword("Test");
        factory.setVirtualHost("TestV1");
        //用于从线程中获取数据,更新ui 把消息根据来的时间写到界面上 测试效果更佳明显 可要可不要
        final Handler incomingMessageHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                String message = msg.getData().getString("msg");
                TextView tv = (TextView) findViewById(R.id.textView);
                Date now = new Date();
                SimpleDateFormat ft = new SimpleDateFormat("hh:mm:ss");
                tv.append(ft.format(now) + ' ' + message + '\n');
                Log.i("test", "msg:" + message);
            }
        };
        //开启消费者线程
        subscribe(incomingMessageHandler);
    }
    /**
     * 消费者线程
     */
    void subscribe(final Handler handler) {
        subscribeThread = new Thread(new Runnable() {
            @Override
            public void run() {
//                while (true) {
                    try {
                        //使用之前的设置,建立连接
                        Connection connection = factory.newConnection();

                        //创建一个通道
                        Channel channel = connection.createChannel();
                        //一次只发送一个,处理完成一个再获取下一个
                        channel.basicQos(1);
                        channel.exchangeDeclare(EXCHANGE,"fanout");//这里要根据实际改
                        String mQueue = channel.queueDeclare().getQueue();
                        channel.queueBind(mQueue,EXCHANGE,"");//这里要根据实际改

                        //创建消费者
//                        QueueingConsumer consumer = new QueueingConsumer(channel);
//                        channel.basicConsume(mQueue, true, consumer);
//
//                        while (true) {
//                            Log.i("我是创建的对象", "1");
//                            //wait for the next message delivery and return it.
//                            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
//                            String message = new String(delivery.getBody());
//
//                            Log.d("", "[r] " + message);
//
//                            //从message池中获取msg对象更高效
//                            Message msg = handler.obtainMessage();
//                            Bundle bundle = new Bundle();
//                            bundle.putString("msg", message);
//                            msg.setData(bundle);
//                            handler.sendMessage(msg);
//                        }

//                    } catch (InterruptedException e) {
//                        Log.i("我是创建的对象", "1");
//                        break;
                        Consumer consumer = new DefaultConsumer(channel) {
                            @Override
                            public void handleDelivery(String consumerTag, Envelope envelope,
                                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                                mMessage = new String(body, "UTF-8");
                                System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + mMessage + "'");
//                                从message池中获取msg对象更高效
                                Message msg = handler.obtainMessage();
                                Bundle bundle = new Bundle();
                                bundle.putString("msg", mMessage);
                                msg.setData(bundle);
                                handler.sendMessage(msg);
                            }
                        };
                        channel.basicConsume(mQueue, true, consumer);
//

                    } catch (Exception e1) {
                        Log.d("", "Connection broken: " + e1.getClass().getName());
                        try {
                            Thread.sleep(2000); //sleep and then try again
                        } catch (InterruptedException e) {
//                            break;
                        }
                    }
                    Log.i("1111111111111111111111", "run: ");
//                }
            }
        });
        subscribeThread.start();
    }
}

中间取消息有两种办法 一种我注释了 还有一种写上去了 反正两个都差不多,喜欢那种都行 如果领导看while (true)怕的话就用第二种,其实第一种也不是死循环,

consumer.nextDelivery();是个阻塞式方法,有消息来才会动,记得要自己添加jar包进去,下载

rabbitmq-client.jar

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值