fix attachments of async sample (#410)

diff --git a/dubbo-samples-async/dubbo-samples-async-original-future/case-versions.conf b/dubbo-samples-async/dubbo-samples-async-original-future/case-versions.conf
index 0e26c8b..d718a9f 100644
--- a/dubbo-samples-async/dubbo-samples-async-original-future/case-versions.conf
+++ b/dubbo-samples-async/dubbo-samples-async-original-future/case-versions.conf
@@ -20,5 +20,5 @@
 # Supported component versions of the test case
 
 # Spring app
-dubbo.version=2.7*, 3.*
+dubbo.version=3.*
 spring.version=4.*, 5.*
diff --git a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/AsyncConsumer.java b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/AsyncConsumer.java
index 7d8f3c4..82d5d2c 100644
--- a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/AsyncConsumer.java
+++ b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/AsyncConsumer.java
@@ -40,10 +40,9 @@
         RpcContext.getContext().setAttachment("consumer-key1", "consumer-value1");
 
         CompletableFuture<String> future = asyncService.sayHello("async call request");
-        RpcContext savedServerContext = RpcContext.getServerContext();
         CountDownLatch latch = new CountDownLatch(1);
         future.whenComplete((v, t) -> {
-            System.out.println((String) savedServerContext.getAttachment("server-key1"));
+            System.out.println((String) RpcContext.getServerContext().getAttachment("server-key1"));
             if (t != null) {
                 logger.warn("Exception: ", t);
             } else {
diff --git a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/filter/LegacyListenableFilter.java b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/filter/LegacyListenableFilter.java
index 370feb2..f879ebf 100644
--- a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/filter/LegacyListenableFilter.java
+++ b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/filter/LegacyListenableFilter.java
@@ -44,7 +44,7 @@
         if (StringUtils.isEmpty(filters)) {
             filters = "";
         }
-        filters += " legacy-block-filter";
+        filters += " legacy-listenable-filter";
         context.setAttachment("filters", filters);
 
         return invoker.invoke(invocation);
diff --git a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/impl/AsyncServiceImpl.java b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/impl/AsyncServiceImpl.java
index c3e4395..f810277 100644
--- a/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/impl/AsyncServiceImpl.java
+++ b/dubbo-samples-async/dubbo-samples-async-original-future/src/main/java/org/apache/dubbo/samples/async/impl/AsyncServiceImpl.java
@@ -19,7 +19,9 @@
 
 package org.apache.dubbo.samples.async.impl;
 
+import org.apache.dubbo.rpc.AsyncContext;
 import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcContextAttachment;
 import org.apache.dubbo.samples.async.api.AsyncService;
 
 import org.slf4j.Logger;
@@ -32,16 +34,20 @@
 
     @Override
     public CompletableFuture<String> sayHello(String name) {
-        RpcContext savedContext = RpcContext.getContext();
-        RpcContext savedServerContext = RpcContext.getServerContext();
+        // If attachments and context are going to be used in the new thread, startAsync() and signalContextSwitch() must be called.
+        // Otherwise, it is not necessary to call these two methods.
+        AsyncContext asyncContext = RpcContext.startAsync();
         return CompletableFuture.supplyAsync(() -> {
-            String received = (String) savedContext.getAttachment("consumer-key1");
+            asyncContext.signalContextSwitch();
+            RpcContextAttachment attachmentFromClient = RpcContext.getServerAttachment();
+            RpcContextAttachment attachmentToClient = RpcContext.getServerContext();
+            String received = (String) attachmentFromClient.getAttachment("consumer-key1");
             logger.info("consumer-key1 from attachment: " + received);
-            savedServerContext.setAttachment("server-key1", "server-" + received);
+            attachmentToClient.setAttachment("server-key1", "server-" + received);
 
-            received = (String) savedContext.getAttachment("filters");
+            received = (String) attachmentFromClient.getAttachment("filters");
             logger.info("filters from attachment: " + received);
-            savedServerContext.setAttachment("filters", received);
+            attachmentToClient.setAttachment("filters", received);
             try {
                 Thread.sleep(10000);
             } catch (InterruptedException e) {