RabbitMQ与Protobuffer的配置与使用
2018-09-12 本文已影响103人
feng_wy
项目中用到了RabbitMQ与Protobuf,特意记录一下
android studio中Protobuf配置
1.project的build.gradle配置
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
}
allprojects {
repositories {
maven { url "https://jitpack.io" }
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
2.moudle的build.gradle配置
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.wangyao.myapplication"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
sourceSets {
main {
proto {
srcDir 'src/main/proto'
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.6.1'
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.builtins {
java {}
}
}
}
generatedFilesBaseDir = "$projectDir/src/generated"
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//google protobuf传输协议
compile 'com.google.protobuf:protobuf-java:3.6.1'
}
上面代码中sourceSets节点配置出来的效果如下
3.安装Protobuf Support插件
如果无法网络安装,可以自己下载插件安装(不要告诉我不知道怎么安装啊,如果不知道可以百度)
http://plugins.jetbrains.com/plugin/8277-protobuf-support
4.在proto文件夹下面编写.proto文件
我的mi_log.proro文件是后台给的,也可以自己编写。编译完后再generated文件夹下面看到java文件
4.moudle的build.gradle配置RabbitMQ
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.wangyao.myapplication"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//rabbitmq 消息中间件与后台通信
implementation files('libs/amqp-client-4.1.1.jar')
implementation files('libs/slf4j-api-1.7.7.jar')
}
添加slf4j-api-1.7.7.jar是因为我build project时候报找不到 org.slf4j.LoggerFactory 这个类
5.最终的moudle的build.gradle文件
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.wangyao.myapplication"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
sourceSets {
main {
proto {
srcDir 'src/main/proto'
include '**/*.proto'
}
java {
srcDir 'src/main/java'
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.6.1'
}
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.builtins {
java {}
}
}
}
generatedFilesBaseDir = "$projectDir/src/generated"
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//google protobuf传输协议
compile 'com.google.protobuf:protobuf-java:3.6.1'
//rabbitmq 消息中间件与后台通信
implementation files('libs/amqp-client-4.1.1.jar')
implementation files('libs/slf4j-api-1.7.7.jar')
}
6.最终的project的build.gradle文件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
}
allprojects {
repositories {
maven { url "https://jitpack.io" }
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
7.使用RabbitMQ发送Probobuf 数据
package com.wangyao.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeoutException;
import mi.log.MiLog;
public class MainActivity extends AppCompatActivity {
private Button button;
private ConnectionFactory factory;
private final static String EXCHANGE_NAME = "mi.log.notify";
private final static String ROUTING_KEY = "mi.log";
private Connection connection;
private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:sss");
private MiLog.Message message;
private MiLog.CreateLogNotify createLogNotify;
private MiLog.AppLog appLog;
private Thread publishThread;
private Channel ch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
Date date = new Date(System.currentTimeMillis());
String time = dateFormat.format(date);
appLog = MiLog.AppLog.newBuilder()
.setLevel(MiLog.ELevel.Information)
.setTime(time)
.setMessage("我是王燿发来的测试信息")
.setAppType(MiLog.EAPP.Android)
.setVersion("16")
.setOperator("王燿")
.build();
createLogNotify = MiLog.CreateLogNotify.newBuilder().setAppLog(appLog).build();
message = MiLog.Message.newBuilder().setNtfCreateLog(createLogNotify).build();
factory = new ConnectionFactory();
setUpConnectionFactory();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
private void sendMessage() {
publishThread = new Thread(new Runnable() {
@Override
public void run() {
try {
connection = factory.newConnection();
ch = connection.createChannel();
ch.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.toByteArray());
ch.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
});
publishThread.start();
}
/**
* 连接设置
*/
private void setUpConnectionFactory() {
factory.setHost(Constants.MQ_HOST);//主机地址:
factory.setPort(Constants.MQ_PORT);// 端口号:5672
factory.setUsername(Constants.MQ_USERNAME);// 用户名
factory.setPassword(Constants.MQ_PASSWORD);// 密码
factory.setAutomaticRecoveryEnabled(false);
}
@Override
protected void onDestroy() {
super.onDestroy();
publishThread.interrupt();
}
}
8.mi_log.proto文件
package mi.log;
//-------------------------全部消息
message Message{
// 主体
oneof content
{
// 请求:创建日志
CreateLogNotify ntf_create_log=1;
}
}
//-------------------------枚举
//错误类型
enum ELevel
{
//信息
Information=1;
//警告
Warning=2;
//错误
Error=3;
}
//APP类型
enum EAPP
{
//苹果
IOS=1;
//安卓
Android=2;
//苹果pad
IOSPad=3;
//安卓pad
AndroidPad=4;
}
//-------------------------内容定义
// APP信息
message AppLog
{
// 级别
required ELevel level=1;
//时间 yyyy-MM-dd HH:mm:ss.fff
required string time=2;
//描述
required string message=3;
//app版本
required string version=4;
//app类型
required EAPP app_type=5;
//操作人
required string operator=6;
//mibee地址
optional string address=7;
//页面
optional string page=8;
//api操作
optional string api_name=9;
//dp操作
optional string dp=10;
//原始调试信息
optional string original_message=11;
}
// 请求:创建日志
message CreateLogNotify
{
//日志信息
oneof content
{
AppLog app_log=1;
MibeeLog mibee_log=2;
ServerLog server_log=3;
}
}