mirror of
https://github.com/apache/rocketmq.git
synced 2026-09-21 05:44:03 +08:00
[ISSUE #3906] Mark stream-related request by RequestType
This commit is contained in:
@@ -28,6 +28,7 @@ import org.apache.rocketmq.common.utils.NameServerAddressUtils;
|
||||
import org.apache.rocketmq.remoting.common.RemotingUtil;
|
||||
import org.apache.rocketmq.remoting.netty.TlsSystemConfig;
|
||||
import org.apache.rocketmq.remoting.protocol.LanguageCode;
|
||||
import org.apache.rocketmq.remoting.protocol.RequestType;
|
||||
|
||||
/**
|
||||
* Client Common configuration
|
||||
@@ -65,6 +66,12 @@ public class ClientConfig {
|
||||
|
||||
private LanguageCode language = LanguageCode.JAVA;
|
||||
|
||||
/**
|
||||
* Enable stream request type will inject a RPCHook to add corresponding request type to remoting layer.
|
||||
* And it will also generate a different client id to prevent unexpected reuses of MQClientInstance.
|
||||
*/
|
||||
protected boolean enableStreamRequestType = false;
|
||||
|
||||
public String buildMQClientId() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(this.getClientIP());
|
||||
@@ -76,6 +83,11 @@ public class ClientConfig {
|
||||
sb.append(this.unitName);
|
||||
}
|
||||
|
||||
if (enableStreamRequestType) {
|
||||
sb.append("@");
|
||||
sb.append(RequestType.STREAM);
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@@ -160,6 +172,7 @@ public class ClientConfig {
|
||||
this.namespace = cc.namespace;
|
||||
this.language = cc.language;
|
||||
this.mqClientApiTimeout = cc.mqClientApiTimeout;
|
||||
this.enableStreamRequestType = cc.enableStreamRequestType;
|
||||
}
|
||||
|
||||
public ClientConfig cloneClientConfig() {
|
||||
@@ -179,6 +192,7 @@ public class ClientConfig {
|
||||
cc.namespace = namespace;
|
||||
cc.language = language;
|
||||
cc.mqClientApiTimeout = mqClientApiTimeout;
|
||||
cc.enableStreamRequestType = enableStreamRequestType;
|
||||
return cc;
|
||||
}
|
||||
|
||||
@@ -318,12 +332,21 @@ public class ClientConfig {
|
||||
this.mqClientApiTimeout = mqClientApiTimeout;
|
||||
}
|
||||
|
||||
public boolean isEnableStreamRequestType() {
|
||||
return enableStreamRequestType;
|
||||
}
|
||||
|
||||
public void setEnableStreamRequestType(boolean enableStreamRequestType) {
|
||||
this.enableStreamRequestType = enableStreamRequestType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ClientConfig [namesrvAddr=" + namesrvAddr + ", clientIP=" + clientIP + ", instanceName=" + instanceName
|
||||
+ ", clientCallbackExecutorThreads=" + clientCallbackExecutorThreads + ", pollNameServerInterval=" + pollNameServerInterval
|
||||
+ ", heartbeatBrokerInterval=" + heartbeatBrokerInterval + ", persistConsumerOffsetInterval=" + persistConsumerOffsetInterval
|
||||
+ ", pullTimeDelayMillsWhenException=" + pullTimeDelayMillsWhenException + ", unitMode=" + unitMode + ", unitName=" + unitName + ", vipChannelEnabled="
|
||||
+ vipChannelEnabled + ", useTLS=" + useTLS + ", language=" + language.name() + ", namespace=" + namespace + ", mqClientApiTimeout=" + mqClientApiTimeout + "]";
|
||||
+ vipChannelEnabled + ", useTLS=" + useTLS + ", language=" + language.name() + ", namespace=" + namespace + ", mqClientApiTimeout=" + mqClientApiTimeout
|
||||
+ ", enableStreamRequestType=" + enableStreamRequestType + "]";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,6 +220,7 @@ public class DefaultLitePullConsumer extends ClientConfig implements LitePullCon
|
||||
public DefaultLitePullConsumer(final String namespace, final String consumerGroup, RPCHook rpcHook) {
|
||||
this.namespace = namespace;
|
||||
this.consumerGroup = consumerGroup;
|
||||
this.enableStreamRequestType = true;
|
||||
defaultLitePullConsumerImpl = new DefaultLitePullConsumerImpl(this, rpcHook);
|
||||
}
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ public class DefaultMQPullConsumer extends ClientConfig implements MQPullConsume
|
||||
public DefaultMQPullConsumer(final String namespace, final String consumerGroup, RPCHook rpcHook) {
|
||||
this.namespace = namespace;
|
||||
this.consumerGroup = consumerGroup;
|
||||
this.enableStreamRequestType = true;
|
||||
defaultMQPullConsumerImpl = new DefaultMQPullConsumerImpl(this, rpcHook);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package org.apache.rocketmq.client.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
@@ -152,6 +153,7 @@ import org.apache.rocketmq.common.protocol.header.namesrv.WipeWritePermOfBrokerR
|
||||
import org.apache.rocketmq.common.protocol.heartbeat.HeartbeatData;
|
||||
import org.apache.rocketmq.common.protocol.heartbeat.SubscriptionData;
|
||||
import org.apache.rocketmq.common.protocol.route.TopicRouteData;
|
||||
import org.apache.rocketmq.common.rpchook.StreamTypeRPCHook;
|
||||
import org.apache.rocketmq.common.subscription.SubscriptionGroupConfig;
|
||||
import org.apache.rocketmq.logging.InternalLogger;
|
||||
import org.apache.rocketmq.remoting.InvokeCallback;
|
||||
@@ -169,7 +171,6 @@ import org.apache.rocketmq.remoting.netty.ResponseFuture;
|
||||
import org.apache.rocketmq.remoting.protocol.LanguageCode;
|
||||
import org.apache.rocketmq.remoting.protocol.RemotingCommand;
|
||||
import org.apache.rocketmq.remoting.protocol.RemotingSerializable;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
public class MQClientAPIImpl {
|
||||
|
||||
@@ -195,6 +196,10 @@ public class MQClientAPIImpl {
|
||||
this.remotingClient = new NettyRemotingClient(nettyClientConfig, null);
|
||||
this.clientRemotingProcessor = clientRemotingProcessor;
|
||||
|
||||
// Inject stream rpc hook first to make reserve field signature
|
||||
if (clientConfig.isEnableStreamRequestType()) {
|
||||
this.remotingClient.registerRPCHook(new StreamTypeRPCHook());
|
||||
}
|
||||
this.remotingClient.registerRPCHook(rpcHook);
|
||||
this.remotingClient.registerProcessor(RequestCode.CHECK_TRANSACTION_STATE, this.clientRemotingProcessor, null);
|
||||
|
||||
|
||||
@@ -89,6 +89,7 @@ public class MixAll {
|
||||
public static final String REPLY_MESSAGE_FLAG = "reply";
|
||||
public static final String LMQ_PREFIX = "%LMQ%";
|
||||
public static final String MULTI_DISPATCH_QUEUE_SPLITTER = ",";
|
||||
public static final String REQ_T = "ReqT";
|
||||
private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
|
||||
|
||||
public static String getWSAddr() {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.common.rpchook;
|
||||
|
||||
import org.apache.rocketmq.common.MixAll;
|
||||
import org.apache.rocketmq.remoting.RPCHook;
|
||||
import org.apache.rocketmq.remoting.protocol.RemotingCommand;
|
||||
import org.apache.rocketmq.remoting.protocol.RequestType;
|
||||
|
||||
public class StreamTypeRPCHook implements RPCHook {
|
||||
@Override public void doBeforeRequest(String remoteAddr, RemotingCommand request) {
|
||||
request.addExtField(MixAll.REQ_T, String.valueOf(RequestType.STREAM.getCode()));
|
||||
}
|
||||
|
||||
@Override public void doAfterResponse(String remoteAddr, RemotingCommand request,
|
||||
RemotingCommand response) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.remoting.protocol;
|
||||
|
||||
public enum RequestType {
|
||||
STREAM((byte) 0);
|
||||
|
||||
private final byte code;
|
||||
|
||||
RequestType(byte code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public static RequestType valueOf(byte code) {
|
||||
for (RequestType requestType : RequestType.values()) {
|
||||
if (requestType.getCode() == code) {
|
||||
return requestType;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public byte getCode() {
|
||||
return code;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user