Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Apache RocketMQ
Rocketmq
提交
9edeb4ec
R
Rocketmq
项目概览
Apache RocketMQ
/
Rocketmq
上一次同步 大约 3 年
通知
267
Star
16139
Fork
68
代码
文件
提交
分支
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看板
未验证
提交
9edeb4ec
编写于
8月 22, 2019
作者:
H
Heng Du
提交者:
GitHub
8月 22, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1386 from apache/litePullConsumer
[ISSUE #1388]Add lite pull consumer support for RocketMQ
上级
90ae1167
67751d81
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
2668 addition
and
38 deletion
+2668
-38
client/src/main/java/org/apache/rocketmq/client/ClientConfig.java
...rc/main/java/org/apache/rocketmq/client/ClientConfig.java
+16
-2
client/src/main/java/org/apache/rocketmq/client/Validators.java
.../src/main/java/org/apache/rocketmq/client/Validators.java
+6
-3
client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java
...che/rocketmq/client/consumer/DefaultLitePullConsumer.java
+414
-0
client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java
...pache/rocketmq/client/consumer/DefaultMQPullConsumer.java
+5
-1
client/src/main/java/org/apache/rocketmq/client/consumer/LitePullConsumer.java
...org/apache/rocketmq/client/consumer/LitePullConsumer.java
+175
-0
client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java
...a/org/apache/rocketmq/client/consumer/MQPullConsumer.java
+1
-0
client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java
...cketmq/client/consumer/MQPullConsumerScheduleService.java
+4
-2
client/src/main/java/org/apache/rocketmq/client/consumer/TopicMessageQueueChangeListener.java
...etmq/client/consumer/TopicMessageQueueChangeListener.java
+30
-0
client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java
...cketmq/client/consumer/store/RemoteBrokerOffsetStore.java
+19
-23
client/src/main/java/org/apache/rocketmq/client/impl/consumer/AssignedMessageQueue.java
...e/rocketmq/client/impl/consumer/AssignedMessageQueue.java
+241
-0
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
...tmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
+1074
-0
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
...ketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
+6
-1
client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java
...rg/apache/rocketmq/client/impl/consumer/ProcessQueue.java
+2
-0
client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
...g/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
+3
-1
client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java
.../rocketmq/client/impl/consumer/RebalanceLitePullImpl.java
+82
-0
client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java
...apache/rocketmq/client/impl/factory/MQClientInstance.java
+0
-4
client/src/test/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumerTest.java
...rocketmq/client/consumer/DefaultLitePullConsumerTest.java
+496
-0
example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java
...a/org/apache/rocketmq/example/broadcast/PushConsumer.java
+1
-1
example/src/main/java/org/apache/rocketmq/example/simple/LitePullConsumerAssign.java
...pache/rocketmq/example/simple/LitePullConsumerAssign.java
+53
-0
example/src/main/java/org/apache/rocketmq/example/simple/LitePullConsumerSubscribe.java
...he/rocketmq/example/simple/LitePullConsumerSubscribe.java
+40
-0
未找到文件。
client/src/main/java/org/apache/rocketmq/client/ClientConfig.java
浏览文件 @
9edeb4ec
...
...
@@ -16,7 +16,9 @@
*/
package
org.apache.rocketmq.client
;
import
java.util.Collection
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.Set
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.rocketmq.common.UtilAll
;
...
...
@@ -95,7 +97,6 @@ public class ClientConfig {
}
}
public
String
withNamespace
(
String
resource
)
{
return
NamespaceUtil
.
wrapNamespace
(
this
.
getNamespace
(),
resource
);
}
...
...
@@ -124,9 +125,21 @@ public class ClientConfig {
if
(
StringUtils
.
isEmpty
(
this
.
getNamespace
()))
{
return
queue
;
}
return
new
MessageQueue
(
withNamespace
(
queue
.
getTopic
()),
queue
.
getBrokerName
(),
queue
.
getQueueId
());
}
public
Collection
<
MessageQueue
>
queuesWithNamespace
(
Collection
<
MessageQueue
>
queues
)
{
if
(
StringUtils
.
isEmpty
(
this
.
getNamespace
()))
{
return
queues
;
}
Iterator
<
MessageQueue
>
iter
=
queues
.
iterator
();
while
(
iter
.
hasNext
())
{
MessageQueue
queue
=
iter
.
next
();
queue
.
setTopic
(
withNamespace
(
queue
.
getTopic
()));
}
return
queues
;
}
public
void
resetClientConfig
(
final
ClientConfig
cc
)
{
this
.
namesrvAddr
=
cc
.
namesrvAddr
;
this
.
clientIP
=
cc
.
clientIP
;
...
...
@@ -170,6 +183,7 @@ public class ClientConfig {
/**
* Domain name mode access way does not support the delimiter(;), and only one domain name can be set.
*
* @param namesrvAddr name server address
*/
public
void
setNamesrvAddr
(
String
namesrvAddr
)
{
...
...
client/src/main/java/org/apache/rocketmq/client/Validators.java
浏览文件 @
9edeb4ec
...
...
@@ -53,14 +53,17 @@ public class Validators {
if
(
UtilAll
.
isBlank
(
group
))
{
throw
new
MQClientException
(
"the specified group is blank"
,
null
);
}
if
(
group
.
length
()
>
CHARACTER_MAX_LENGTH
)
{
throw
new
MQClientException
(
"the specified group is longer than group max length 255."
,
null
);
}
if
(!
regularExpressionMatcher
(
group
,
PATTERN
))
{
throw
new
MQClientException
(
String
.
format
(
"the specified group[%s] contains illegal characters, allowing only %s"
,
group
,
VALID_PATTERN_STR
),
null
);
}
if
(
group
.
length
()
>
CHARACTER_MAX_LENGTH
)
{
throw
new
MQClientException
(
"the specified group is longer than group max length 255."
,
null
);
}
}
/**
...
...
client/src/main/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumer.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.client.consumer
;
import
java.util.Collection
;
import
java.util.List
;
import
org.apache.rocketmq.client.ClientConfig
;
import
org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely
;
import
org.apache.rocketmq.client.consumer.store.OffsetStore
;
import
org.apache.rocketmq.client.exception.MQClientException
;
import
org.apache.rocketmq.client.impl.consumer.DefaultLitePullConsumerImpl
;
import
org.apache.rocketmq.common.MixAll
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.apache.rocketmq.common.message.MessageQueue
;
import
org.apache.rocketmq.common.protocol.heartbeat.MessageModel
;
import
org.apache.rocketmq.remoting.RPCHook
;
public
class
DefaultLitePullConsumer
extends
ClientConfig
implements
LitePullConsumer
{
private
final
DefaultLitePullConsumerImpl
defaultLitePullConsumerImpl
;
/**
* Consumers belonging to the same consumer group share a group id. The consumers in a group then
* divides the topic as fairly amongst themselves as possible by establishing that each queue is only
* consumed by a single consumer from the group. If all consumers are from the same group, it functions
* as a traditional message queue. Each message would be consumed by one consumer of the group only.
* When multiple consumer groups exist, the flow of the data consumption model aligns with the traditional
* publish-subscribe model. The messages are broadcast to all consumer groups.
*/
private
String
consumerGroup
;
/**
* Long polling mode, the Consumer connection max suspend time, it is not recommended to modify
*/
private
long
brokerSuspendMaxTimeMillis
=
1000
*
20
;
/**
* Long polling mode, the Consumer connection timeout(must greater than brokerSuspendMaxTimeMillis), it is not
* recommended to modify
*/
private
long
consumerTimeoutMillisWhenSuspend
=
1000
*
30
;
/**
* The socket timeout in milliseconds
*/
private
long
consumerPullTimeoutMillis
=
1000
*
10
;
/**
* Consumption pattern,default is clustering
*/
private
MessageModel
messageModel
=
MessageModel
.
CLUSTERING
;
/**
* Message queue listener
*/
private
MessageQueueListener
messageQueueListener
;
/**
* Offset Storage
*/
private
OffsetStore
offsetStore
;
/**
* Queue allocation algorithm
*/
private
AllocateMessageQueueStrategy
allocateMessageQueueStrategy
=
new
AllocateMessageQueueAveragely
();
/**
* Whether the unit of subscription group
*/
private
boolean
unitMode
=
false
;
/**
* The flag for auto commit offset
*/
private
boolean
autoCommit
=
true
;
/**
* Pull thread number
*/
private
int
pullThreadNums
=
20
;
/**
* Maximum commit offset interval time in milliseconds.
*/
private
long
autoCommitIntervalMillis
=
5
*
1000
;
/**
* Maximum number of messages pulled each time.
*/
private
int
pullBatchSize
=
10
;
/**
* Flow control threshold for consume request, each consumer will cache at most 10000 consume requests by default.
* Consider the {@code pullBatchSize}, the instantaneous value may exceed the limit
*/
private
long
pullThresholdForAll
=
10000
;
/**
* Consume max span offset.
*/
private
int
consumeMaxSpan
=
2000
;
/**
* Flow control threshold on queue level, each message queue will cache at most 1000 messages by default, Consider
* the {@code pullBatchSize}, the instantaneous value may exceed the limit
*/
private
int
pullThresholdForQueue
=
1000
;
/**
* Limit the cached message size on queue level, each message queue will cache at most 100 MiB messages by default,
* Consider the {@code pullBatchSize}, the instantaneous value may exceed the limit
*
* <p>
* The size of a message only measured by message body, so it's not accurate
*/
private
int
pullThresholdSizeForQueue
=
100
;
/**
* The poll timeout in milliseconds
*/
private
long
pollTimeoutMillis
=
1000
*
5
;
/**
* Interval time in in milliseconds for checking changes in topic metadata.
*/
private
long
topicMetadataCheckIntervalMillis
=
30
*
1000
;
/**
* Default constructor.
*/
public
DefaultLitePullConsumer
()
{
this
(
null
,
MixAll
.
DEFAULT_CONSUMER_GROUP
,
null
);
}
/**
* Constructor specifying consumer group.
*
* @param consumerGroup Consumer group.
*/
public
DefaultLitePullConsumer
(
final
String
consumerGroup
)
{
this
(
null
,
consumerGroup
,
null
);
}
/**
* Constructor specifying RPC hook.
*
* @param rpcHook RPC hook to execute before each remoting command.
*/
public
DefaultLitePullConsumer
(
RPCHook
rpcHook
)
{
this
(
null
,
MixAll
.
DEFAULT_CONSUMER_GROUP
,
rpcHook
);
}
/**
* Constructor specifying consumer group, RPC hook
*
* @param consumerGroup Consumer group.
* @param rpcHook RPC hook to execute before each remoting command.
*/
public
DefaultLitePullConsumer
(
final
String
consumerGroup
,
RPCHook
rpcHook
)
{
this
(
null
,
consumerGroup
,
rpcHook
);
}
/**
* Constructor specifying namespace, consumer group and RPC hook.
*
* @param consumerGroup Consumer group.
* @param rpcHook RPC hook to execute before each remoting command.
*/
public
DefaultLitePullConsumer
(
final
String
namespace
,
final
String
consumerGroup
,
RPCHook
rpcHook
)
{
this
.
namespace
=
namespace
;
this
.
consumerGroup
=
consumerGroup
;
defaultLitePullConsumerImpl
=
new
DefaultLitePullConsumerImpl
(
this
,
rpcHook
);
}
@Override
public
void
start
()
throws
MQClientException
{
this
.
defaultLitePullConsumerImpl
.
start
();
}
@Override
public
void
shutdown
()
{
this
.
defaultLitePullConsumerImpl
.
shutdown
();
}
@Override
public
void
subscribe
(
String
topic
,
String
subExpression
)
throws
MQClientException
{
this
.
defaultLitePullConsumerImpl
.
subscribe
(
withNamespace
(
topic
),
subExpression
);
}
@Override
public
void
subscribe
(
String
topic
,
MessageSelector
messageSelector
)
throws
MQClientException
{
this
.
defaultLitePullConsumerImpl
.
subscribe
(
withNamespace
(
topic
),
messageSelector
);
}
@Override
public
void
unsubscribe
(
String
topic
)
{
this
.
defaultLitePullConsumerImpl
.
unsubscribe
(
withNamespace
(
topic
));
}
@Override
public
void
assign
(
Collection
<
MessageQueue
>
messageQueues
)
{
defaultLitePullConsumerImpl
.
assign
(
queuesWithNamespace
(
messageQueues
));
}
@Override
public
List
<
MessageExt
>
poll
()
{
return
defaultLitePullConsumerImpl
.
poll
(
this
.
getPollTimeoutMillis
());
}
@Override
public
List
<
MessageExt
>
poll
(
long
timeout
)
{
return
defaultLitePullConsumerImpl
.
poll
(
timeout
);
}
@Override
public
void
seek
(
MessageQueue
messageQueue
,
long
offset
)
throws
MQClientException
{
this
.
defaultLitePullConsumerImpl
.
seek
(
queueWithNamespace
(
messageQueue
),
offset
);
}
@Override
public
void
pause
(
Collection
<
MessageQueue
>
messageQueues
)
{
this
.
defaultLitePullConsumerImpl
.
pause
(
queuesWithNamespace
(
messageQueues
));
}
@Override
public
void
resume
(
Collection
<
MessageQueue
>
messageQueues
)
{
this
.
defaultLitePullConsumerImpl
.
resume
(
queuesWithNamespace
(
messageQueues
));
}
@Override
public
Collection
<
MessageQueue
>
fetchMessageQueues
(
String
topic
)
throws
MQClientException
{
return
this
.
defaultLitePullConsumerImpl
.
fetchMessageQueues
(
withNamespace
(
topic
));
}
@Override
public
Long
offsetForTimestamp
(
MessageQueue
messageQueue
,
Long
timestamp
)
throws
MQClientException
{
return
this
.
defaultLitePullConsumerImpl
.
searchOffset
(
queueWithNamespace
(
messageQueue
),
timestamp
);
}
@Override
public
void
registerTopicMessageQueueChangeListener
(
String
topic
,
TopicMessageQueueChangeListener
topicMessageQueueChangeListener
)
throws
MQClientException
{
this
.
defaultLitePullConsumerImpl
.
registerTopicMessageQueueChangeListener
(
withNamespace
(
topic
),
topicMessageQueueChangeListener
);
}
@Override
public
void
commitSync
()
{
this
.
defaultLitePullConsumerImpl
.
commitSync
();
}
@Override
public
Long
committed
(
MessageQueue
messageQueue
)
throws
MQClientException
{
return
this
.
defaultLitePullConsumerImpl
.
committed
(
messageQueue
);
}
@Override
public
boolean
isAutoCommit
()
{
return
autoCommit
;
}
@Override
public
void
setAutoCommit
(
boolean
autoCommit
)
{
this
.
autoCommit
=
autoCommit
;
}
public
int
getPullThreadNums
()
{
return
pullThreadNums
;
}
public
void
setPullThreadNums
(
int
pullThreadNums
)
{
this
.
pullThreadNums
=
pullThreadNums
;
}
public
long
getAutoCommitIntervalMillis
()
{
return
autoCommitIntervalMillis
;
}
public
void
setAutoCommitIntervalMillis
(
long
autoCommitIntervalMillis
)
{
this
.
autoCommitIntervalMillis
=
autoCommitIntervalMillis
;
}
public
int
getPullBatchSize
()
{
return
pullBatchSize
;
}
public
void
setPullBatchSize
(
int
pullBatchSize
)
{
this
.
pullBatchSize
=
pullBatchSize
;
}
public
long
getPullThresholdForAll
()
{
return
pullThresholdForAll
;
}
public
void
setPullThresholdForAll
(
long
pullThresholdForAll
)
{
this
.
pullThresholdForAll
=
pullThresholdForAll
;
}
public
int
getConsumeMaxSpan
()
{
return
consumeMaxSpan
;
}
public
void
setConsumeMaxSpan
(
int
consumeMaxSpan
)
{
this
.
consumeMaxSpan
=
consumeMaxSpan
;
}
public
int
getPullThresholdForQueue
()
{
return
pullThresholdForQueue
;
}
public
void
setPullThresholdForQueue
(
int
pullThresholdForQueue
)
{
this
.
pullThresholdForQueue
=
pullThresholdForQueue
;
}
public
int
getPullThresholdSizeForQueue
()
{
return
pullThresholdSizeForQueue
;
}
public
void
setPullThresholdSizeForQueue
(
int
pullThresholdSizeForQueue
)
{
this
.
pullThresholdSizeForQueue
=
pullThresholdSizeForQueue
;
}
public
AllocateMessageQueueStrategy
getAllocateMessageQueueStrategy
()
{
return
allocateMessageQueueStrategy
;
}
public
void
setAllocateMessageQueueStrategy
(
AllocateMessageQueueStrategy
allocateMessageQueueStrategy
)
{
this
.
allocateMessageQueueStrategy
=
allocateMessageQueueStrategy
;
}
public
long
getBrokerSuspendMaxTimeMillis
()
{
return
brokerSuspendMaxTimeMillis
;
}
public
long
getPollTimeoutMillis
()
{
return
pollTimeoutMillis
;
}
public
void
setPollTimeoutMillis
(
long
pollTimeoutMillis
)
{
this
.
pollTimeoutMillis
=
pollTimeoutMillis
;
}
public
OffsetStore
getOffsetStore
()
{
return
offsetStore
;
}
public
void
setOffsetStore
(
OffsetStore
offsetStore
)
{
this
.
offsetStore
=
offsetStore
;
}
public
boolean
isUnitMode
()
{
return
unitMode
;
}
public
void
setUnitMode
(
boolean
isUnitMode
)
{
this
.
unitMode
=
isUnitMode
;
}
public
MessageModel
getMessageModel
()
{
return
messageModel
;
}
public
void
setMessageModel
(
MessageModel
messageModel
)
{
this
.
messageModel
=
messageModel
;
}
public
String
getConsumerGroup
()
{
return
consumerGroup
;
}
public
MessageQueueListener
getMessageQueueListener
()
{
return
messageQueueListener
;
}
public
void
setMessageQueueListener
(
MessageQueueListener
messageQueueListener
)
{
this
.
messageQueueListener
=
messageQueueListener
;
}
public
long
getConsumerPullTimeoutMillis
()
{
return
consumerPullTimeoutMillis
;
}
public
void
setConsumerPullTimeoutMillis
(
long
consumerPullTimeoutMillis
)
{
this
.
consumerPullTimeoutMillis
=
consumerPullTimeoutMillis
;
}
public
long
getConsumerTimeoutMillisWhenSuspend
()
{
return
consumerTimeoutMillisWhenSuspend
;
}
public
void
setConsumerTimeoutMillisWhenSuspend
(
long
consumerTimeoutMillisWhenSuspend
)
{
this
.
consumerTimeoutMillisWhenSuspend
=
consumerTimeoutMillisWhenSuspend
;
}
public
long
getTopicMetadataCheckIntervalMillis
()
{
return
topicMetadataCheckIntervalMillis
;
}
public
void
setTopicMetadataCheckIntervalMillis
(
long
topicMetadataCheckIntervalMillis
)
{
this
.
topicMetadataCheckIntervalMillis
=
topicMetadataCheckIntervalMillis
;
}
}
client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPullConsumer.java
浏览文件 @
9edeb4ec
...
...
@@ -35,9 +35,13 @@ import org.apache.rocketmq.remoting.RPCHook;
import
org.apache.rocketmq.remoting.exception.RemotingException
;
/**
* Default pulling consumer
* Default pulling consumer.
* This class will be removed in 2022, and a better implementation {@link DefaultLitePullConsumer} is recommend to use
* in the scenario of actively pulling messages.
*/
@Deprecated
public
class
DefaultMQPullConsumer
extends
ClientConfig
implements
MQPullConsumer
{
protected
final
transient
DefaultMQPullConsumerImpl
defaultMQPullConsumerImpl
;
/**
...
...
client/src/main/java/org/apache/rocketmq/client/consumer/LitePullConsumer.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.client.consumer
;
import
java.util.Collection
;
import
java.util.List
;
import
org.apache.rocketmq.client.exception.MQClientException
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.apache.rocketmq.common.message.MessageQueue
;
public
interface
LitePullConsumer
{
/**
* Start the consumer
*/
void
start
()
throws
MQClientException
;
/**
* Shutdown the consumer
*/
void
shutdown
();
/**
* Subscribe some topic with subExpression
*
* @param subExpression subscription expression.it only support or operation such as "tag1 || tag2 || tag3" <br> if
* null or * expression,meaning subscribe all
* @throws MQClientException if there is any client error.
*/
void
subscribe
(
final
String
topic
,
final
String
subExpression
)
throws
MQClientException
;
/**
* Subscribe some topic with selector.
*
* @param selector message selector({@link MessageSelector}), can be null.
* @throws MQClientException if there is any client error.
*/
void
subscribe
(
final
String
topic
,
final
MessageSelector
selector
)
throws
MQClientException
;
/**
* Unsubscribe consumption some topic
*
* @param topic Message topic that needs to be unsubscribe.
*/
void
unsubscribe
(
final
String
topic
);
/**
* Manually assign a list of message queues to this consumer. This interface does not allow for incremental
* assignment and will replace the previous assignment (if there is one).
*
* @param messageQueues Message queues that needs to be assigned.
*/
void
assign
(
Collection
<
MessageQueue
>
messageQueues
);
/**
* Fetch data for the topics or partitions specified using assign API
*
* @return list of message, can be null.
*/
List
<
MessageExt
>
poll
();
/**
* Fetch data for the topics or partitions specified using assign API
*
* @param timeout The amount time, in milliseconds, spent waiting in poll if data is not available. Must not be
* negative
* @return list of message, can be null.
*/
List
<
MessageExt
>
poll
(
long
timeout
);
/**
* Overrides the fetch offsets that the consumer will use on the next poll. If this API is invoked for the same
* message queue more than once, the latest offset will be used on the next poll(). Note that you may lose data if
* this API is arbitrarily used in the middle of consumption.
*
* @param messageQueue
* @param offset
*/
void
seek
(
MessageQueue
messageQueue
,
long
offset
)
throws
MQClientException
;
/**
* Suspend pulling from the requested message queues.
*
* Because of the implementation of pre-pull, fetch data in {@link #poll()} will not stop immediately until the
* messages of the requested message queues drain.
*
* Note that this method does not affect message queue subscription. In particular, it does not cause a group
* rebalance.
*
* @param messageQueues Message queues that needs to be paused.
*/
void
pause
(
Collection
<
MessageQueue
>
messageQueues
);
/**
* Resume specified message queues which have been paused with {@link #pause(Collection)}.
*
* @param messageQueues Message queues that needs to be resumed.
*/
void
resume
(
Collection
<
MessageQueue
>
messageQueues
);
/**
* Whether to enable auto-commit consume offset.
*
* @return true if enable auto-commit, false if disable auto-commit.
*/
boolean
isAutoCommit
();
/**
* Set whether to enable auto-commit consume offset.
*
* @param autoCommit Whether to enable auto-commit.
*/
void
setAutoCommit
(
boolean
autoCommit
);
/**
* Get metadata about the message queues for a given topic.
*
* @param topic The topic that need to get metadata.
* @return collection of message queues
* @throws MQClientException if there is any client error.
*/
Collection
<
MessageQueue
>
fetchMessageQueues
(
String
topic
)
throws
MQClientException
;
/**
* Look up the offsets for the given message queue by timestamp. The returned offset for each message queue is the
* earliest offset whose timestamp is greater than or equal to the given timestamp in the corresponding message
* queue.
*
* @param messageQueue Message queues that needs to get offset by timestamp.
* @param timestamp
* @return offset
* @throws MQClientException if there is any client error.
*/
Long
offsetForTimestamp
(
MessageQueue
messageQueue
,
Long
timestamp
)
throws
MQClientException
;
/**
* Manually commit consume offset.
*/
void
commitSync
();
/**
* Get the last committed offset for the given message queue.
*
* @param messageQueue
* @return offset, if offset equals -1 means no offset in broker.
* @throws MQClientException if there is any client error.
*/
Long
committed
(
MessageQueue
messageQueue
)
throws
MQClientException
;
/**
* Register a callback for sensing topic metadata changes.
*
* @param topic The topic that need to monitor.
* @param topicMessageQueueChangeListener Callback when topic metadata changes, refer {@link
* TopicMessageQueueChangeListener}
* @throws MQClientException if there is any client error.
*/
void
registerTopicMessageQueueChangeListener
(
String
topic
,
TopicMessageQueueChangeListener
topicMessageQueueChangeListener
)
throws
MQClientException
;
}
client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumer.java
浏览文件 @
9edeb4ec
...
...
@@ -169,4 +169,5 @@ public interface MQPullConsumer extends MQConsumer {
*/
void
sendMessageBack
(
MessageExt
msg
,
int
delayLevel
,
String
brokerName
,
String
consumerGroup
)
throws
RemotingException
,
MQBrokerException
,
InterruptedException
,
MQClientException
;
}
client/src/main/java/org/apache/rocketmq/client/consumer/MQPullConsumerScheduleService.java
浏览文件 @
9edeb4ec
...
...
@@ -32,7 +32,9 @@ import org.apache.rocketmq.logging.InternalLogger;
import
org.apache.rocketmq.remoting.RPCHook
;
/**
* Schedule service for pull consumer
* Schedule service for pull consumer.
* This Consumer will be removed in 2022, and a better implementation {@link
* DefaultLitePullConsumer} is recommend to use in the scenario of actively pulling messages.
*/
public
class
MQPullConsumerScheduleService
{
private
final
InternalLogger
log
=
ClientLogger
.
getLog
();
...
...
@@ -157,7 +159,7 @@ public class MQPullConsumerScheduleService {
}
}
class
PullTaskImpl
implements
Runnable
{
public
class
PullTaskImpl
implements
Runnable
{
private
final
MessageQueue
messageQueue
;
private
volatile
boolean
cancelled
=
false
;
...
...
client/src/main/java/org/apache/rocketmq/client/consumer/TopicMessageQueueChangeListener.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.client.consumer
;
import
java.util.Set
;
import
org.apache.rocketmq.common.message.MessageQueue
;
public
interface
TopicMessageQueueChangeListener
{
/**
* This method will be invoked in the condition of queue numbers changed, These scenarios occur when the topic is
* expanded or shrunk.
*
* @param messageQueues
*/
void
onChanged
(
String
topic
,
Set
<
MessageQueue
>
messageQueues
);
}
client/src/main/java/org/apache/rocketmq/client/consumer/store/RemoteBrokerOffsetStore.java
浏览文件 @
9edeb4ec
...
...
@@ -117,25 +117,24 @@ public class RemoteBrokerOffsetStore implements OffsetStore {
return
;
final
HashSet
<
MessageQueue
>
unusedMQ
=
new
HashSet
<
MessageQueue
>();
if
(!
mqs
.
isEmpty
())
{
for
(
Map
.
Entry
<
MessageQueue
,
AtomicLong
>
entry
:
this
.
offsetTable
.
entrySet
())
{
MessageQueue
mq
=
entry
.
getKey
();
AtomicLong
offset
=
entry
.
getValue
();
if
(
offset
!=
null
)
{
if
(
mqs
.
contains
(
mq
))
{
try
{
this
.
updateConsumeOffsetToBroker
(
mq
,
offset
.
get
());
log
.
info
(
"[persistAll] Group: {} ClientId: {} updateConsumeOffsetToBroker {} {}"
,
this
.
groupName
,
this
.
mQClientFactory
.
getClientId
(),
mq
,
offset
.
get
());
}
catch
(
Exception
e
)
{
log
.
error
(
"updateConsumeOffsetToBroker exception, "
+
mq
.
toString
(),
e
);
}
}
else
{
unusedMQ
.
add
(
mq
);
for
(
Map
.
Entry
<
MessageQueue
,
AtomicLong
>
entry
:
this
.
offsetTable
.
entrySet
())
{
MessageQueue
mq
=
entry
.
getKey
();
AtomicLong
offset
=
entry
.
getValue
();
if
(
offset
!=
null
)
{
if
(
mqs
.
contains
(
mq
))
{
try
{
this
.
updateConsumeOffsetToBroker
(
mq
,
offset
.
get
());
log
.
info
(
"[persistAll] Group: {} ClientId: {} updateConsumeOffsetToBroker {} {}"
,
this
.
groupName
,
this
.
mQClientFactory
.
getClientId
(),
mq
,
offset
.
get
());
}
catch
(
Exception
e
)
{
log
.
error
(
"updateConsumeOffsetToBroker exception, "
+
mq
.
toString
(),
e
);
}
}
else
{
unusedMQ
.
add
(
mq
);
}
}
}
...
...
@@ -187,8 +186,7 @@ public class RemoteBrokerOffsetStore implements OffsetStore {
}
/**
* Update the Consumer Offset in one way, once the Master is off, updated to Slave,
* here need to be optimized.
* Update the Consumer Offset in one way, once the Master is off, updated to Slave, here need to be optimized.
*/
private
void
updateConsumeOffsetToBroker
(
MessageQueue
mq
,
long
offset
)
throws
RemotingException
,
MQBrokerException
,
InterruptedException
,
MQClientException
{
...
...
@@ -196,15 +194,13 @@ public class RemoteBrokerOffsetStore implements OffsetStore {
}
/**
* Update the Consumer Offset synchronously, once the Master is off, updated to Slave,
* here need to be optimized.
* Update the Consumer Offset synchronously, once the Master is off, updated to Slave, here need to be optimized.
*/
@Override
public
void
updateConsumeOffsetToBroker
(
MessageQueue
mq
,
long
offset
,
boolean
isOneway
)
throws
RemotingException
,
MQBrokerException
,
InterruptedException
,
MQClientException
{
FindBrokerResult
findBrokerResult
=
this
.
mQClientFactory
.
findBrokerAddressInAdmin
(
mq
.
getBrokerName
());
if
(
null
==
findBrokerResult
)
{
this
.
mQClientFactory
.
updateTopicRouteInfoFromNameServer
(
mq
.
getTopic
());
findBrokerResult
=
this
.
mQClientFactory
.
findBrokerAddressInAdmin
(
mq
.
getBrokerName
());
}
...
...
client/src/main/java/org/apache/rocketmq/client/impl/consumer/AssignedMessageQueue.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.client.impl.consumer
;
import
java.util.Collection
;
import
java.util.Iterator
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.ConcurrentHashMap
;
import
org.apache.rocketmq.common.message.MessageQueue
;
public
class
AssignedMessageQueue
{
private
final
ConcurrentHashMap
<
MessageQueue
,
MessageQueueState
>
assignedMessageQueueState
;
private
RebalanceImpl
rebalanceImpl
;
public
AssignedMessageQueue
()
{
assignedMessageQueueState
=
new
ConcurrentHashMap
<
MessageQueue
,
MessageQueueState
>();
}
public
void
setRebalanceImpl
(
RebalanceImpl
rebalanceImpl
)
{
this
.
rebalanceImpl
=
rebalanceImpl
;
}
public
Set
<
MessageQueue
>
messageQueues
()
{
return
assignedMessageQueueState
.
keySet
();
}
public
boolean
isPaused
(
MessageQueue
messageQueue
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
return
messageQueueState
.
isPaused
();
}
return
true
;
}
public
void
pause
(
Collection
<
MessageQueue
>
messageQueues
)
{
for
(
MessageQueue
messageQueue
:
messageQueues
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
assignedMessageQueueState
.
get
(
messageQueue
)
!=
null
)
{
messageQueueState
.
setPaused
(
true
);
}
}
}
public
void
resume
(
Collection
<
MessageQueue
>
messageQueueCollection
)
{
for
(
MessageQueue
messageQueue
:
messageQueueCollection
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
assignedMessageQueueState
.
get
(
messageQueue
)
!=
null
)
{
messageQueueState
.
setPaused
(
false
);
}
}
}
public
ProcessQueue
getProcessQueue
(
MessageQueue
messageQueue
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
return
messageQueueState
.
getProcessQueue
();
}
return
null
;
}
public
long
getPullOffset
(
MessageQueue
messageQueue
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
return
messageQueueState
.
getPullOffset
();
}
return
-
1
;
}
public
void
updatePullOffset
(
MessageQueue
messageQueue
,
long
offset
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
messageQueueState
.
setPullOffset
(
offset
);
}
}
public
long
getConusmerOffset
(
MessageQueue
messageQueue
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
return
messageQueueState
.
getConsumeOffset
();
}
return
-
1
;
}
public
void
updateConsumeOffset
(
MessageQueue
messageQueue
,
long
offset
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
messageQueueState
.
setConsumeOffset
(
offset
);
}
}
public
void
setSeekOffset
(
MessageQueue
messageQueue
,
long
offset
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
messageQueueState
.
setSeekOffset
(
offset
);
}
}
public
long
getSeekOffset
(
MessageQueue
messageQueue
)
{
MessageQueueState
messageQueueState
=
assignedMessageQueueState
.
get
(
messageQueue
);
if
(
messageQueueState
!=
null
)
{
return
messageQueueState
.
getSeekOffset
();
}
return
-
1
;
}
public
void
updateAssignedMessageQueue
(
String
topic
,
Collection
<
MessageQueue
>
assigned
)
{
synchronized
(
this
.
assignedMessageQueueState
)
{
Iterator
<
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>>
it
=
this
.
assignedMessageQueueState
.
entrySet
().
iterator
();
while
(
it
.
hasNext
())
{
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>
next
=
it
.
next
();
if
(
next
.
getKey
().
getTopic
().
equals
(
topic
))
{
if
(!
assigned
.
contains
(
next
.
getKey
()))
{
next
.
getValue
().
getProcessQueue
().
setDropped
(
true
);
it
.
remove
();
}
}
}
addAssignedMessageQueue
(
assigned
);
}
}
public
void
updateAssignedMessageQueue
(
Collection
<
MessageQueue
>
assigned
)
{
synchronized
(
this
.
assignedMessageQueueState
)
{
Iterator
<
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>>
it
=
this
.
assignedMessageQueueState
.
entrySet
().
iterator
();
while
(
it
.
hasNext
())
{
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>
next
=
it
.
next
();
if
(!
assigned
.
contains
(
next
.
getKey
()))
{
next
.
getValue
().
getProcessQueue
().
setDropped
(
true
);
it
.
remove
();
}
}
addAssignedMessageQueue
(
assigned
);
}
}
private
void
addAssignedMessageQueue
(
Collection
<
MessageQueue
>
assigned
)
{
for
(
MessageQueue
messageQueue
:
assigned
)
{
if
(!
this
.
assignedMessageQueueState
.
containsKey
(
messageQueue
))
{
MessageQueueState
messageQueueState
;
if
(
rebalanceImpl
!=
null
&&
rebalanceImpl
.
getProcessQueueTable
().
get
(
messageQueue
)
!=
null
)
{
messageQueueState
=
new
MessageQueueState
(
messageQueue
,
rebalanceImpl
.
getProcessQueueTable
().
get
(
messageQueue
));
}
else
{
ProcessQueue
processQueue
=
new
ProcessQueue
();
messageQueueState
=
new
MessageQueueState
(
messageQueue
,
processQueue
);
}
this
.
assignedMessageQueueState
.
put
(
messageQueue
,
messageQueueState
);
}
}
}
public
void
removeAssignedMessageQueue
(
String
topic
)
{
synchronized
(
this
.
assignedMessageQueueState
)
{
Iterator
<
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>>
it
=
this
.
assignedMessageQueueState
.
entrySet
().
iterator
();
while
(
it
.
hasNext
())
{
Map
.
Entry
<
MessageQueue
,
MessageQueueState
>
next
=
it
.
next
();
if
(
next
.
getKey
().
getTopic
().
equals
(
topic
))
{
it
.
remove
();
}
}
}
}
private
class
MessageQueueState
{
private
MessageQueue
messageQueue
;
private
ProcessQueue
processQueue
;
private
volatile
boolean
paused
=
false
;
private
volatile
long
pullOffset
=
-
1
;
private
volatile
long
consumeOffset
=
-
1
;
private
volatile
long
seekOffset
=
-
1
;
private
MessageQueueState
(
MessageQueue
messageQueue
,
ProcessQueue
processQueue
)
{
this
.
messageQueue
=
messageQueue
;
this
.
processQueue
=
processQueue
;
}
public
MessageQueue
getMessageQueue
()
{
return
messageQueue
;
}
public
void
setMessageQueue
(
MessageQueue
messageQueue
)
{
this
.
messageQueue
=
messageQueue
;
}
public
boolean
isPaused
()
{
return
paused
;
}
public
void
setPaused
(
boolean
paused
)
{
this
.
paused
=
paused
;
}
public
long
getPullOffset
()
{
return
pullOffset
;
}
public
void
setPullOffset
(
long
pullOffset
)
{
this
.
pullOffset
=
pullOffset
;
}
public
ProcessQueue
getProcessQueue
()
{
return
processQueue
;
}
public
void
setProcessQueue
(
ProcessQueue
processQueue
)
{
this
.
processQueue
=
processQueue
;
}
public
long
getConsumeOffset
()
{
return
consumeOffset
;
}
public
void
setConsumeOffset
(
long
consumeOffset
)
{
this
.
consumeOffset
=
consumeOffset
;
}
public
long
getSeekOffset
()
{
return
seekOffset
;
}
public
void
setSeekOffset
(
long
seekOffset
)
{
this
.
seekOffset
=
seekOffset
;
}
}
}
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java
0 → 100644
浏览文件 @
9edeb4ec
此差异已折叠。
点击以展开。
client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPullConsumerImpl.java
浏览文件 @
9edeb4ec
...
...
@@ -66,6 +66,11 @@ import org.apache.rocketmq.remoting.RPCHook;
import
org.apache.rocketmq.remoting.common.RemotingHelper
;
import
org.apache.rocketmq.remoting.exception.RemotingException
;
/**
* This class will be removed in 2022, and a better implementation {@link DefaultLitePullConsumerImpl} is recommend to use
* in the scenario of actively pulling messages.
*/
@Deprecated
public
class
DefaultMQPullConsumerImpl
implements
MQConsumerInner
{
private
final
InternalLogger
log
=
ClientLogger
.
getLog
();
private
final
DefaultMQPullConsumer
defaultMQPullConsumer
;
...
...
@@ -74,7 +79,7 @@ public class DefaultMQPullConsumerImpl implements MQConsumerInner {
private
final
ArrayList
<
ConsumeMessageHook
>
consumeMessageHookList
=
new
ArrayList
<
ConsumeMessageHook
>();
private
final
ArrayList
<
FilterMessageHook
>
filterMessageHookList
=
new
ArrayList
<
FilterMessageHook
>();
private
volatile
ServiceState
serviceState
=
ServiceState
.
CREATE_JUST
;
pr
ivate
MQClientInstance
mQClientFactory
;
pr
otected
MQClientInstance
mQClientFactory
;
private
PullAPIWrapper
pullAPIWrapper
;
private
OffsetStore
offsetStore
;
private
RebalanceImpl
rebalanceImpl
=
new
RebalancePullImpl
(
this
);
...
...
client/src/main/java/org/apache/rocketmq/client/impl/consumer/ProcessQueue.java
浏览文件 @
9edeb4ec
...
...
@@ -26,6 +26,7 @@ import java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReadWriteLock
;
import
java.util.concurrent.locks.ReentrantLock
;
import
java.util.concurrent.locks.ReentrantReadWriteLock
;
import
org.apache.rocketmq.client.consumer.DefaultMQPushConsumer
;
import
org.apache.rocketmq.client.log.ClientLogger
;
import
org.apache.rocketmq.logging.InternalLogger
;
...
...
@@ -431,4 +432,5 @@ public class ProcessQueue {
public
void
setLastConsumeTimestamp
(
long
lastConsumeTimestamp
)
{
this
.
lastConsumeTimestamp
=
lastConsumeTimestamp
;
}
}
client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java
浏览文件 @
9edeb4ec
...
...
@@ -41,8 +41,10 @@ import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import
org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData
;
/**
* Base class for rebalance algorithm
* This class will be removed in 2022, and a better implementation {@link RebalanceLitePullImpl} is recommend to use
* in the scenario of actively pulling messages.
*/
@Deprecated
public
abstract
class
RebalanceImpl
{
protected
static
final
InternalLogger
log
=
ClientLogger
.
getLog
();
protected
final
ConcurrentMap
<
MessageQueue
,
ProcessQueue
>
processQueueTable
=
new
ConcurrentHashMap
<
MessageQueue
,
ProcessQueue
>(
64
);
...
...
client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.client.impl.consumer
;
import
org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy
;
import
org.apache.rocketmq.client.consumer.MessageQueueListener
;
import
org.apache.rocketmq.client.impl.factory.MQClientInstance
;
import
org.apache.rocketmq.common.message.MessageQueue
;
import
org.apache.rocketmq.common.protocol.heartbeat.ConsumeType
;
import
org.apache.rocketmq.common.protocol.heartbeat.MessageModel
;
import
java.util.List
;
import
java.util.Set
;
public
class
RebalanceLitePullImpl
extends
RebalanceImpl
{
private
final
DefaultLitePullConsumerImpl
litePullConsumerImpl
;
public
RebalanceLitePullImpl
(
DefaultLitePullConsumerImpl
litePullConsumerImpl
)
{
this
(
null
,
null
,
null
,
null
,
litePullConsumerImpl
);
}
public
RebalanceLitePullImpl
(
String
consumerGroup
,
MessageModel
messageModel
,
AllocateMessageQueueStrategy
allocateMessageQueueStrategy
,
MQClientInstance
mQClientFactory
,
DefaultLitePullConsumerImpl
litePullConsumerImpl
)
{
super
(
consumerGroup
,
messageModel
,
allocateMessageQueueStrategy
,
mQClientFactory
);
this
.
litePullConsumerImpl
=
litePullConsumerImpl
;
}
@Override
public
void
messageQueueChanged
(
String
topic
,
Set
<
MessageQueue
>
mqAll
,
Set
<
MessageQueue
>
mqDivided
)
{
MessageQueueListener
messageQueueListener
=
this
.
litePullConsumerImpl
.
getDefaultLitePullConsumer
().
getMessageQueueListener
();
if
(
messageQueueListener
!=
null
)
{
try
{
messageQueueListener
.
messageQueueChanged
(
topic
,
mqAll
,
mqDivided
);
}
catch
(
Throwable
e
)
{
log
.
error
(
"messageQueueChanged exception"
,
e
);
}
}
}
@Override
public
boolean
removeUnnecessaryMessageQueue
(
MessageQueue
mq
,
ProcessQueue
pq
)
{
this
.
litePullConsumerImpl
.
getOffsetStore
().
persist
(
mq
);
this
.
litePullConsumerImpl
.
getOffsetStore
().
removeOffset
(
mq
);
return
true
;
}
@Override
public
ConsumeType
consumeType
()
{
return
ConsumeType
.
CONSUME_ACTIVELY
;
}
@Override
public
void
removeDirtyOffset
(
final
MessageQueue
mq
)
{
this
.
litePullConsumerImpl
.
getOffsetStore
().
removeOffset
(
mq
);
}
@Override
public
long
computePullFromWhere
(
MessageQueue
mq
)
{
return
0
;
}
@Override
public
void
dispatchPullRequest
(
List
<
PullRequest
>
pullRequestList
)
{
}
}
client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java
浏览文件 @
9edeb4ec
...
...
@@ -246,10 +246,6 @@ public class MQClientInstance {
log
.
info
(
"the client factory [{}] start OK"
,
this
.
clientId
);
this
.
serviceState
=
ServiceState
.
RUNNING
;
break
;
case
RUNNING:
break
;
case
SHUTDOWN_ALREADY:
break
;
case
START_FAILED:
throw
new
MQClientException
(
"The Factory object["
+
this
.
getClientId
()
+
"] has been created before, and failed."
,
null
);
default
:
...
...
client/src/test/java/org/apache/rocketmq/client/consumer/DefaultLitePullConsumerTest.java
0 → 100644
浏览文件 @
9edeb4ec
此差异已折叠。
点击以展开。
example/src/main/java/org/apache/rocketmq/example/broadcast/PushConsumer.java
浏览文件 @
9edeb4ec
...
...
@@ -50,4 +50,4 @@ public class PushConsumer {
consumer
.
start
();
System
.
out
.
printf
(
"Broadcast Consumer Started.%n"
);
}
}
}
\ No newline at end of file
example/src/main/java/org/apache/rocketmq/example/simple/LitePullConsumerAssign.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.example.simple
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
org.apache.rocketmq.client.consumer.DefaultLitePullConsumer
;
import
org.apache.rocketmq.common.message.MessageExt
;
import
org.apache.rocketmq.common.message.MessageQueue
;
public
class
LitePullConsumerAssign
{
public
static
volatile
boolean
running
=
true
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
DefaultLitePullConsumer
litePullConsumer
=
new
DefaultLitePullConsumer
(
"please_rename_unique_group_name"
);
litePullConsumer
.
setAutoCommit
(
false
);
litePullConsumer
.
start
();
Collection
<
MessageQueue
>
mqSet
=
litePullConsumer
.
fetchMessageQueues
(
"TopicTest"
);
List
<
MessageQueue
>
list
=
new
ArrayList
<>(
mqSet
);
List
<
MessageQueue
>
assignList
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
list
.
size
()
/
2
;
i
++)
{
assignList
.
add
(
list
.
get
(
i
));
}
litePullConsumer
.
assign
(
assignList
);
litePullConsumer
.
seek
(
assignList
.
get
(
0
),
10
);
try
{
while
(
running
)
{
List
<
MessageExt
>
messageExts
=
litePullConsumer
.
poll
();
System
.
out
.
printf
(
"%s %n"
,
messageExts
);
litePullConsumer
.
commitSync
();
}
}
finally
{
litePullConsumer
.
shutdown
();
}
}
}
example/src/main/java/org/apache/rocketmq/example/simple/LitePullConsumerSubscribe.java
0 → 100644
浏览文件 @
9edeb4ec
/*
* 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
org.apache.rocketmq.example.simple
;
import
java.util.List
;
import
org.apache.rocketmq.client.consumer.DefaultLitePullConsumer
;
import
org.apache.rocketmq.common.message.MessageExt
;
public
class
LitePullConsumerSubscribe
{
public
static
volatile
boolean
running
=
true
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
DefaultLitePullConsumer
litePullConsumer
=
new
DefaultLitePullConsumer
(
"please_rename_unique_group_name"
);
litePullConsumer
.
subscribe
(
"TopicTest"
,
"*"
);
litePullConsumer
.
start
();
try
{
while
(
running
)
{
List
<
MessageExt
>
messageExts
=
litePullConsumer
.
poll
();
System
.
out
.
printf
(
"%s%n"
,
messageExts
);
}
}
finally
{
litePullConsumer
.
shutdown
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录