Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
SiEn
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hewei
SiEn
Commits
d5b06ae5
Commit
d5b06ae5
authored
Nov 09, 2020
by
giaogiao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加 app和商户推送
parent
190df6ba
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
564 additions
and
2 deletions
+564
-2
common/src/main/java/com/jumeirah/common/factory/PushFactory.java
+36
-0
common/src/main/java/com/jumeirah/common/factory/PushService.java
+15
-0
common/src/main/java/com/jumeirah/common/push/umeng/PushClient.java
+103
-0
common/src/main/java/com/jumeirah/common/push/umeng/UmengNotification.java
+84
-0
common/src/main/java/com/jumeirah/common/push/umeng/android/AndroidNotification.java
+230
-0
common/src/main/java/com/jumeirah/common/push/umeng/ios/IOSNotification.java
+94
-0
config/src/main/resources/config/application-test.yml
+2
-2
No files found.
common/src/main/java/com/jumeirah/common/factory/PushFactory.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
factory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @author: JJww
* @Date:2020/11/5
*/
@Component
public
class
PushFactory
{
@Autowired
private
PushService
umengIosPushServiceImpl
;
@Autowired
private
PushService
umengAndroidPushServiceImpl
;
/**
* 创建对应实现类
*
* @param type
* @return
*/
public
PushService
getService
(
Integer
type
)
{
switch
(
type
)
{
case
1
:
return
umengAndroidPushServiceImpl
;
case
2
:
return
umengIosPushServiceImpl
;
default
:
return
null
;
}
}
}
common/src/main/java/com/jumeirah/common/factory/PushService.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
factory
;
/**
* @author: JJww
* @Date:2020/11/5
*/
public
interface
PushService
{
/**
* 单播
*
* @param deviceToken
*/
void
unicast
(
String
deviceToken
);
}
common/src/main/java/com/jumeirah/common/push/umeng/PushClient.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
push
.
umeng
;
import
org.apache.commons.codec.digest.DigestUtils
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.client.HttpClient
;
import
org.apache.http.client.methods.HttpPost
;
import
org.apache.http.entity.StringEntity
;
import
org.apache.http.impl.client.DefaultHttpClient
;
import
org.json.JSONObject
;
import
org.springframework.stereotype.Component
;
import
java.io.BufferedReader
;
import
java.io.InputStreamReader
;
import
java.nio.charset.StandardCharsets
;
/**
* @author JJww
*/
@Component
public
class
PushClient
{
// The host
protected
static
final
String
host
=
"http://msg.umeng.com"
;
// The upload path
protected
static
final
String
uploadPath
=
"/upload"
;
// The post path
protected
static
final
String
postPath
=
"/api/send"
;
// The user agent
protected
final
String
USER_AGENT
=
"Mozilla/5.0"
;
// This object is used for sending the post request to Umeng
protected
HttpClient
client
=
new
DefaultHttpClient
();
public
boolean
send
(
UmengNotification
msg
)
throws
Exception
{
String
timestamp
=
Integer
.
toString
((
int
)
(
System
.
currentTimeMillis
()
/
1000
));
msg
.
setPredefinedKeyValue
(
"timestamp"
,
timestamp
);
String
url
=
host
+
postPath
;
String
postBody
=
msg
.
getPostBody
();
String
sign
=
DigestUtils
.
md5Hex
((
"POST"
+
url
+
postBody
+
msg
.
getAppMasterSecret
()).
getBytes
(
StandardCharsets
.
UTF_8
));
url
=
url
+
"?sign="
+
sign
;
HttpPost
post
=
new
HttpPost
(
url
);
post
.
setHeader
(
"User-Agent"
,
USER_AGENT
);
StringEntity
se
=
new
StringEntity
(
postBody
,
"UTF-8"
);
post
.
setEntity
(
se
);
// Send the post request and get the response
HttpResponse
response
=
client
.
execute
(
post
);
int
status
=
response
.
getStatusLine
().
getStatusCode
();
System
.
out
.
println
(
"Response Code : "
+
status
);
BufferedReader
rd
=
new
BufferedReader
(
new
InputStreamReader
(
response
.
getEntity
().
getContent
()));
StringBuffer
result
=
new
StringBuffer
();
String
line
=
""
;
while
((
line
=
rd
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
System
.
out
.
println
(
result
.
toString
());
if
(
status
==
200
)
{
System
.
out
.
println
(
"Notification sent successfully."
);
}
else
{
System
.
out
.
println
(
"Failed to send the notification!"
);
}
return
true
;
}
// Upload file with device_tokens to Umeng
public
String
uploadContents
(
String
appkey
,
String
appMasterSecret
,
String
contents
)
throws
Exception
{
// Construct the json string
JSONObject
uploadJson
=
new
JSONObject
();
uploadJson
.
put
(
"appkey"
,
appkey
);
String
timestamp
=
Integer
.
toString
((
int
)
(
System
.
currentTimeMillis
()
/
1000
));
uploadJson
.
put
(
"timestamp"
,
timestamp
);
uploadJson
.
put
(
"content"
,
contents
);
// Construct the request
String
url
=
host
+
uploadPath
;
String
postBody
=
uploadJson
.
toString
();
String
sign
=
DigestUtils
.
md5Hex
((
"POST"
+
url
+
postBody
+
appMasterSecret
).
getBytes
(
StandardCharsets
.
UTF_8
));
url
=
url
+
"?sign="
+
sign
;
HttpPost
post
=
new
HttpPost
(
url
);
post
.
setHeader
(
"User-Agent"
,
USER_AGENT
);
StringEntity
se
=
new
StringEntity
(
postBody
,
"UTF-8"
);
post
.
setEntity
(
se
);
// Send the post request and get the response
HttpResponse
response
=
client
.
execute
(
post
);
System
.
out
.
println
(
"Response Code : "
+
response
.
getStatusLine
().
getStatusCode
());
BufferedReader
rd
=
new
BufferedReader
(
new
InputStreamReader
(
response
.
getEntity
().
getContent
()));
StringBuffer
result
=
new
StringBuffer
();
String
line
=
""
;
while
((
line
=
rd
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
System
.
out
.
println
(
result
.
toString
());
// Decode response string and get file_id from it
JSONObject
respJson
=
new
JSONObject
(
result
.
toString
());
String
ret
=
respJson
.
getString
(
"ret"
);
if
(!
ret
.
equals
(
"SUCCESS"
))
{
throw
new
Exception
(
"Failed to upload file"
);
}
JSONObject
data
=
respJson
.
getJSONObject
(
"data"
);
String
fileId
=
data
.
getString
(
"file_id"
);
// Set file_id into rootJson using setPredefinedKeyValue
return
fileId
;
}
}
common/src/main/java/com/jumeirah/common/push/umeng/UmengNotification.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
push
.
umeng
;
import
org.json.JSONObject
;
import
org.springframework.stereotype.Component
;
import
java.util.Arrays
;
import
java.util.HashSet
;
@Component
public
abstract
class
UmengNotification
{
// Keys can be set in the root level
protected
static
final
HashSet
<
String
>
ROOT_KEYS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"appkey"
,
"timestamp"
,
"type"
,
"device_tokens"
,
"alias"
,
"alias_type"
,
"file_id"
,
"filter"
,
"production_mode"
,
"feedback"
,
"description"
,
"thirdparty_id"
,
"mipush"
,
"mi_activity"
,
"channel_properties"
));
// Keys can be set in the policy level
protected
static
final
HashSet
<
String
>
POLICY_KEYS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"start_time"
,
"expire_time"
,
"max_send_num"
));
// This JSONObject is used for constructing the whole request string.
protected
final
JSONObject
rootJson
=
new
JSONObject
();
// The app master secret
protected
String
appMasterSecret
;
// Set predefined keys in the rootJson, for extra keys(Android) or customized keys(IOS) please
// refer to corresponding methods in the subclass.
public
abstract
boolean
setPredefinedKeyValue
(
String
key
,
Object
value
)
throws
Exception
;
public
String
getPostBody
()
{
return
rootJson
.
toString
();
}
protected
final
String
getAppMasterSecret
()
{
return
appMasterSecret
;
}
public
void
setAppMasterSecret
(
String
secret
)
{
appMasterSecret
=
secret
;
}
protected
void
setProductionMode
(
Boolean
prod
)
throws
Exception
{
setPredefinedKeyValue
(
"production_mode"
,
prod
.
toString
());
}
///正式模式
public
void
setProductionMode
()
throws
Exception
{
setProductionMode
(
true
);
}
///测试模式
public
void
setTestMode
()
throws
Exception
{
setProductionMode
(
false
);
}
///发送消息描述,建议填写。
public
void
setDescription
(
String
description
)
throws
Exception
{
setPredefinedKeyValue
(
"description"
,
description
);
}
///定时发送时间,若不填写表示立即发送。格式: "YYYY-MM-DD hh:mm:ss"。
public
void
setStartTime
(
String
startTime
)
throws
Exception
{
setPredefinedKeyValue
(
"start_time"
,
startTime
);
}
///消息过期时间,格式: "YYYY-MM-DD hh:mm:ss"。
public
void
setExpireTime
(
String
expireTime
)
throws
Exception
{
setPredefinedKeyValue
(
"expire_time"
,
expireTime
);
}
///发送限速,每秒发送的最大条数。
public
void
setMaxSendNum
(
Integer
num
)
throws
Exception
{
setPredefinedKeyValue
(
"max_send_num"
,
num
);
}
//厂商弹窗activity
public
void
setChannelActivity
(
String
activity
)
throws
Exception
{
setPredefinedKeyValue
(
"mipush"
,
"true"
);
setPredefinedKeyValue
(
"mi_activity"
,
activity
);
}
//厂商属性配置
public
void
setChannelProperties
(
String
xiaoMiChannelId
)
throws
Exception
{
JSONObject
object
=
new
JSONObject
();
object
.
put
(
"xiaomi_channel_id"
,
xiaoMiChannelId
);
setPredefinedKeyValue
(
"channel_properties"
,
object
);
}
}
common/src/main/java/com/jumeirah/common/push/umeng/android/AndroidNotification.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
push
.
umeng
.
android
;
import
com.jumeirah.common.push.umeng.UmengNotification
;
import
org.json.JSONObject
;
import
java.util.Arrays
;
import
java.util.HashSet
;
public
abstract
class
AndroidNotification
extends
UmengNotification
{
// Keys can be set in the payload level
protected
static
final
HashSet
<
String
>
PAYLOAD_KEYS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"display_type"
));
// Keys can be set in the body level
protected
static
final
HashSet
<
String
>
BODY_KEYS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"ticker"
,
"title"
,
"text"
,
"builder_id"
,
"icon"
,
"largeIcon"
,
"img"
,
"play_vibrate"
,
"play_lights"
,
"play_sound"
,
"sound"
,
"after_open"
,
"url"
,
"activity"
,
"custom"
));
// Set key/value in the rootJson, for the keys can be set please see ROOT_KEYS, PAYLOAD_KEYS,
// BODY_KEYS and POLICY_KEYS.
@Override
public
boolean
setPredefinedKeyValue
(
String
key
,
Object
value
)
throws
Exception
{
if
(
ROOT_KEYS
.
contains
(
key
))
{
// This key should be in the root level
rootJson
.
put
(
key
,
value
);
}
else
if
(
PAYLOAD_KEYS
.
contains
(
key
))
{
// This key should be in the payload level
JSONObject
payloadJson
=
null
;
if
(
rootJson
.
has
(
"payload"
))
{
payloadJson
=
rootJson
.
getJSONObject
(
"payload"
);
}
else
{
payloadJson
=
new
JSONObject
();
rootJson
.
put
(
"payload"
,
payloadJson
);
}
payloadJson
.
put
(
key
,
value
);
}
else
if
(
BODY_KEYS
.
contains
(
key
))
{
// This key should be in the body level
JSONObject
bodyJson
=
null
;
JSONObject
payloadJson
=
null
;
// 'body' is under 'payload', so build a payload if it doesn't exist
if
(
rootJson
.
has
(
"payload"
))
{
payloadJson
=
rootJson
.
getJSONObject
(
"payload"
);
}
else
{
payloadJson
=
new
JSONObject
();
rootJson
.
put
(
"payload"
,
payloadJson
);
}
// Get body JSONObject, generate one if not existed
if
(
payloadJson
.
has
(
"body"
))
{
bodyJson
=
payloadJson
.
getJSONObject
(
"body"
);
}
else
{
bodyJson
=
new
JSONObject
();
payloadJson
.
put
(
"body"
,
bodyJson
);
}
bodyJson
.
put
(
key
,
value
);
}
else
if
(
POLICY_KEYS
.
contains
(
key
))
{
// This key should be in the body level
JSONObject
policyJson
=
null
;
if
(
rootJson
.
has
(
"policy"
))
{
policyJson
=
rootJson
.
getJSONObject
(
"policy"
);
}
else
{
policyJson
=
new
JSONObject
();
rootJson
.
put
(
"policy"
,
policyJson
);
}
policyJson
.
put
(
key
,
value
);
}
else
{
if
(
key
==
"payload"
||
key
==
"body"
||
key
==
"policy"
||
key
==
"extra"
)
{
throw
new
Exception
(
"You don't need to set value for "
+
key
+
" , just set values for the sub keys in it."
);
}
else
{
throw
new
Exception
(
"Unknown key: "
+
key
);
}
}
return
true
;
}
// Set extra key/value for Android notification
public
boolean
setExtraField
(
String
key
,
String
value
)
throws
Exception
{
JSONObject
payloadJson
=
null
;
JSONObject
extraJson
=
null
;
if
(
rootJson
.
has
(
"payload"
))
{
payloadJson
=
rootJson
.
getJSONObject
(
"payload"
);
}
else
{
payloadJson
=
new
JSONObject
();
rootJson
.
put
(
"payload"
,
payloadJson
);
}
if
(
payloadJson
.
has
(
"extra"
))
{
extraJson
=
payloadJson
.
getJSONObject
(
"extra"
);
}
else
{
extraJson
=
new
JSONObject
();
payloadJson
.
put
(
"extra"
,
extraJson
);
}
extraJson
.
put
(
key
,
value
);
return
true
;
}
//
public
void
setDisplayType
(
DisplayType
d
)
throws
Exception
{
setPredefinedKeyValue
(
"display_type"
,
d
.
getValue
());
}
///通知栏提示文字
public
void
setTicker
(
String
ticker
)
throws
Exception
{
setPredefinedKeyValue
(
"ticker"
,
ticker
);
}
///通知标题
public
void
setTitle
(
String
title
)
throws
Exception
{
setPredefinedKeyValue
(
"title"
,
title
);
}
///通知文字描述
public
void
setText
(
String
text
)
throws
Exception
{
setPredefinedKeyValue
(
"text"
,
text
);
}
///用于标识该通知采用的样式。使用该参数时, 必须在SDK里面实现自定义通知栏样式。
public
void
setBuilderId
(
Integer
builder_id
)
throws
Exception
{
setPredefinedKeyValue
(
"builder_id"
,
builder_id
);
}
///状态栏图标ID, R.drawable.[smallIcon],如果没有, 默认使用应用图标。
public
void
setIcon
(
String
icon
)
throws
Exception
{
setPredefinedKeyValue
(
"icon"
,
icon
);
}
///通知栏拉开后左侧图标ID
public
void
setLargeIcon
(
String
largeIcon
)
throws
Exception
{
setPredefinedKeyValue
(
"largeIcon"
,
largeIcon
);
}
///通知栏大图标的URL链接。该字段的优先级大于largeIcon。该字段要求以http或者https开头。
public
void
setImg
(
String
img
)
throws
Exception
{
setPredefinedKeyValue
(
"img"
,
img
);
}
///收到通知是否震动,默认为"true"
public
void
setPlayVibrate
(
Boolean
play_vibrate
)
throws
Exception
{
setPredefinedKeyValue
(
"play_vibrate"
,
play_vibrate
.
toString
());
}
///收到通知是否闪灯,默认为"true"
public
void
setPlayLights
(
Boolean
play_lights
)
throws
Exception
{
setPredefinedKeyValue
(
"play_lights"
,
play_lights
.
toString
());
}
///收到通知是否发出声音,默认为"true"
public
void
setPlaySound
(
Boolean
play_sound
)
throws
Exception
{
setPredefinedKeyValue
(
"play_sound"
,
play_sound
.
toString
());
}
///通知声音,R.raw.[sound]. 如果该字段为空,采用SDK默认的声音
public
void
setSound
(
String
sound
)
throws
Exception
{
setPredefinedKeyValue
(
"sound"
,
sound
);
}
///收到通知后播放指定的声音文件
public
void
setPlaySound
(
String
sound
)
throws
Exception
{
setPlaySound
(
true
);
setSound
(
sound
);
}
///点击"通知"的后续行为,默认为打开app。
public
void
goAppAfterOpen
()
throws
Exception
{
setAfterOpenAction
(
AfterOpenAction
.
go_app
);
}
public
void
goUrlAfterOpen
(
String
url
)
throws
Exception
{
setAfterOpenAction
(
AfterOpenAction
.
go_url
);
setUrl
(
url
);
}
public
void
goActivityAfterOpen
(
String
activity
)
throws
Exception
{
setAfterOpenAction
(
AfterOpenAction
.
go_activity
);
setActivity
(
activity
);
}
public
void
goCustomAfterOpen
(
String
custom
)
throws
Exception
{
setAfterOpenAction
(
AfterOpenAction
.
go_custom
);
setCustomField
(
custom
);
}
public
void
goCustomAfterOpen
(
JSONObject
custom
)
throws
Exception
{
setAfterOpenAction
(
AfterOpenAction
.
go_custom
);
setCustomField
(
custom
);
}
///点击"通知"的后续行为,默认为打开app。原始接口
public
void
setAfterOpenAction
(
AfterOpenAction
action
)
throws
Exception
{
setPredefinedKeyValue
(
"after_open"
,
action
.
toString
());
}
public
void
setUrl
(
String
url
)
throws
Exception
{
setPredefinedKeyValue
(
"url"
,
url
);
}
public
void
setActivity
(
String
activity
)
throws
Exception
{
setPredefinedKeyValue
(
"activity"
,
activity
);
}
///can be a string of json
public
void
setCustomField
(
String
custom
)
throws
Exception
{
setPredefinedKeyValue
(
"custom"
,
custom
);
}
public
void
setCustomField
(
JSONObject
custom
)
throws
Exception
{
setPredefinedKeyValue
(
"custom"
,
custom
);
}
public
enum
DisplayType
{
NOTIFICATION
{
public
String
getValue
()
{
return
"notification"
;
}
},
///通知:消息送达到用户设备后,由友盟SDK接管处理并在通知栏上显示通知内容。
MESSAGE
{
public
String
getValue
()
{
return
"message"
;
}
};
///消息:消息送达到用户设备后,消息内容透传给应用自身进行解析处理。
public
abstract
String
getValue
();
}
public
enum
AfterOpenAction
{
go_app
,
//打开应用
go_url
,
//跳转到URL
go_activity
,
//打开特定的activity
go_custom
//用户自定义内容。
}
}
common/src/main/java/com/jumeirah/common/push/umeng/ios/IOSNotification.java
0 → 100644
View file @
d5b06ae5
package
com
.
jumeirah
.
common
.
push
.
umeng
.
ios
;
import
com.jumeirah.common.push.umeng.UmengNotification
;
import
org.json.JSONObject
;
import
java.util.Arrays
;
import
java.util.HashSet
;
public
abstract
class
IOSNotification
extends
UmengNotification
{
// Keys can be set in the aps level
protected
static
final
HashSet
<
String
>
APS_KEYS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"alert"
,
"badge"
,
"sound"
,
"content-available"
));
@Override
public
boolean
setPredefinedKeyValue
(
String
key
,
Object
value
)
throws
Exception
{
if
(
ROOT_KEYS
.
contains
(
key
))
{
// This key should be in the root level
rootJson
.
put
(
key
,
value
);
}
else
if
(
APS_KEYS
.
contains
(
key
))
{
// This key should be in the aps level
JSONObject
apsJson
=
null
;
JSONObject
payloadJson
=
null
;
if
(
rootJson
.
has
(
"payload"
))
{
payloadJson
=
rootJson
.
getJSONObject
(
"payload"
);
}
else
{
payloadJson
=
new
JSONObject
();
rootJson
.
put
(
"payload"
,
payloadJson
);
}
if
(
payloadJson
.
has
(
"aps"
))
{
apsJson
=
payloadJson
.
getJSONObject
(
"aps"
);
}
else
{
apsJson
=
new
JSONObject
();
payloadJson
.
put
(
"aps"
,
apsJson
);
}
apsJson
.
put
(
key
,
value
);
}
else
if
(
POLICY_KEYS
.
contains
(
key
))
{
// This key should be in the body level
JSONObject
policyJson
=
null
;
if
(
rootJson
.
has
(
"policy"
))
{
policyJson
=
rootJson
.
getJSONObject
(
"policy"
);
}
else
{
policyJson
=
new
JSONObject
();
rootJson
.
put
(
"policy"
,
policyJson
);
}
policyJson
.
put
(
key
,
value
);
}
else
{
if
(
key
==
"payload"
||
key
==
"aps"
||
key
==
"policy"
)
{
throw
new
Exception
(
"You don't need to set value for "
+
key
+
" , just set values for the sub keys in it."
);
}
else
{
throw
new
Exception
(
"Unknownd key: "
+
key
);
}
}
return
true
;
}
// Set customized key/value for IOS notification
public
boolean
setCustomizedField
(
String
key
,
String
value
)
throws
Exception
{
//rootJson.put(key, value);
JSONObject
payloadJson
=
null
;
if
(
rootJson
.
has
(
"payload"
))
{
payloadJson
=
rootJson
.
getJSONObject
(
"payload"
);
}
else
{
payloadJson
=
new
JSONObject
();
rootJson
.
put
(
"payload"
,
payloadJson
);
}
payloadJson
.
put
(
key
,
value
);
return
true
;
}
public
void
setAlert
(
String
token
)
throws
Exception
{
setPredefinedKeyValue
(
"alert"
,
token
);
}
public
void
setAlert
(
String
title
,
String
subtitle
,
String
body
)
throws
Exception
{
JSONObject
object
=
new
JSONObject
();
object
.
put
(
"title"
,
title
);
object
.
put
(
"subtitle"
,
subtitle
);
object
.
put
(
"body"
,
body
);
setPredefinedKeyValue
(
"alert"
,
object
);
}
public
void
setBadge
(
Integer
badge
)
throws
Exception
{
setPredefinedKeyValue
(
"badge"
,
badge
);
}
public
void
setSound
(
String
sound
)
throws
Exception
{
setPredefinedKeyValue
(
"sound"
,
sound
);
}
public
void
setContentAvailable
(
Integer
contentAvailable
)
throws
Exception
{
setPredefinedKeyValue
(
"content-available"
,
contentAvailable
);
}
}
config/src/main/resources/config/application-test.yml
View file @
d5b06ae5
...
...
@@ -27,10 +27,10 @@ spring:
port
:
6379
rabbitmq
:
host
:
127.0.0.1
host
:
47.99.47.225
port
:
5672
username
:
root
password
:
TYWu154pBpvr
password
:
root
order-queue-name
:
push.order
# 打印SQL语句和结果集,本地开发环境可开启,线上注释掉
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment