Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小五666\n哈哈
Rocketmq
提交
611e1b9f
R
Rocketmq
项目概览
小五666\n哈哈
/
Rocketmq
与 Fork 源项目一致
Fork自
Apache RocketMQ / Rocketmq
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rocketmq
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
611e1b9f
编写于
5月 15, 2019
作者:
O
odbozhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support oms 1.0.0 consumer
上级
03c50054
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
643 addition
and
196 deletion
+643
-196
openmessaging/src/main/java/io/openmessaging/rocketmq/config/DefaultQueueMetaData.java
...o/openmessaging/rocketmq/config/DefaultQueueMetaData.java
+65
-0
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/LocalMessageCache.java
...io/openmessaging/rocketmq/consumer/LocalMessageCache.java
+81
-32
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/PullConsumerImpl.java
.../io/openmessaging/rocketmq/consumer/PullConsumerImpl.java
+237
-66
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/PushConsumerImpl.java
.../io/openmessaging/rocketmq/consumer/PushConsumerImpl.java
+225
-55
openmessaging/src/test/java/io/openmessaging/rocketmq/consumer/PullConsumerImplTest.java
...openmessaging/rocketmq/consumer/PullConsumerImplTest.java
+19
-23
openmessaging/src/test/java/io/openmessaging/rocketmq/consumer/PushConsumerImplTest.java
...openmessaging/rocketmq/consumer/PushConsumerImplTest.java
+15
-19
pom.xml
pom.xml
+1
-1
未找到文件。
openmessaging/src/main/java/io/openmessaging/rocketmq/config/DefaultQueueMetaData.java
0 → 100644
浏览文件 @
611e1b9f
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
io.openmessaging.rocketmq.config
;
import
io.openmessaging.extension.QueueMetaData
;
import
java.util.List
;
public
class
DefaultQueueMetaData
implements
QueueMetaData
{
private
String
queueName
;
private
List
<
QueueMetaData
.
Partition
>
partitions
;
public
DefaultQueueMetaData
(
String
queueName
,
List
<
QueueMetaData
.
Partition
>
partitions
)
{
this
.
queueName
=
queueName
;
this
.
partitions
=
partitions
;
}
@Override
public
String
queueName
()
{
return
queueName
;
}
@Override
public
List
<
QueueMetaData
.
Partition
>
partitions
()
{
return
null
;
}
public
static
class
DefaultPartition
implements
Partition
{
public
DefaultPartition
(
int
partitionId
,
String
partitonHost
)
{
this
.
partitionId
=
partitionId
;
this
.
partitonHost
=
partitonHost
;
}
private
int
partitionId
;
private
String
partitonHost
;
@Override
public
int
partitionId
()
{
return
partitionId
;
}
@Override
public
String
partitonHost
()
{
return
partitonHost
;
}
}
}
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/LocalMessageCache.java
浏览文件 @
611e1b9f
...
...
@@ -17,20 +17,12 @@
package
io.openmessaging.rocketmq.consumer
;
import
io.openmessaging.KeyValue
;
import
io.openmessaging.
Messag
e
;
import
io.openmessaging.
ServiceLifeStat
e
;
import
io.openmessaging.ServiceLifecycle
;
import
io.openmessaging.extension.QueueMetaData
;
import
io.openmessaging.rocketmq.config.ClientConfig
;
import
io.openmessaging.rocketmq.config.DefaultQueueMetaData
;
import
io.openmessaging.rocketmq.domain.ConsumeRequest
;
import
java.util.Collections
;
import
java.util.Map
;
import
java.util.TreeMap
;
import
java.util.concurrent.BlockingQueue
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.locks.ReadWriteLock
;
import
org.apache.commons.lang3.reflect.FieldUtils
;
import
org.apache.rocketmq.client.consumer.DefaultMQPullConsumer
;
import
org.apache.rocketmq.client.exception.MQClientException
;
...
...
@@ -43,6 +35,10 @@ import org.apache.rocketmq.common.message.MessageQueue;
import
org.apache.rocketmq.common.utils.ThreadUtils
;
import
org.apache.rocketmq.logging.InternalLogger
;
import
java.util.*
;
import
java.util.concurrent.*
;
import
java.util.concurrent.locks.ReadWriteLock
;
class
LocalMessageCache
implements
ServiceLifecycle
{
private
final
BlockingQueue
<
ConsumeRequest
>
consumeRequestCache
;
private
final
Map
<
String
,
ConsumeRequest
>
consumedRequest
;
...
...
@@ -50,6 +46,7 @@ class LocalMessageCache implements ServiceLifecycle {
private
final
DefaultMQPullConsumer
rocketmqPullConsumer
;
private
final
ClientConfig
clientConfig
;
private
final
ScheduledExecutorService
cleanExpireMsgExecutors
;
private
ServiceLifeState
currentState
;
private
final
static
InternalLogger
log
=
ClientLogger
.
getLog
();
...
...
@@ -60,7 +57,8 @@ class LocalMessageCache implements ServiceLifecycle {
this
.
rocketmqPullConsumer
=
rocketmqPullConsumer
;
this
.
clientConfig
=
clientConfig
;
this
.
cleanExpireMsgExecutors
=
Executors
.
newSingleThreadScheduledExecutor
(
new
ThreadFactoryImpl
(
"OMS_CleanExpireMsgScheduledThread_"
));
"OMS_CleanExpireMsgScheduledThread_"
));
this
.
currentState
=
ServiceLifeState
.
INITIALIZED
;
}
int
nextPullBatchNums
()
{
...
...
@@ -71,7 +69,7 @@ class LocalMessageCache implements ServiceLifecycle {
if
(!
pullOffsetTable
.
containsKey
(
remoteQueue
))
{
try
{
pullOffsetTable
.
putIfAbsent
(
remoteQueue
,
rocketmqPullConsumer
.
fetchConsumeOffset
(
remoteQueue
,
false
));
rocketmqPullConsumer
.
fetchConsumeOffset
(
remoteQueue
,
false
));
}
catch
(
MQClientException
e
)
{
log
.
error
(
"A error occurred in fetch consume offset process."
,
e
);
}
...
...
@@ -96,8 +94,11 @@ class LocalMessageCache implements ServiceLifecycle {
MessageExt
poll
(
final
KeyValue
properties
)
{
int
currentPollTimeout
=
clientConfig
.
getOperationTimeout
();
if
(
properties
.
containsKey
(
Message
.
BuiltinKeys
.
TIMEOUT
))
{
/*
if (properties.containsKey(Message.BuiltinKeys.TIMEOUT)) {
currentPollTimeout = properties.getInt(Message.BuiltinKeys.TIMEOUT);
}*/
if
(
properties
.
containsKey
(
"TIMEOUT"
))
{
currentPollTimeout
=
properties
.
getInt
(
"TIMEOUT"
);
}
return
poll
(
currentPollTimeout
);
}
...
...
@@ -117,6 +118,23 @@ class LocalMessageCache implements ServiceLifecycle {
return
null
;
}
List
<
MessageExt
>
batchPoll
(
final
KeyValue
properties
)
{
List
<
ConsumeRequest
>
consumeRequests
=
new
ArrayList
<>(
16
);
int
n
=
consumeRequestCache
.
drainTo
(
consumeRequests
);
if
(
n
>
0
)
{
List
<
MessageExt
>
messageExts
=
new
ArrayList
<>(
n
);
for
(
ConsumeRequest
consumeRequest
:
consumeRequests
)
{
MessageExt
messageExt
=
consumeRequest
.
getMessageExt
();
consumeRequest
.
setStartConsumeTimeMillis
(
System
.
currentTimeMillis
());
MessageAccessor
.
setConsumeStartTimeStamp
(
messageExt
,
String
.
valueOf
(
consumeRequest
.
getStartConsumeTimeMillis
()));
consumedRequest
.
put
(
messageExt
.
getMsgId
(),
consumeRequest
);
messageExts
.
add
(
messageExt
);
}
return
messageExts
;
}
return
null
;
}
void
ack
(
final
String
messageId
)
{
ConsumeRequest
consumeRequest
=
consumedRequest
.
remove
(
messageId
);
if
(
consumeRequest
!=
null
)
{
...
...
@@ -139,24 +157,9 @@ class LocalMessageCache implements ServiceLifecycle {
}
}
@Override
public
void
startup
()
{
this
.
cleanExpireMsgExecutors
.
scheduleAtFixedRate
(
new
Runnable
()
{
@Override
public
void
run
()
{
cleanExpireMsg
();
}
},
clientConfig
.
getRmqMessageConsumeTimeout
(),
clientConfig
.
getRmqMessageConsumeTimeout
(),
TimeUnit
.
MINUTES
);
}
@Override
public
void
shutdown
()
{
ThreadUtils
.
shutdownGracefully
(
cleanExpireMsgExecutors
,
5000
,
TimeUnit
.
MILLISECONDS
);
}
private
void
cleanExpireMsg
()
{
for
(
final
Map
.
Entry
<
MessageQueue
,
ProcessQueue
>
next
:
rocketmqPullConsumer
.
getDefaultMQPullConsumerImpl
()
.
getRebalanceImpl
().
getProcessQueueTable
().
entrySet
())
{
.
getRebalanceImpl
().
getProcessQueueTable
().
entrySet
())
{
ProcessQueue
pq
=
next
.
getValue
();
MessageQueue
mq
=
next
.
getKey
();
ReadWriteLock
lockTreeMap
=
getLockInProcessQueue
(
pq
);
...
...
@@ -176,7 +179,7 @@ class LocalMessageCache implements ServiceLifecycle {
if
(!
msgTreeMap
.
isEmpty
())
{
msg
=
msgTreeMap
.
firstEntry
().
getValue
();
if
(
System
.
currentTimeMillis
()
-
Long
.
parseLong
(
MessageAccessor
.
getConsumeStartTimeStamp
(
msg
))
>
clientConfig
.
getRmqMessageConsumeTimeout
()
*
60
*
1000
)
{
>
clientConfig
.
getRmqMessageConsumeTimeout
()
*
60
*
1000
)
{
//Expired, ack and remove it.
}
else
{
break
;
...
...
@@ -194,7 +197,7 @@ class LocalMessageCache implements ServiceLifecycle {
try
{
rocketmqPullConsumer
.
sendMessageBack
(
msg
,
3
);
log
.
info
(
"Send expired msg back. topic={}, msgId={}, storeHost={}, queueId={}, queueOffset={}"
,
msg
.
getTopic
(),
msg
.
getMsgId
(),
msg
.
getStoreHost
(),
msg
.
getQueueId
(),
msg
.
getQueueOffset
());
msg
.
getTopic
(),
msg
.
getMsgId
(),
msg
.
getStoreHost
(),
msg
.
getQueueId
(),
msg
.
getQueueOffset
());
ack
(
mq
,
pq
,
msg
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Send back expired msg exception"
,
e
);
...
...
@@ -210,4 +213,50 @@ class LocalMessageCache implements ServiceLifecycle {
return
null
;
}
}
@Override
public
void
start
()
{
this
.
currentState
=
ServiceLifeState
.
STARTING
;
this
.
cleanExpireMsgExecutors
.
scheduleAtFixedRate
(
new
Runnable
()
{
@Override
public
void
run
()
{
cleanExpireMsg
();
}
},
clientConfig
.
getRmqMessageConsumeTimeout
(),
clientConfig
.
getRmqMessageConsumeTimeout
(),
TimeUnit
.
MINUTES
);
this
.
currentState
=
ServiceLifeState
.
STARTED
;
}
@Override
public
void
stop
()
{
this
.
currentState
=
ServiceLifeState
.
STOPPING
;
ThreadUtils
.
shutdownGracefully
(
cleanExpireMsgExecutors
,
5000
,
TimeUnit
.
MILLISECONDS
);
this
.
currentState
=
ServiceLifeState
.
STARTED
;
}
@Override
public
ServiceLifeState
currentState
()
{
return
currentState
;
}
@Override
public
QueueMetaData
getQueueMetaData
(
String
queueName
)
{
Set
<
MessageQueue
>
messageQueues
;
try
{
messageQueues
=
rocketmqPullConsumer
.
fetchSubscribeMessageQueues
(
queueName
);
}
catch
(
MQClientException
e
)
{
log
.
error
(
"A error occurred when get queue metadata."
,
e
);
return
null
;
}
List
<
QueueMetaData
.
Partition
>
partitions
=
new
ArrayList
<>(
16
);
if
(
null
!=
messageQueues
&&
!
messageQueues
.
isEmpty
())
{
for
(
MessageQueue
messageQueue
:
messageQueues
)
{
QueueMetaData
.
Partition
partition
=
new
DefaultQueueMetaData
.
DefaultPartition
(
messageQueue
.
getQueueId
(),
messageQueue
.
getBrokerName
());
partitions
.
add
(
partition
);
}
}
else
{
return
null
;
}
QueueMetaData
queueMetaData
=
new
DefaultQueueMetaData
(
queueName
,
partitions
);
return
queueMetaData
;
}
}
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/PullConsumerImpl.java
浏览文件 @
611e1b9f
...
...
@@ -17,35 +17,47 @@
package
io.openmessaging.rocketmq.consumer
;
import
io.openmessaging.KeyValue
;
import
io.openmessaging.Message
;
import
io.openmessaging.OMSBuiltinKeys
;
import
io.openmessaging.consumer.PullConsumer
;
import
io.openmessaging.ServiceLifeState
;
import
io.openmessaging.consumer.BatchMessageListener
;
import
io.openmessaging.consumer.Consumer
;
import
io.openmessaging.consumer.MessageListener
;
import
io.openmessaging.consumer.MessageReceipt
;
import
io.openmessaging.exception.OMSRuntimeException
;
import
io.openmessaging.extension.Extension
;
import
io.openmessaging.extension.QueueMetaData
;
import
io.openmessaging.interceptor.ConsumerInterceptor
;
import
io.openmessaging.internal.DefaultKeyValue
;
import
io.openmessaging.message.Message
;
import
io.openmessaging.rocketmq.config.ClientConfig
;
import
io.openmessaging.rocketmq.domain.BytesMessageImpl
;
import
io.openmessaging.rocketmq.domain.ConsumeRequest
;
import
io.openmessaging.rocketmq.utils.BeanUtils
;
import
io.openmessaging.rocketmq.utils.OMSUtil
;
import
org.apache.rocketmq.client.consumer.DefaultMQPullConsumer
;
import
org.apache.rocketmq.client.consumer.MQPullConsumer
;
import
org.apache.rocketmq.client.consumer.MQPullConsumerScheduleService
;
import
org.apache.rocketmq.client.consumer.PullResult
;
import
org.apache.rocketmq.client.consumer.PullTaskCallback
;
import
org.apache.rocketmq.client.consumer.PullTaskContext
;
import
org.apache.rocketmq.client.consumer.*
;
import
org.apache.rocketmq.client.exception.MQBrokerException
;
import
org.apache.rocketmq.client.exception.MQClientException
;
import
org.apache.rocketmq.client.impl.consumer.ProcessQueue
;
import
org.apache.rocketmq.client.log.ClientLogger
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.apache.rocketmq.common.message.MessageQueue
;
import
org.apache.rocketmq.logging.InternalLogger
;
import
org.apache.rocketmq.remoting.exception.RemotingException
;
import
org.apache.rocketmq.remoting.protocol.LanguageCode
;
public
class
PullConsumerImpl
implements
PullConsumer
{
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.Set
;
public
class
PullConsumerImpl
implements
Consumer
{
private
final
DefaultMQPullConsumer
rocketmqPullConsumer
;
private
final
KeyValue
properties
;
private
boolean
started
=
false
;
private
final
MQPullConsumerScheduleService
pullConsumerScheduleService
;
private
final
LocalMessageCache
localMessageCache
;
private
final
ClientConfig
clientConfig
;
private
ServiceLifeState
currentState
;
private
List
<
ConsumerInterceptor
>
consumerInterceptors
;
private
final
static
InternalLogger
log
=
ClientLogger
.
getLog
();
...
...
@@ -55,7 +67,7 @@ public class PullConsumerImpl implements PullConsumer {
String
consumerGroup
=
clientConfig
.
getConsumerId
();
if
(
null
==
consumerGroup
||
consumerGroup
.
isEmpty
())
{
throw
new
OMSRuntimeException
(
"-1"
,
"Consumer Group is necessary for RocketMQ, please set it."
);
throw
new
OMSRuntimeException
(
-
1
,
"Consumer Group is necessary for RocketMQ, please set it."
);
}
pullConsumerScheduleService
=
new
MQPullConsumerScheduleService
(
consumerGroup
);
...
...
@@ -64,7 +76,7 @@ public class PullConsumerImpl implements PullConsumer {
if
(
"true"
.
equalsIgnoreCase
(
System
.
getenv
(
"OMS_RMQ_DIRECT_NAME_SRV"
)))
{
String
accessPoints
=
clientConfig
.
getAccessPoints
();
if
(
accessPoints
==
null
||
accessPoints
.
isEmpty
())
{
throw
new
OMSRuntimeException
(
"-1"
,
"OMS AccessPoints is null or empty."
);
throw
new
OMSRuntimeException
(
-
1
,
"OMS AccessPoints is null or empty."
);
}
this
.
rocketmqPullConsumer
.
setNamesrvAddr
(
accessPoints
.
replace
(
','
,
';'
));
}
...
...
@@ -76,110 +88,269 @@ public class PullConsumerImpl implements PullConsumer {
String
consumerId
=
OMSUtil
.
buildInstanceName
();
this
.
rocketmqPullConsumer
.
setInstanceName
(
consumerId
);
properties
.
put
(
OMSBuiltinKeys
.
CONSUMER_ID
,
consumerId
);
// properties.put(OMSBuiltinKeys.CONSUMER_ID, consumerId);
properties
.
put
(
"TIMEOUT"
,
consumerId
);
this
.
rocketmqPullConsumer
.
setLanguage
(
LanguageCode
.
OMS
);
this
.
localMessageCache
=
new
LocalMessageCache
(
this
.
rocketmqPullConsumer
,
clientConfig
);
consumerInterceptors
=
new
ArrayList
<>(
16
);
}
private
void
registerPullTaskCallback
(
final
String
targetQueueName
)
{
this
.
pullConsumerScheduleService
.
registerPullTaskCallback
(
targetQueueName
,
new
PullTaskCallback
()
{
@Override
public
void
doPullTask
(
final
MessageQueue
mq
,
final
PullTaskContext
context
)
{
MQPullConsumer
consumer
=
context
.
getPullConsumer
();
try
{
long
offset
=
localMessageCache
.
nextPullOffset
(
mq
);
PullResult
pullResult
=
consumer
.
pull
(
mq
,
"*"
,
offset
,
localMessageCache
.
nextPullBatchNums
());
ProcessQueue
pq
=
rocketmqPullConsumer
.
getDefaultMQPullConsumerImpl
().
getRebalanceImpl
()
.
getProcessQueueTable
().
get
(
mq
);
switch
(
pullResult
.
getPullStatus
())
{
case
FOUND:
if
(
pq
!=
null
)
{
pq
.
putMessage
(
pullResult
.
getMsgFoundList
());
for
(
final
MessageExt
messageExt
:
pullResult
.
getMsgFoundList
())
{
localMessageCache
.
submitConsumeRequest
(
new
ConsumeRequest
(
messageExt
,
mq
,
pq
));
}
}
break
;
default
:
break
;
}
localMessageCache
.
updatePullOffset
(
mq
,
pullResult
.
getNextBeginOffset
());
}
catch
(
Exception
e
)
{
log
.
error
(
"A error occurred in pull message process."
,
e
);
}
}
});
}
@Override
public
KeyValue
attributes
()
{
return
properties
;
public
void
resume
()
{
currentState
=
ServiceLifeState
.
STARTED
;
}
@Override
public
PullConsumer
attachQueue
(
String
queueName
)
{
registerPullTaskCallback
(
queueName
);
return
this
;
public
void
suspend
()
{
currentState
=
ServiceLifeState
.
STOPPED
;
}
@Override
public
PullConsumer
attachQueue
(
String
queueName
,
KeyValue
attributes
)
{
public
void
suspend
(
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
boolean
isSuspended
()
{
if
(
ServiceLifeState
.
STOPPED
.
equals
(
currentState
))
{
return
true
;
}
return
false
;
}
@Override
public
void
bindQueue
(
String
queueName
)
{
registerPullTaskCallback
(
queueName
);
return
this
;
}
@Override
public
PullConsumer
detachQueue
(
String
queueName
)
{
public
void
bindQueue
(
List
<
String
>
queueNames
)
{
for
(
String
queueName
:
queueNames
)
{
bindQueue
(
queueName
);
}
}
@Override
public
void
bindQueue
(
String
queueName
,
MessageListener
listener
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
bindQueues
(
List
<
String
>
queueNames
,
MessageListener
listener
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
bindQueue
(
String
queueName
,
BatchMessageListener
listener
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
bindQueues
(
List
<
String
>
queueNames
,
BatchMessageListener
listener
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
unbindQueue
(
String
queueName
)
{
this
.
rocketmqPullConsumer
.
getRegisterTopics
().
remove
(
queueName
);
return
this
;
}
@Override
public
Message
receive
()
{
MessageExt
rmqMsg
=
localMessageCache
.
poll
();
public
void
unbindQueues
(
List
<
String
>
queueNames
)
{
for
(
String
queueName
:
queueNames
)
{
this
.
rocketmqPullConsumer
.
getRegisterTopics
().
remove
(
queueName
);
}
}
@Override
public
boolean
isBindQueue
()
{
Set
<
String
>
registerTopics
=
rocketmqPullConsumer
.
getRegisterTopics
();
if
(
null
==
registerTopics
||
registerTopics
.
isEmpty
())
{
return
false
;
}
return
true
;
}
@Override
public
List
<
String
>
getBindQueues
()
{
Set
<
String
>
registerTopics
=
rocketmqPullConsumer
.
getRegisterTopics
();
return
new
ArrayList
<>(
registerTopics
);
}
@Override
public
void
addInterceptor
(
ConsumerInterceptor
interceptor
)
{
consumerInterceptors
.
add
(
interceptor
);
}
@Override
public
void
removeInterceptor
(
ConsumerInterceptor
interceptor
)
{
consumerInterceptors
.
remove
(
interceptor
);
}
@Override
public
Message
receive
(
long
timeout
)
{
KeyValue
properties
=
new
DefaultKeyValue
();
properties
.
put
(
"TIMEOUT"
,
timeout
);
MessageExt
rmqMsg
=
localMessageCache
.
poll
(
properties
);
return
rmqMsg
==
null
?
null
:
OMSUtil
.
msgConvert
(
rmqMsg
);
}
@Override
public
Message
receive
(
final
KeyValue
properties
)
{
public
Message
receive
(
String
queueName
,
int
partitionId
,
long
receiptId
,
long
timeout
)
{
KeyValue
properties
=
new
DefaultKeyValue
();
properties
.
put
(
"QUEUE_NAME"
,
queueName
);
properties
.
put
(
"PARTITION_ID"
,
partitionId
);
properties
.
put
(
"RECEIPT_ID"
,
receiptId
);
properties
.
put
(
"TIMEOUT"
,
timeout
);
MessageExt
rmqMsg
=
localMessageCache
.
poll
(
properties
);
return
rmqMsg
==
null
?
null
:
OMSUtil
.
msgConvert
(
rmqMsg
);
}
@Override
public
void
ack
(
final
String
messageId
)
{
localMessageCache
.
ack
(
messageId
);
public
List
<
Message
>
batchReceive
(
long
timeout
)
{
KeyValue
properties
=
new
DefaultKeyValue
();
properties
.
put
(
"TIMEOUT"
,
timeout
);
List
<
MessageExt
>
rmqMsgs
=
localMessageCache
.
batchPoll
(
properties
);
if
(
null
!=
rmqMsgs
&&
!
rmqMsgs
.
isEmpty
())
{
List
<
Message
>
messages
=
new
ArrayList
<>(
rmqMsgs
.
size
());
for
(
MessageExt
messageExt
:
rmqMsgs
)
{
BytesMessageImpl
bytesMessage
=
OMSUtil
.
msgConvert
(
messageExt
);
messages
.
add
(
bytesMessage
);
}
return
messages
;
}
return
null
;
}
@Override
public
void
ack
(
final
String
messageId
,
final
KeyValue
properties
)
{
localMessageCache
.
ack
(
messageId
);
public
List
<
Message
>
batchReceive
(
String
queueName
,
int
partitionId
,
long
receiptId
,
long
timeout
)
{
MessageQueue
mq
=
null
;
try
{
Set
<
MessageQueue
>
messageQueues
=
rocketmqPullConsumer
.
fetchSubscribeMessageQueues
(
queueName
);
for
(
MessageQueue
messageQueue
:
messageQueues
)
{
if
(
messageQueue
.
getQueueId
()
==
partitionId
)
{
mq
=
messageQueue
;
}
}
}
catch
(
MQClientException
e
)
{
e
.
printStackTrace
();
}
PullResult
pullResult
;
try
{
pullResult
=
rocketmqPullConsumer
.
pull
(
mq
,
"*"
,
receiptId
,
4
*
1024
*
1024
,
timeout
);
}
catch
(
MQClientException
e
)
{
e
.
printStackTrace
();
return
null
;
}
catch
(
RemotingException
e
)
{
e
.
printStackTrace
();
return
null
;
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
return
null
;
}
catch
(
MQBrokerException
e
)
{
e
.
printStackTrace
();
return
null
;
}
if
(
null
==
pullResult
)
{
return
null
;
}
PullStatus
pullStatus
=
pullResult
.
getPullStatus
();
List
<
Message
>
messages
=
new
ArrayList
<>(
16
);
if
(
PullStatus
.
FOUND
.
equals
(
pullStatus
))
{
List
<
MessageExt
>
rmqMsgs
=
pullResult
.
getMsgFoundList
();
if
(
null
!=
rmqMsgs
&&
!
rmqMsgs
.
isEmpty
())
{
for
(
MessageExt
messageExt
:
rmqMsgs
)
{
BytesMessageImpl
bytesMessage
=
OMSUtil
.
msgConvert
(
messageExt
);
messages
.
add
(
bytesMessage
);
}
return
messages
;
}
}
return
null
;
}
@Override
public
void
ack
(
MessageReceipt
receipt
)
{
}
@Override
public
Optional
<
Extension
>
getExtension
()
{
return
Optional
.
of
(
new
Extension
()
{
@Override
public
QueueMetaData
getQueueMetaData
(
String
queueName
)
{
return
getQueueMetaData
(
queueName
);
}
});
}
@Override
public
synchronized
void
startup
()
{
public
void
start
()
{
if
(!
started
)
{
try
{
this
.
pullConsumerScheduleService
.
start
();
this
.
localMessageCache
.
start
up
();
this
.
localMessageCache
.
start
();
}
catch
(
MQClientException
e
)
{
throw
new
OMSRuntimeException
(
"-1"
,
e
);
throw
new
OMSRuntimeException
(
-
1
,
e
);
}
}
this
.
started
=
true
;
}
private
void
registerPullTaskCallback
(
final
String
targetQueueName
)
{
this
.
pullConsumerScheduleService
.
registerPullTaskCallback
(
targetQueueName
,
new
PullTaskCallback
()
{
@Override
public
void
doPullTask
(
final
MessageQueue
mq
,
final
PullTaskContext
context
)
{
MQPullConsumer
consumer
=
context
.
getPullConsumer
();
try
{
long
offset
=
localMessageCache
.
nextPullOffset
(
mq
);
PullResult
pullResult
=
consumer
.
pull
(
mq
,
"*"
,
offset
,
localMessageCache
.
nextPullBatchNums
());
ProcessQueue
pq
=
rocketmqPullConsumer
.
getDefaultMQPullConsumerImpl
().
getRebalanceImpl
()
.
getProcessQueueTable
().
get
(
mq
);
switch
(
pullResult
.
getPullStatus
())
{
case
FOUND:
if
(
pq
!=
null
)
{
pq
.
putMessage
(
pullResult
.
getMsgFoundList
());
for
(
final
MessageExt
messageExt
:
pullResult
.
getMsgFoundList
())
{
localMessageCache
.
submitConsumeRequest
(
new
ConsumeRequest
(
messageExt
,
mq
,
pq
));
}
}
break
;
default
:
break
;
}
localMessageCache
.
updatePullOffset
(
mq
,
pullResult
.
getNextBeginOffset
());
}
catch
(
Exception
e
)
{
log
.
error
(
"A error occurred in pull message process."
,
e
);
}
}
});
currentState
=
ServiceLifeState
.
STARTED
;
}
@Override
public
synchronized
void
shutdown
()
{
public
void
stop
()
{
if
(
this
.
started
)
{
this
.
localMessageCache
.
s
hutdown
();
this
.
localMessageCache
.
s
top
();
this
.
pullConsumerScheduleService
.
shutdown
();
this
.
rocketmqPullConsumer
.
shutdown
();
}
this
.
started
=
false
;
}
@Override
public
ServiceLifeState
currentState
()
{
return
localMessageCache
.
currentState
();
}
@Override
public
QueueMetaData
getQueueMetaData
(
String
queueName
)
{
return
localMessageCache
.
getQueueMetaData
(
queueName
);
}
}
openmessaging/src/main/java/io/openmessaging/rocketmq/consumer/PushConsumerImpl.java
浏览文件 @
611e1b9f
...
...
@@ -16,37 +16,52 @@
*/
package
io.openmessaging.rocketmq.consumer
;
import
io.openmessaging.BytesMessage
;
import
io.openmessaging.KeyValue
;
import
io.openmessaging.OMS
;
import
io.openmessaging.OMSBuiltinKeys
;
import
io.openmessaging.ServiceLifeState
;
import
io.openmessaging.consumer.BatchMessageListener
;
import
io.openmessaging.consumer.Consumer
;
import
io.openmessaging.consumer.MessageListener
;
import
io.openmessaging.consumer.
PushConsumer
;
import
io.openmessaging.consumer.
MessageReceipt
;
import
io.openmessaging.exception.OMSRuntimeException
;
import
io.openmessaging.extension.Extension
;
import
io.openmessaging.extension.QueueMetaData
;
import
io.openmessaging.interceptor.ConsumerInterceptor
;
import
io.openmessaging.message.Message
;
import
io.openmessaging.rocketmq.config.ClientConfig
;
import
io.openmessaging.rocketmq.config.DefaultQueueMetaData
;
import
io.openmessaging.rocketmq.domain.BytesMessageImpl
;
import
io.openmessaging.rocketmq.domain.NonStandardKeys
;
import
io.openmessaging.rocketmq.utils.BeanUtils
;
import
io.openmessaging.rocketmq.utils.OMSUtil
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
import
org.apache.rocketmq.client.consumer.DefaultMQPushConsumer
;
import
org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext
;
import
org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus
;
import
org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently
;
import
org.apache.rocketmq.client.exception.MQClientException
;
import
org.apache.rocketmq.client.log.ClientLogger
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.apache.rocketmq.common.message.MessageQueue
;
import
org.apache.rocketmq.logging.InternalLogger
;
import
org.apache.rocketmq.remoting.protocol.LanguageCode
;
public
class
PushConsumerImpl
implements
PushConsumer
{
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
public
class
PushConsumerImpl
implements
Consumer
{
private
final
static
InternalLogger
log
=
ClientLogger
.
getLog
();
private
final
DefaultMQPushConsumer
rocketmqPushConsumer
;
private
final
KeyValue
properties
;
private
boolean
started
=
false
;
private
final
Map
<
String
,
MessageListener
>
subscribeTable
=
new
ConcurrentHashMap
<>();
private
final
Map
<
String
,
BatchMessageListener
>
batchSubscribeTable
=
new
ConcurrentHashMap
<>();
private
final
ClientConfig
clientConfig
;
private
ServiceLifeState
currentState
;
private
List
<
ConsumerInterceptor
>
consumerInterceptors
;
public
PushConsumerImpl
(
final
KeyValue
properties
)
{
this
.
rocketmqPushConsumer
=
new
DefaultMQPushConsumer
();
...
...
@@ -56,14 +71,14 @@ public class PushConsumerImpl implements PushConsumer {
if
(
"true"
.
equalsIgnoreCase
(
System
.
getenv
(
"OMS_RMQ_DIRECT_NAME_SRV"
)))
{
String
accessPoints
=
clientConfig
.
getAccessPoints
();
if
(
accessPoints
==
null
||
accessPoints
.
isEmpty
())
{
throw
new
OMSRuntimeException
(
"-1"
,
"OMS AccessPoints is null or empty."
);
throw
new
OMSRuntimeException
(
-
1
,
"OMS AccessPoints is null or empty."
);
}
this
.
rocketmqPushConsumer
.
setNamesrvAddr
(
accessPoints
.
replace
(
','
,
';'
));
}
String
consumerGroup
=
clientConfig
.
getConsumerId
();
if
(
null
==
consumerGroup
||
consumerGroup
.
isEmpty
())
{
throw
new
OMSRuntimeException
(
"-1"
,
"Consumer Group is necessary for RocketMQ, please set it."
);
throw
new
OMSRuntimeException
(
-
1
,
"Consumer Group is necessary for RocketMQ, please set it."
);
}
this
.
rocketmqPushConsumer
.
setConsumerGroup
(
consumerGroup
);
this
.
rocketmqPushConsumer
.
setMaxReconsumeTimes
(
clientConfig
.
getRmqMaxRedeliveryTimes
());
...
...
@@ -73,15 +88,14 @@ public class PushConsumerImpl implements PushConsumer {
String
consumerId
=
OMSUtil
.
buildInstanceName
();
this
.
rocketmqPushConsumer
.
setInstanceName
(
consumerId
);
properties
.
put
(
OMSBuiltinKeys
.
CONSUMER_ID
,
consumerId
);
// properties.put(OMSBuiltinKeys.CONSUMER_ID, consumerId);
properties
.
put
(
"CONSUMER_ID"
,
consumerId
);
this
.
rocketmqPushConsumer
.
setLanguage
(
LanguageCode
.
OMS
);
this
.
rocketmqPushConsumer
.
registerMessageListener
(
new
MessageListenerImpl
());
}
@Override
public
KeyValue
attributes
()
{
return
properties
;
consumerInterceptors
=
new
ArrayList
<>(
16
);
currentState
=
ServiceLifeState
.
INITIALIZED
;
}
@Override
...
...
@@ -96,7 +110,7 @@ public class PushConsumerImpl implements PushConsumer {
@Override
public
void
suspend
(
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
...
...
@@ -105,102 +119,258 @@ public class PushConsumerImpl implements PushConsumer {
}
@Override
public
PushConsumer
attachQueue
(
final
String
queueName
,
final
MessageListener
listener
)
{
public
void
bindQueue
(
String
queueName
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
bindQueue
(
List
<
String
>
queueNames
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
bindQueue
(
String
queueName
,
MessageListener
listener
)
{
this
.
subscribeTable
.
put
(
queueName
,
listener
);
this
.
batchSubscribeTable
.
remove
(
queueName
);
try
{
this
.
rocketmqPushConsumer
.
subscribe
(
queueName
,
"*"
);
}
catch
(
MQClientException
e
)
{
throw
new
OMSRuntimeException
(-
1
,
String
.
format
(
"RocketMQ push consumer can't attach to %s."
,
queueName
));
}
}
@Override
public
void
bindQueues
(
List
<
String
>
queueNames
,
MessageListener
listener
)
{
for
(
String
queueName
:
queueNames
)
{
bindQueue
(
queueName
,
listener
);
}
}
@Override
public
void
bindQueue
(
String
queueName
,
BatchMessageListener
listener
)
{
this
.
batchSubscribeTable
.
put
(
queueName
,
listener
);
this
.
subscribeTable
.
remove
(
queueName
);
try
{
this
.
rocketmqPushConsumer
.
subscribe
(
queueName
,
"*"
);
}
catch
(
MQClientException
e
)
{
throw
new
OMSRuntimeException
(
"-1"
,
String
.
format
(
"RocketMQ push consumer can't attach to %s."
,
queueName
));
throw
new
OMSRuntimeException
(
-
1
,
String
.
format
(
"RocketMQ push consumer can't attach to %s."
,
queueName
));
}
return
this
;
}
@Override
public
PushConsumer
attachQueue
(
String
queueName
,
MessageListener
listener
,
KeyValue
attributes
)
{
return
this
.
attachQueue
(
queueName
,
listener
);
public
void
bindQueues
(
List
<
String
>
queueNames
,
BatchMessageListener
listener
)
{
for
(
String
queueName
:
queueNames
)
{
bindQueue
(
queueName
,
listener
);
}
}
@Override
public
PushConsumer
detach
Queue
(
String
queueName
)
{
public
void
unbind
Queue
(
String
queueName
)
{
this
.
subscribeTable
.
remove
(
queueName
);
this
.
batchSubscribeTable
.
remove
(
queueName
);
try
{
this
.
rocketmqPushConsumer
.
unsubscribe
(
queueName
);
}
catch
(
Exception
e
)
{
throw
new
OMSRuntimeException
(
"-1"
,
String
.
format
(
"RocketMQ push consumer fails to unsubscribe topic: %s"
,
queueName
));
throw
new
OMSRuntimeException
(-
1
,
String
.
format
(
"RocketMQ push consumer fails to unsubscribe topic: %s"
,
queueName
));
}
}
@Override
public
void
unbindQueues
(
List
<
String
>
queueNames
)
{
for
(
String
queueName
:
queueNames
)
{
unbindQueue
(
queueName
);
}
}
@Override
public
boolean
isBindQueue
()
{
Map
<
String
,
String
>
subscription
=
rocketmqPushConsumer
.
getSubscription
();
if
(
null
!=
subscription
&&
subscription
.
size
()
>
0
)
{
return
true
;
}
return
false
;
}
@Override
public
List
<
String
>
getBindQueues
()
{
Map
<
String
,
String
>
subscription
=
rocketmqPushConsumer
.
getSubscription
();
if
(
null
!=
subscription
&&
subscription
.
size
()
>
0
)
{
return
new
ArrayList
<>(
subscription
.
keySet
());
}
return
null
;
}
@Override
public
void
addInterceptor
(
ConsumerInterceptor
interceptor
)
{
consumerInterceptors
.
add
(
interceptor
);
}
@Override
public
void
removeInterceptor
(
ConsumerInterceptor
interceptor
)
{
consumerInterceptors
.
remove
(
interceptor
);
}
@Override
public
Message
receive
(
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
Message
receive
(
String
queueName
,
int
partitionId
,
long
receiptId
,
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
List
<
Message
>
batchReceive
(
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
List
<
Message
>
batchReceive
(
String
queueName
,
int
partitionId
,
long
receiptId
,
long
timeout
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
ack
(
MessageReceipt
receipt
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
synchronized
void
startup
()
{
public
Optional
<
Extension
>
getExtension
()
{
return
Optional
.
of
(
new
Extension
()
{
@Override
public
QueueMetaData
getQueueMetaData
(
String
queueName
)
{
return
getQueueMetaData
(
queueName
);
}
});
}
@Override
public
void
start
()
{
currentState
=
ServiceLifeState
.
STARTING
;
if
(!
started
)
{
try
{
this
.
rocketmqPushConsumer
.
start
();
}
catch
(
MQClientException
e
)
{
throw
new
OMSRuntimeException
(
"-1"
,
e
);
throw
new
OMSRuntimeException
(
-
1
,
e
);
}
}
this
.
started
=
true
;
currentState
=
ServiceLifeState
.
STARTED
;
}
@Override
public
synchronized
void
shutdown
()
{
public
void
stop
()
{
currentState
=
ServiceLifeState
.
STOPPING
;
if
(
this
.
started
)
{
this
.
rocketmqPushConsumer
.
shutdown
();
}
this
.
started
=
false
;
currentState
=
ServiceLifeState
.
STOPPED
;
}
@Override
public
ServiceLifeState
currentState
()
{
return
currentState
;
}
@Override
public
QueueMetaData
getQueueMetaData
(
String
queueName
)
{
Set
<
MessageQueue
>
messageQueues
;
try
{
messageQueues
=
rocketmqPushConsumer
.
fetchSubscribeMessageQueues
(
queueName
);
}
catch
(
MQClientException
e
)
{
log
.
error
(
"A error occurred when get queue metadata."
,
e
);
return
null
;
}
List
<
QueueMetaData
.
Partition
>
partitions
=
new
ArrayList
<>(
16
);
if
(
null
!=
messageQueues
&&
!
messageQueues
.
isEmpty
())
{
for
(
MessageQueue
messageQueue
:
messageQueues
)
{
QueueMetaData
.
Partition
partition
=
new
DefaultQueueMetaData
.
DefaultPartition
(
messageQueue
.
getQueueId
(),
messageQueue
.
getBrokerName
());
partitions
.
add
(
partition
);
}
}
else
{
return
null
;
}
QueueMetaData
queueMetaData
=
new
DefaultQueueMetaData
(
queueName
,
partitions
);
return
queueMetaData
;
}
class
MessageListenerImpl
implements
MessageListenerConcurrently
{
@Override
public
ConsumeConcurrentlyStatus
consumeMessage
(
List
<
MessageExt
>
rmqMsgList
,
ConsumeConcurrentlyContext
contextRMQ
)
{
ConsumeConcurrentlyContext
contextRMQ
)
{
boolean
batchFlag
=
true
;
MessageExt
rmqMsg
=
rmqMsgList
.
get
(
0
);
BytesMessage
omsMsg
=
OMSUtil
.
msgConvert
(
rmqMsg
);
BatchMessageListener
batchMessageListener
=
PushConsumerImpl
.
this
.
batchSubscribeTable
.
get
(
rmqMsg
.
getTopic
());
MessageListener
listener
=
PushConsumerImpl
.
this
.
subscribeTable
.
get
(
rmqMsg
.
getTopic
());
if
(
listener
==
null
)
{
throw
new
OMSRuntimeException
(
"-1"
,
String
.
format
(
"The topic/queue %s isn't attached to this consumer"
,
rmqMsg
.
getTopic
()));
if
(
null
==
batchMessageListener
)
{
batchFlag
=
false
;
}
if
(
listener
==
null
&&
batchMessageListener
==
null
)
{
throw
new
OMSRuntimeException
(-
1
,
String
.
format
(
"The topic/queue %s isn't attached to this consumer"
,
rmqMsg
.
getTopic
()));
}
final
KeyValue
contextProperties
=
OMS
.
newKeyValue
();
final
CountDownLatch
sync
=
new
CountDownLatch
(
1
);
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
RECONSUME_LATER
.
name
());
if
(
batchFlag
)
{
List
<
Message
>
messages
=
new
ArrayList
<>(
16
);
for
(
MessageExt
messageExt
:
rmqMsgList
)
{
BytesMessageImpl
omsMsg
=
OMSUtil
.
msgConvert
(
messageExt
);
messages
.
add
(
omsMsg
);
}
final
CountDownLatch
sync
=
new
CountDownLatch
(
1
);
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
RECONSUME_LATER
.
name
());
BatchMessageListener
.
Context
context
=
new
BatchMessageListener
.
Context
()
{
@Override
public
void
success
(
MessageReceipt
...
messages
)
{
MessageListener
.
Context
context
=
new
MessageListener
.
Context
()
{
@Override
public
KeyValue
attributes
()
{
return
contextProperties
;
}
@Override
public
void
ack
()
{
sync
.
countDown
();
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
CONSUME_SUCCESS
.
name
());
}
};
long
begin
=
System
.
currentTimeMillis
();
batchMessageListener
.
onReceived
(
messages
,
context
);
long
costs
=
System
.
currentTimeMillis
()
-
begin
;
long
timeoutMills
=
clientConfig
.
getRmqMessageConsumeTimeout
()
*
60
*
1000
;
try
{
sync
.
await
(
Math
.
max
(
0
,
timeoutMills
-
costs
),
TimeUnit
.
MILLISECONDS
);
}
catch
(
InterruptedException
ignore
)
{
}
}
else
{
BytesMessageImpl
omsMsg
=
OMSUtil
.
msgConvert
(
rmqMsg
);
final
CountDownLatch
sync
=
new
CountDownLatch
(
1
);
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
RECONSUME_LATER
.
name
());
@Override
public
void
ack
()
{
sync
.
countDown
();
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
CONSUME_SUCCESS
.
name
());
MessageListener
.
Context
context
=
new
MessageListener
.
Context
()
{
@Override
public
void
ack
()
{
sync
.
countDown
();
contextProperties
.
put
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
,
ConsumeConcurrentlyStatus
.
CONSUME_SUCCESS
.
name
());
}
};
long
begin
=
System
.
currentTimeMillis
();
listener
.
onReceived
(
omsMsg
,
context
);
long
costs
=
System
.
currentTimeMillis
()
-
begin
;
long
timeoutMills
=
clientConfig
.
getRmqMessageConsumeTimeout
()
*
60
*
1000
;
try
{
sync
.
await
(
Math
.
max
(
0
,
timeoutMills
-
costs
),
TimeUnit
.
MILLISECONDS
);
}
catch
(
InterruptedException
ignore
)
{
}
};
long
begin
=
System
.
currentTimeMillis
();
listener
.
onReceived
(
omsMsg
,
context
);
long
costs
=
System
.
currentTimeMillis
()
-
begin
;
long
timeoutMills
=
clientConfig
.
getRmqMessageConsumeTimeout
()
*
60
*
1000
;
try
{
sync
.
await
(
Math
.
max
(
0
,
timeoutMills
-
costs
),
TimeUnit
.
MILLISECONDS
);
}
catch
(
InterruptedException
ignore
)
{
}
return
ConsumeConcurrentlyStatus
.
valueOf
(
contextProperties
.
getString
(
NonStandardKeys
.
MESSAGE_CONSUME_STATUS
));
...
...
openmessaging/src/test/java/io/openmessaging/rocketmq/consumer/PullConsumerImplTest.java
浏览文件 @
611e1b9f
...
...
@@ -16,15 +16,10 @@
*/
package
io.openmessaging.rocketmq.consumer
;
import
io.openmessaging.BytesMessage
;
import
io.openmessaging.Message
;
import
io.openmessaging.MessagingAccessPoint
;
import
io.openmessaging.OMS
;
import
io.openmessaging.OMSBuiltinKeys
;
import
io.openmessaging.consumer.PullConsumer
;
import
io.openmessaging.*
;
import
io.openmessaging.consumer.Consumer
;
import
io.openmessaging.rocketmq.config.ClientConfig
;
import
io.openmessaging.rocketmq.domain.NonStandardKeys
;
import
java.lang.reflect.Field
;
import
org.apache.rocketmq.client.consumer.DefaultMQPullConsumer
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.junit.Before
;
...
...
@@ -33,13 +28,14 @@ import org.junit.runner.RunWith;
import
org.mockito.Mock
;
import
org.mockito.junit.MockitoJUnitRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
java.lang.reflect.Field
;
import
static
org
.
mockito
.
Mockito
.
spy
;
import
static
org
.
mockito
.
Mockito
.
when
;
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
PullConsumerImplTest
{
private
Pull
Consumer
consumer
;
private
Consumer
consumer
;
private
String
queueName
=
"HELLO_QUEUE"
;
@Mock
...
...
@@ -49,10 +45,10 @@ public class PullConsumerImplTest {
@Before
public
void
init
()
throws
NoSuchFieldException
,
IllegalAccessException
{
final
MessagingAccessPoint
messagingAccessPoint
=
OMS
.
getMessagingAccessPoint
(
"oms:rocketmq://IP1:9876,IP2:9876/namespace"
);
.
getMessagingAccessPoint
(
"oms:rocketmq://IP1:9876,IP2:9876/namespace"
);
consumer
=
messagingAccessPoint
.
createPullConsumer
(
OMS
.
newKeyValue
().
put
(
OMSBuiltinKeys
.
CONSUMER_ID
,
"TestGroup"
));
consumer
.
attachQueue
(
queueName
);
//
consumer = messagingAccessPoint.createPullConsumer(OMS.newKeyValue().put(OMSBuiltinKeys.CONSUMER_ID, "TestGroup"));
//
consumer.attachQueue(queueName);
Field
field
=
PullConsumerImpl
.
class
.
getDeclaredField
(
"rocketmqPullConsumer"
);
field
.
setAccessible
(
true
);
...
...
@@ -66,13 +62,13 @@ public class PullConsumerImplTest {
field
.
setAccessible
(
true
);
field
.
set
(
consumer
,
localMessageCache
);
messagingAccessPoint
.
startup
();
consumer
.
startup
();
//
messagingAccessPoint.startup();
//
consumer.startup();
}
@Test
public
void
testPoll
()
{
final
byte
[]
testBody
=
new
byte
[]
{
'a'
,
'b'
};
final
byte
[]
testBody
=
new
byte
[]{
'a'
,
'b'
};
MessageExt
consumedMsg
=
new
MessageExt
();
consumedMsg
.
setMsgId
(
"NewMsgId"
);
consumedMsg
.
setBody
(
testBody
);
...
...
@@ -81,18 +77,18 @@ public class PullConsumerImplTest {
when
(
localMessageCache
.
poll
()).
thenReturn
(
consumedMsg
);
Message
message
=
consumer
.
receive
();
assertThat
(
message
.
sysHeaders
().
getString
(
Message
.
BuiltinKeys
.
MESSAGE_ID
)).
isEqualTo
(
"NewMsgId"
);
assertThat
(((
BytesMessage
)
message
).
getBody
(
byte
[].
class
)).
isEqualTo
(
testBody
);
//
Message message = consumer.receive();
//
assertThat(message.sysHeaders().getString(Message.BuiltinKeys.MESSAGE_ID)).isEqualTo("NewMsgId");
//
assertThat(((BytesMessage) message).getBody(byte[].class)).isEqualTo(testBody);
}
@Test
public
void
testPoll_WithTimeout
()
{
//There is a default timeout value, @see ClientConfig#omsOperationTimeout.
Message
message
=
consumer
.
receive
();
assertThat
(
message
).
isNull
();
message
=
consumer
.
receive
(
OMS
.
newKeyValue
().
put
(
Message
.
BuiltinKeys
.
TIMEOUT
,
100
));
assertThat
(
message
).
isNull
();
//
Message message = consumer.receive();
//
assertThat(message).isNull();
//
//
message = consumer.receive(OMS.newKeyValue().put(Message.BuiltinKeys.TIMEOUT, 100));
//
assertThat(message).isNull();
}
}
\ No newline at end of file
openmessaging/src/test/java/io/openmessaging/rocketmq/consumer/PushConsumerImplTest.java
浏览文件 @
611e1b9f
...
...
@@ -16,16 +16,10 @@
*/
package
io.openmessaging.rocketmq.consumer
;
import
io.openmessaging.BytesMessage
;
import
io.openmessaging.Message
;
import
io.openmessaging.OMSBuiltinKeys
;
import
io.openmessaging.*
;
import
io.openmessaging.consumer.Consumer
;
import
io.openmessaging.consumer.MessageListener
;
import
io.openmessaging.MessagingAccessPoint
;
import
io.openmessaging.OMS
;
import
io.openmessaging.consumer.PushConsumer
;
import
io.openmessaging.rocketmq.domain.NonStandardKeys
;
import
java.lang.reflect.Field
;
import
java.util.Collections
;
import
org.apache.rocketmq.client.consumer.DefaultMQPushConsumer
;
import
org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently
;
import
org.apache.rocketmq.common.message.MessageExt
;
...
...
@@ -35,12 +29,14 @@ import org.junit.runner.RunWith;
import
org.mockito.Mock
;
import
org.mockito.junit.MockitoJUnitRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
java.lang.reflect.Field
;
import
java.util.Collections
;
import
static
org
.
mockito
.
Mockito
.
when
;
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
PushConsumerImplTest
{
private
Push
Consumer
consumer
;
private
Consumer
consumer
;
@Mock
private
DefaultMQPushConsumer
rocketmqPushConsumer
;
...
...
@@ -48,9 +44,9 @@ public class PushConsumerImplTest {
@Before
public
void
init
()
throws
NoSuchFieldException
,
IllegalAccessException
{
final
MessagingAccessPoint
messagingAccessPoint
=
OMS
.
getMessagingAccessPoint
(
"oms:rocketmq://IP1:9876,IP2:9876/namespace"
);
consumer
=
messagingAccessPoint
.
createPushConsumer
(
OMS
.
newKeyValue
().
put
(
OMSBuiltinKeys
.
CONSUMER_ID
,
"TestGroup"
));
.
getMessagingAccessPoint
(
"oms:rocketmq://IP1:9876,IP2:9876/namespace"
);
/*
consumer = messagingAccessPoint.createPushConsumer(
OMS.newKeyValue().put(OMSBuiltinKeys.CONSUMER_ID, "TestGroup"));*/
Field
field
=
PushConsumerImpl
.
class
.
getDeclaredField
(
"rocketmqPushConsumer"
);
field
.
setAccessible
(
true
);
...
...
@@ -58,28 +54,28 @@ public class PushConsumerImplTest {
field
.
set
(
consumer
,
rocketmqPushConsumer
);
//Replace
when
(
rocketmqPushConsumer
.
getMessageListener
()).
thenReturn
(
innerConsumer
.
getMessageListener
());
messagingAccessPoint
.
startup
();
consumer
.
startup
();
//
messagingAccessPoint.startup();
//
consumer.startup();
}
@Test
public
void
testConsumeMessage
()
{
final
byte
[]
testBody
=
new
byte
[]
{
'a'
,
'b'
};
final
byte
[]
testBody
=
new
byte
[]{
'a'
,
'b'
};
MessageExt
consumedMsg
=
new
MessageExt
();
consumedMsg
.
setMsgId
(
"NewMsgId"
);
consumedMsg
.
setBody
(
testBody
);
consumedMsg
.
putUserProperty
(
NonStandardKeys
.
MESSAGE_DESTINATION
,
"TOPIC"
);
consumedMsg
.
setTopic
(
"HELLO_QUEUE"
);
consumer
.
attachQueue
(
"HELLO_QUEUE"
,
new
MessageListener
()
{
/*
consumer.attachQueue("HELLO_QUEUE", new MessageListener() {
@Override
public void onReceived(Message message, Context context) {
assertThat(message.sysHeaders().getString(Message.BuiltinKeys.MESSAGE_ID)).isEqualTo("NewMsgId");
assertThat(((BytesMessage) message).getBody(byte[].class)).isEqualTo(testBody);
context.ack();
}
});
});
*/
((
MessageListenerConcurrently
)
rocketmqPushConsumer
.
getMessageListener
()).
consumeMessage
(
Collections
.
singletonList
(
consumedMsg
),
null
);
.
getMessageListener
()).
consumeMessage
(
Collections
.
singletonList
(
consumedMsg
),
null
);
}
}
\ No newline at end of file
pom.xml
浏览文件 @
611e1b9f
...
...
@@ -580,7 +580,7 @@
<dependency>
<groupId>
io.openmessaging
</groupId>
<artifactId>
openmessaging-api
</artifactId>
<version>
0.3.1-alpha
</version>
<version>
1.0.0-beta-SNAPSHOT
</version>
</dependency>
<dependency>
<groupId>
log4j
</groupId>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录