diff --git a/config/graceful_shutdown.go b/config/graceful_shutdown.go
index 8787cb5ac65bf69750c6294500478734d9557f75..8cf4083eb5b068e5df2a76310082d24542bbdbf1 100644
--- a/config/graceful_shutdown.go
+++ b/config/graceful_shutdown.go
@@ -110,9 +110,9 @@ func BeforeShutdown() {
 	// If this application is not the provider, it will do nothing
 	destroyProviderProtocols()
 
-	// waiting for accepted requests to be processed.
+	// reject sending the new request, and waiting for response of sending requests
+	waitForSendingRequests()
 
-	// after this step, the response from other providers will be rejected.
 	// If this application is not the consumer, it will do nothing
 	destroyConsumerProtocols()
 
@@ -134,7 +134,10 @@ func destroyConsumerProtocols() {
 	if consumerConfig == nil || consumerConfig.ProtocolConf == nil {
 		return
 	}
-	destroyProtocols(consumerConfig.ProtocolConf)
+	protocols := consumerConfig.ProtocolConf.(map[interface{}]interface{})
+	for name, _ := range protocols {
+		extension.GetProtocol(name.(string)).Destroy()
+	}
 }
 
 /**
@@ -148,13 +151,21 @@ func destroyProviderProtocols() {
 	if providerConfig == nil || providerConfig.ProtocolConf == nil {
 		return
 	}
-	destroyProtocols(providerConfig.ProtocolConf)
-}
 
-func destroyProtocols(protocolConf interface{}) {
-	protocols := protocolConf.(map[interface{}]interface{})
+	consumerProtocol := make(map[string]interface{}, 0)
+	if consumerConfig != nil && consumerConfig.ProtocolConf != nil {
+		consumerProtocol = consumerConfig.ProtocolConf.(map[string]interface{})
+	}
+
+	protocols := providerConfig.ProtocolConf.(map[string]interface{})
 	for name, _ := range protocols {
-		extension.GetProtocol(name.(string)).Destroy()
+		_, found := consumerProtocol[name]
+
+		// the protocol is the consumer's protocol, we can not destroy it.
+		if found {
+			continue
+		}
+		extension.GetProtocol(name).Destroy()
 	}
 }
 
@@ -185,7 +196,7 @@ func waitForReceivingRequests() {
 }
 
 // for consumer. It will wait for the response of sending requests
-func waitForSendingRequests()  {
+func waitForSendingRequests() {
 	logger.Info("Graceful shutdown --- Keep waiting until sending requests getting response or timeout ")
 	if consumerConfig == nil || consumerConfig.ShutdownConfig == nil {
 		// ignore this step