Spring MVC-তে Asynchronous Request Handling (অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং) হল একটি প্রক্রিয়া যেখানে সার্ভার ক্লায়েন্টের রিকোয়েস্টের জন্য অপেক্ষা না করে অন্যান্য কাজ করতে পারে। এটি বিশেষত দীর্ঘ সময় ধরে চলা কাজের জন্য উপকারী, যেমন ডেটাবেস থেকে বড় ডেটা আহরণ করা, বড় ফাইল আপলোড করা, বা থার্ড-পার্টি API কল করা। অ্যাসিনক্রোনাস প্রসেসিং সার্ভারের সম্পদ ব্যবস্থাপনা উন্নত করে এবং ক্লায়েন্টের জন্য দ্রুত প্রতিক্রিয়া প্রদান করে।
Spring MVC অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং এর জন্য @Async
, DeferredResult
, এবং Callable
এর মতো টুলস প্রদান করে।
Callable
ব্যবহার করে Asynchronous Request HandlingSpring MVC 3.2 এ Callable
ইন্টারফেসটি আনা হয়, যা অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং সম্ভব করে তোলে। Callable
ব্যবহারের মাধ্যমে, একটি রিকোয়েস্ট কন্ট্রোলারের মেথডে সম্পূর্ণভাবে প্রক্রিয়া না হওয়া পর্যন্ত ব্লক করবে না, বরং তা অ্যাসিনক্রোনাসভাবে প্রসেস হবে এবং পরবর্তীতে রেসপন্স ফেরত যাবে।
Callable
ব্যবহার করে অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিংController:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Callable;
@RestController
public class AsyncController {
@GetMapping("/async")
public Callable<String> handleAsyncRequest() {
return () -> {
// Simulating a long-running process
Thread.sleep(5000); // Sleep for 5 seconds to simulate a delay
return "Hello, this is an asynchronous response!";
};
}
}
এখানে, Callable
রিকোয়েস্ট হ্যান্ডলারের কাজ শেষ না হওয়া পর্যন্ত এটি সার্ভারের থ্রেড ব্লক করবে না। Spring MVC এটি অ্যাসিনক্রোনাসভাবে পরিচালনা করে এবং অবশেষে রেসপন্স প্রদান করে।
Key Points:
Callable
: এটি একটি ইন্টারফেস যা অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং করতে ব্যবহৃত হয়।DeferredResult
ব্যবহার করে Asynchronous Request HandlingDeferredResult
Spring MVC 3.2 তে ব্যবহৃত আরেকটি শক্তিশালী টুল, যা অ্যাসিনক্রোনাস প্রসেসিং প্রদান করে এবং ফলাফলটি সময়মত রিটার্ন না হওয়া পর্যন্ত ক্লায়েন্ট অপেক্ষা করতে পারে। এটি সাধারণত এক্সটার্নাল সার্ভিস বা সময়সাপেক্ষ প্রসেসিংয়ের জন্য ব্যবহৃত হয়।
DeferredResult
ব্যবহার করে অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিংController:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
@RestController
public class DeferredResultController {
@GetMapping("/deferred")
public DeferredResult<String> handleDeferredRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// Simulating a time-consuming task
new Thread(() -> {
try {
Thread.sleep(5000); // Sleep for 5 seconds to simulate a delay
deferredResult.setResult("This is an asynchronous response using DeferredResult!");
} catch (InterruptedException e) {
deferredResult.setErrorResult("Error occurred while processing the request.");
}
}).start();
return deferredResult;
}
}
এখানে, DeferredResult
একটি অ্যাসিনক্রোনাস রিকোয়েস্টের জন্য ব্যবহার করা হয়েছে যা প্রধান থ্রেডকে ব্লক না করে অন্য একটি থ্রেডে কাজটি চালাতে সাহায্য করে। রিকোয়েস্ট প্রক্রিয়া সম্পন্ন হওয়ার পর setResult()
মেথডের মাধ্যমে রেসপন্সটি ফেরত পাঠানো হয়।
Key Points:
DeferredResult
ব্যবহার করে দীর্ঘ সময় নেওয়া কাজের জন্য ক্লায়েন্টকে অপেক্ষা করতে বলা হয়।@Async
ব্যবহার করে Asynchronous Processing@Async
হল Spring Framework-এর একটি অ্যানোটেশন যা মেথড বা ক্লাসকে অ্যাসিনক্রোনাস প্রক্রিয়াকরণে রূপান্তরিত করে। এটি সাধারণত দীর্ঘ-running প্রসেসিংয়ের জন্য ব্যবহৃত হয়, যাতে থ্রেড ব্লক না হয় এবং দ্রুত প্রতিক্রিয়া প্রদান করা যায়।
Spring MVC তে @Async
ব্যবহার করে আপনি অ্যাসিনক্রোনাস কাজের জন্য স্পেসিফিক মেথড বা পুরো ক্লাসকে অ্যাসিনক্রোনাস করতে পারেন।
@Async
ব্যবহার করে অ্যাসিনক্রোনাস কাজController:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AsyncServiceController {
@GetMapping("/async-service")
public String handleRequest() {
asyncService.processAsyncTask();
return "Request is being processed asynchronously";
}
@Async
public void processAsyncTask() {
try {
// Simulating a long-running task
Thread.sleep(5000);
System.out.println("Async Task completed!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
এখানে @Async
ব্যবহারের মাধ্যমে processAsyncTask
মেথডটি অ্যাসিনক্রোনাসভাবে কার্যকর করা হচ্ছে। মেথডটি নিজে একটি নতুন থ্রেডে কাজটি সম্পন্ন করবে, যার ফলে মূল থ্রেড ব্লক হবে না।
Key Points:
@Async
ব্যবহার করে একটি মেথডকে অ্যাসিনক্রোনাস করা যায়।TaskExecutor
ব্যবহার করে থ্রেডগুলি পরিচালনা করে।Spring MVC অ্যাসিনক্রোনাস রিকোয়েস্ট হ্যান্ডলিং কাজ করার জন্য আপনার অ্যাপ্লিকেশনে অ্যাসিনক্রোনাস প্রসেসিং কনফিগার করতে হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
এখানে, ThreadPoolTaskExecutor
ব্যবহৃত হয়েছে অ্যাসিনক্রোনাস কাজের জন্য থ্রেড পুল কনফিগার করতে।
Spring MVC তে Asynchronous Request Handling ব্যবহার করা অ্যাপ্লিকেশনকে আরও দক্ষ, দ্রুত এবং স্কেলযোগ্য করে তোলে। Callable
, DeferredResult
, এবং @Async
তিনটি পদ্ধতিই অ্যাসিনক্রোনাস কাজের জন্য ব্যবহৃত হয় এবং এগুলির মাধ্যমে Spring MVC অ্যাপ্লিকেশন অ্যাসিনক্রোনাস রিকোয়েস্ট ও রেসপন্স হ্যান্ডল করতে সক্ষম হয়। এতে সার্ভার ব্লক হয় না এবং ক্লায়েন্টের জন্য দ্রুত প্রতিক্রিয়া প্রদান করা যায়, বিশেষত বড় ডেটা প্রসেসিং বা এক্সটার্নাল API কলের ক্ষেত্রে।
Asynchronous Request Handling Spring MVC তে একটি প্রক্রিয়া যা রিকোয়েস্ট প্রক্রিয়া এবং রেসপন্স তৈরির সময় ব্লক না হয়ে প্রসেসিং করা হয়। সাধারণ HTTP রিকোয়েস্টে, সার্ভার ক্লায়েন্টের রিকোয়েস্ট সম্পূর্ণভাবে প্রক্রিয়া না করা পর্যন্ত অপেক্ষা করে থাকে, কিন্তু Asynchronous রিকোয়েস্ট হ্যান্ডলিং-এর মাধ্যমে, সার্ভার রিকোয়েস্ট প্রক্রিয়া করার সময় অন্যান্য রিকোয়েস্ট গ্রহণ করতে পারে এবং দীর্ঘ চলমান কাজের জন্য অপেক্ষা না করে কেবল ফলাফল প্রদান করতে পারে।
এটি সাধারণত ওয়েব অ্যাপ্লিকেশনে বড় পরিমাণের ডেটা বা সময়সাপেক্ষ কাজ প্রক্রিয়া করার সময় ব্যবহৃত হয়, যেখানে সার্ভারকে দীর্ঘ সময় অপেক্ষা করতে হবে এবং এভাবে রিকোয়েস্ট প্রক্রিয়াকরণের দক্ষতা বৃদ্ধি পায়।
Spring MVC তে Asynchronous Request Handling সক্ষম করতে, @Async
অ্যানোটেশন এবং DeferredResult
ব্যবহার করা হয়। Spring MVC 3.2 এর পর থেকে, Spring ফ্রেমওয়ার্কে এই ফিচারটি ইনক্লুড করা হয়েছে।
@Async
অ্যানোটেশন ব্যবহার করে, আপনি একটি মেথডকে অ্যাসিঙ্ক্রোনাস কার্যকলাপ হিসেবে চিহ্নিত করতে পারেন। Spring অ্যাসিঙ্ক্রোনাস কাজটি আলাদা থ্রেডে প্রক্রিয়া করবে, যাতে মূল থ্রেডটি ব্লক না হয়।
HomeController.java (Asynchronous Method উদাহরণ):
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/longProcess")
public String longProcess() {
longRunningTask();
return "Request is being processed asynchronously!";
}
@Async
public void longRunningTask() {
try {
// এখানে দীর্ঘ সময় নেয় এমন কাজ যেমন ডেটাবেস কুয়েরি বা ফাইল আপলোড/ডাউনলোড করা যেতে পারে।
Thread.sleep(5000); // 5 সেকেন্ডের জন্য থ্রেড স্লিপ
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Long running task finished!");
}
}
@Async
: এই অ্যানোটেশনটি যেকোনো মেথডে ব্যবহৃত হলে, সেটি অ্যাসিঙ্ক্রোনাস ভাবে রান হবে, অর্থাৎ কাজটি অন্য থ্রেডে রান হবে এবং মূল থ্রেড ব্লক হবে না।longRunningTask()
: এটি একটি দীর্ঘ-running টাস্ক যা ৫ সেকেন্ড সময় নেবে, কিন্তু সার্ভার অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে সক্ষম থাকবে।Spring MVC তে অ্যাসিঙ্ক্রোনাস কার্যকলাপ ব্যবহারের জন্য @EnableAsync
অ্যানোটেশনটি ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করতে হবে।
AppConfig.java (Configuration):
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // @Async অ্যানোটেশন সক্রিয় করতে
public class AppConfig {
}
@EnableAsync
: এটি Spring অ্যাপ্লিকেশন কনটেক্সটে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করে। এটি Spring Context-এ কাস্টম থ্রেডে কাজ করার জন্য ইন্টার্নাল রিসোর্সগুলি কনফিগার করে।Spring MVC তে DeferredResult ব্যবহার করলে, আপনি ওয়েব রিকোয়েস্টকে অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডল করতে পারেন এবং HTTP রেসপন্সটি যখন প্রক্রিয়া সম্পন্ন হবে, তখন রিটার্ন করা হবে।
DeferredResultController.java:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
@RestController
public class DeferredResultController {
@GetMapping("/asyncRequest")
public DeferredResult<String> handleAsyncRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// এখানে একটি দীর্ঘ-running কাজ সিমুলেট করা হচ্ছে
new Thread(() -> {
try {
Thread.sleep(5000); // 5 সেকেন্ডের জন্য থ্রেড স্লিপ
} catch (InterruptedException e) {
e.printStackTrace();
}
deferredResult.setResult("Async task completed!");
}).start();
return deferredResult;
}
}
DeferredResult<String>
: এটি Spring MVC তে অ্যাসিঙ্ক্রোনাস রেসপন্সের জন্য ব্যবহৃত হয়। এই ক্লাসটি HTTP রেসপন্সটি পরবর্তী সময়ে অ্যাসিঙ্ক্রোনাসভাবে সেট করে দেয়।deferredResult.setResult()
: এটি অ্যাসিঙ্ক্রোনাস কাজ সম্পন্ন হওয়ার পর HTTP রেসপন্স পাঠানোর জন্য ব্যবহৃত হয়।@EnableAsync
অ্যানোটেশনটি আগে কনফিগার করা হয়েছে, তাই কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন নেই যদি আপনি DeferredResult
ব্যবহার করেন।
Spring MVC তে Asynchronous Request Handling ব্যবহার করে আপনি ওয়েব অ্যাপ্লিকেশনে অ্যাসিঙ্ক্রোনাস কার্যকলাপ পরিচালনা করতে পারেন, যা সার্ভারের কর্মক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করতে সাহায্য করে। @Async
এবং DeferredResult
ব্যবহারের মাধ্যমে আপনি সহজেই অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট হ্যান্ডলিং প্রক্রিয়া করতে পারেন। এতে ব্যবহারকারীরা অপেক্ষা না করে দ্রুত প্রতিক্রিয়া পেতে পারেন এবং সার্ভারও একাধিক রিকোয়েস্ট হ্যান্ডল করতে সক্ষম হয়।
@Async
অ্যানোটেশন Spring Framework এর একটি সুবিধা যা অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়। এই অ্যানোটেশনটি একটি মেথডকে ব্যাকগ্রাউন্ড থ্রেডে রান করতে নির্দেশ দেয়, যা মূল থ্রেডকে ব্লক না করে কার্যক্রম সম্পাদন করতে সহায়তা করে। এটি বিশেষ করে দীর্ঘ চলমান কাজ যেমন ইমেইল পাঠানো, ডাটাবেস আপডেট, বা থার্ড পার্টি API কল এর জন্য ব্যবহৃত হয়।
Spring MVC তে @Async
অ্যানোটেশন সাধারণত ইউজারের ইনপুট প্রক্রিয়া বা অন্যান্য দীর্ঘসময় চলতে থাকা কাজের জন্য ব্যবহার করা হয় যাতে সেগুলি ব্যাকগ্রাউন্ডে চলে এবং ইউজার দ্রুত রেসপন্স পায়।
@Async
অ্যানোটেশন এর ব্যবহার:Spring-এ @Async
অ্যানোটেশন ব্যবহার করার জন্য প্রথমে আপনার কনফিগারেশন ক্লাসে @EnableAsync
অ্যানোটেশন যোগ করতে হবে। এটি Spring-কে অ্যাসিঙ্ক্রোনাস কার্যক্রম সক্রিয় করতে বলে।
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // Enable asynchronous methods
public class AsyncConfig {
// Configuration for Async tasks (optional)
}
@Async
অ্যানোটেশন ব্যবহার করা@Async
অ্যানোটেশন সেই মেথডে ব্যবহৃত হয় যেগুলি ব্যাকগ্রাউন্ডে রান করতে হবে। এই মেথডটি একটি Future
, CompletableFuture
, বা void
রিটার্ন টাইপ হতে পারে। নিচে এর একটি উদাহরণ দেওয়া হলো:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class MyService {
@Async
public CompletableFuture<String> performAsyncTask() throws InterruptedException {
// Simulating a long-running task (e.g., a 5-second delay)
Thread.sleep(5000);
return CompletableFuture.completedFuture("Task Completed");
}
@Async
public void performAsyncTaskWithoutReturn() throws InterruptedException {
// Simulating a long-running task (e.g., a 5-second delay)
Thread.sleep(5000);
System.out.println("Async Task without return value completed!");
}
}
@Async
: এটি মেথডের উপর অ্যাসিঙ্ক্রোনাস কার্যক্রম চালানোর জন্য ব্যবহৃত হয়।CompletableFuture<String>
: এটি ব্যাকগ্রাউন্ড কাজের শেষে রিটার্ন করা একটি Future
যা একটি ফলাফল প্রদান করবে।void
: যদি কোন রিটার্ন ভ্যালু না থাকে, তবে void
ব্যবহার করা হয়।@Async
মেথড কল করাimport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;
@RestController
public class AsyncController {
@Autowired
private MyService myService;
@GetMapping("/asyncTask")
public String executeAsyncTask() throws InterruptedException {
// Calling asynchronous method
CompletableFuture<String> result = myService.performAsyncTask();
// Simulating other tasks while the async task runs
System.out.println("Executing other tasks while async task is in progress...");
return "Async task is in progress!";
}
@GetMapping("/asyncTaskWithoutReturn")
public String executeAsyncTaskWithoutReturn() throws InterruptedException {
myService.performAsyncTaskWithoutReturn();
return "Async task without return is in progress!";
}
}
এখানে:
@Async
মেথড performAsyncTask()
ব্যাকগ্রাউন্ড থ্রেডে চলে এবং দ্রুত return
প্রদান করে। আপনি মেথডের পরে CompletableFuture
অবজেক্টটির সাথে কাজ করতে পারেন, যা আসল কার্যক্রমের ফলাফল ধারণ করে।@Async
মেথড performAsyncTaskWithoutReturn()
কোনও ফলাফল না দিয়ে শুধুমাত্র একটি কার্যক্রম সম্পন্ন করে।স্প্রিং অ্যাসিঙ্ক্রোনাস কাজের জন্য ডিফল্ট থ্রেড পুল ব্যবহার করে, তবে আপনি চাইলে কাস্টম থ্রেড পুল কনফিগার করতে পারেন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class AsyncConfig {
@Bean(name = "taskExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3); // Minimum number of threads
executor.setMaxPoolSize(10); // Maximum number of threads
executor.setQueueCapacity(25); // Queue size for tasks waiting to be executed
executor.setThreadNamePrefix("Async-"); // Thread name prefix
executor.initialize();
return executor;
}
}
এখানে:
CorePoolSize
: থ্রেড পুলের প্রাথমিক সাইজ।MaxPoolSize
: পুলে সর্বাধিক থ্রেড সংখ্যা।QueueCapacity
: থ্রেড পুলের জন্য থ্রেডগুলো অ্যাসাইন করার জন্য অপেক্ষমাণ কাজের সংখ্যা।@Async
ব্যবহার করলে মূল থ্রেড ব্লক না হয়ে অ্যাসিঙ্ক্রোনাস কাজ করে। এর ফলে ইউজার ইন্টারফেস দ্রুত রেসপন্স করতে পারে।@Async
ব্যবহার করা যেতে পারে, যাতে ইউজার তাত্ক্ষণিকভাবে রেসপন্স পায়।@Async
ব্যবহার করা যেতে পারে।Spring MVC তে @Async
অ্যানোটেশন ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস কার্যক্রম সহজেই পরিচালনা করতে পারেন, যা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়ক। এটি বিভিন্ন সময় সাপেক্ষ কাজ যেমন ইমেইল পাঠানো, ডেটাবেস অপারেশন, এবং অন্যান্য দীর্ঘ-running কাজের জন্য উপযুক্ত। @Async
ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশন দ্রুত এবং ব্যবহারকারীদের জন্য আরও সাড়াদানকারী হতে পারে।
Asynchronous Processing হল একটি গুরুত্বপূর্ণ ফিচার যা আপনাকে দীর্ঘ-running HTTP রিকোয়েস্ট প্রক্রিয়াকরণের সময় প্রধান থ্রেড ব্লক না করে ক্লায়েন্টকে দ্রুত প্রতিক্রিয়া প্রদান করতে সহায়তা করে। Spring MVC তে DeferredResult
এবং Callable
এর মাধ্যমে অ্যাসিঙ্ক্রোনাস প্রক্রিয়াকরণ করা যায়, যা সার্ভারকে বিভিন্ন রিকোয়েস্ট হ্যান্ডলিংয়ের জন্য অপ্টিমাইজড রাখতে সাহায্য করে। এর মাধ্যমে, কোনো নির্দিষ্ট সময়ের জন্য ওয়েট করার পরিবর্তে, ক্লায়েন্ট দ্রুত একটি রেসপন্স পেতে পারে।
DeferredResult
DeferredResult
হল Spring MVC তে ব্যবহারকারী বা ক্লায়েন্টকে asynchronous রেসপন্স প্রদান করার জন্য ব্যবহৃত একটি উপাদান। এটি দীর্ঘ-running প্রক্রিয়ার শেষে যখন রেসপন্স প্রস্তুত হবে, তখন রেসপন্স পাঠানোর সুযোগ দেয়। ক্লায়েন্টের জন্য তাৎক্ষণিক প্রতিক্রিয়া দেয় এবং পরবর্তীতে রেসপন্স প্রদান করে।
DeferredResult
এর ব্যবহার:উদাহরণ:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.request.async.DeferredResult;
@Controller
public class AsyncController {
@GetMapping("/deferred-result")
public DeferredResult<String> handleRequest() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// Simulating a long running task in another thread (e.g., calling an external service)
new Thread(() -> {
try {
Thread.sleep(5000); // Simulate long-running task (5 seconds)
deferredResult.setResult("Processed after 5 seconds!"); // Set the result
} catch (InterruptedException e) {
deferredResult.setErrorResult("Error processing request");
}
}).start();
return deferredResult;
}
}
এখানে:
DeferredResult
: এটি ক্লায়েন্টের জন্য রিকোয়েস্টের ফলাফল অপেক্ষায় থাকে।setResult()
: অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের শেষে ক্লায়েন্টকে রেসপন্স পাঠানো হয়।ফলাফল:
"Processed after 5 seconds!"
রেসপন্স দেওয়া হবে, কিন্তু সেই সময় ক্লায়েন্টের থ্রেড ব্লক হবে না।Callable
Callable
Spring MVC তে আরও একটি পদ্ধতি যা অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। Callable
ব্যবহারের সময়, Spring MVC ক্লায়েন্টের থ্রেড ব্লক না করে এক্সিকিউশন হ্যান্ডলারের মাধ্যমে এটি অন্য থ্রেডে প্রক্রিয়া করবে এবং যখন সম্পন্ন হবে তখন রেসপন্স প্রদান করবে।
Callable
এর ব্যবহার:উদাহরণ:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AsyncController {
@GetMapping("/callable")
public Callable<String> handleRequest() {
return () -> {
// Simulating a long running task
Thread.sleep(5000); // Simulate 5 seconds of processing
return "Processed after 5 seconds!";
};
}
}
এখানে:
Callable
: একটি ফাংশনাল ইন্টারফেস যা একটি অ্যাসিঙ্ক্রোনাস প্রসেস সম্পন্ন হলে একটি ফলাফল প্রদান করবে।Thread.sleep()
: এখানে শুধুমাত্র দীর্ঘ-running প্রসেসের জন্য সিমুলেশন করা হয়েছে।ফলাফল:
"Processed after 5 seconds!"
রেসপন্স পাবে।Spring MVC তে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করতে @EnableAsync
অ্যানোটেশন ব্যবহার করতে হয়।
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfig {
// Async configuration (if needed)
}
@EnableAsync
অ্যানোটেশন ব্যবহার করে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্রিয় করা হয়।
Spring Boot-এ সাধারণত অ্যাসিঙ্ক্রোনাস প্রসেসিং কনফিগার করতে অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না, তবে যদি আপনি কাস্টম থ্রেড পুল বা অন্যান্য কনফিগারেশন করতে চান, তাহলে নিম্নলিখিত কনফিগারেশন যুক্ত করতে পারেন:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class ThreadConfig {
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(25);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}
এটি থ্রেড পুল কনফিগার করবে যাতে অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের জন্য পর্যাপ্ত থ্রেড ব্যবহার করা যায়।
DeferredResult
এবং Callable
এর পার্থক্যবৈশিষ্ট্য | DeferredResult | Callable |
---|---|---|
ব্যবহার | যেকোনো সময় রিকোয়েস্টের ফলাফল প্রাপ্তি পর্যন্ত অপেক্ষা করে। | সরাসরি থ্রেডে কাজ করতে দেয় এবং তাৎক্ষণিকভাবে রিকোয়েস্ট রিটার্ন হয়। |
রিকোয়েস্ট ব্লকিং | রিকোয়েস্ট ব্লক করা হয় না, তবে ফলাফল আসার পর ক্লায়েন্টকে রেসপন্স দেওয়া হয়। | রিকোয়েস্ট ব্লক না হয়ে, প্রসেসিং অন্য থ্রেডে চলে। |
প্রয়োগের জায়গা | দীর্ঘ-running প্রসেসিং (যেমন ফাইল ডাউনলোড বা থার্ড-পার্টি সার্ভিস কল)। | সহজ প্রসেসিং যেমন ডেটাবেস অপারেশন বা লজিক্যাল প্রসেসিং। |
ফলাফল প্রদান | setResult() বা setErrorResult() ব্যবহার করে। | সরাসরি return এর মাধ্যমে ফলাফল প্রদান। |
DeferredResult
এবং Callable
Spring MVC তে অ্যাসিঙ্ক্রোনাস প্রক্রিয়াকরণ ব্যবস্থাপনা করার জন্য ব্যবহৃত হয়।DeferredResult
বেশিরভাগ ক্ষেত্রেই যখন লম্বা-running অপারেশন চালানো হয়, তখন এটি ব্যবহার করা হয় এবং সেটির শেষে ফলাফল ফেরত দেওয়া হয়।Callable
তুলনামূলকভাবে সহজ অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহৃত হয়, যেখানে অপারেশনটি অন্য থ্রেডে চলে এবং ফাইনাল রেসপন্স দেওয়া হয়।এই দুটি উপাদান Spring MVC অ্যাপ্লিকেশনগুলোকে উচ্চ পারফরম্যান্স, স্কেলেবিলিটি এবং দ্রুত রেসপন্স দেয়, বিশেষত যখন ওয়েব অ্যাপ্লিকেশনটি অনেক রিকোয়েস্ট এবং দীর্ঘ-running প্রক্রিয়া হ্যান্ডল করে।
Asynchronous Request Handling Spring MVC তে একটি শক্তিশালী বৈশিষ্ট্য, যা সার্ভারের রেসপন্স দেওয়ার সময়কে উন্নত করে এবং দীর্ঘ-running প্রক্রিয়াগুলির জন্য অ্যাপ্লিকেশনকে আরও প্রতিক্রিয়া (responsive) রাখে। যখন আপনি asynchronous মডেল ব্যবহার করেন, তখন সার্ভার মূল থ্রেডটি ব্লক না করে রিকোয়েস্ট প্রসেস করতে পারে এবং অন্যান্য রিকোয়েস্ট প্রসেস করতে সক্ষম হয়।
Spring MVC তে Asynchronous Request Handling ব্যবহার করার জন্য, আপনাকে কিছু নির্দিষ্ট কনফিগারেশন এবং পরিবর্তন করতে হয়, যাতে রিকোয়েস্টগুলো ইন্টারনাল থ্রেডের মাধ্যমে প্রসেস করা যায় এবং তার রেসপন্স রিটার্ন করতে পারে যখন তা প্রস্তুত হবে।
Spring MVC তে Asynchronous Request Handling বাস্তবায়ন করার জন্য @Async
এবং Callable
বা DeferredResult
ব্যবহার করা হয়।
@Async
ব্যবহার করে Asynchronous Request HandlingSpring MVC তে @Async
অ্যানোটেশন ব্যবহারের মাধ্যমে আপনার কন্ট্রোলারের মেথডকে অ্যাসিনক্রোনাস করা যেতে পারে। এটি ব্যবহার করলে মেথডটি separate thread এ রান করবে এবং main thread ব্লক হবে না।
Spring Boot ব্যবহার করলে, এটি স্বয়ংক্রিয়ভাবে Asynchronous সাপোর্ট সক্ষম করে, তবে Spring MVC তে এটি কনফিগার করার জন্য, @EnableAsync
অ্যানোটেশন ব্যবহার করতে হবে।
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfig {
// Enable async processing
}
@Async
ব্যবহার করে কন্ট্রোলার মেথডimport org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;
@RestController
public class AsyncController {
@Async
@GetMapping("/async-task")
public CompletableFuture<String> asyncTask() {
// Simulate a long-running task
try {
Thread.sleep(5000); // 5 seconds delay
} catch (InterruptedException e) {
e.printStackTrace();
}
return CompletableFuture.completedFuture("Task Completed");
}
}
@Async
অ্যানোটেশন কন্ট্রোলারের মেথডের উপর ব্যবহার করা হয়েছে যাতে মেথডটি আলাদা থ্রেডে রান করে।CompletableFuture
: এটি asynchronous মেথডের রিটার্ন টাইপ, যা future রেসপন্স প্রতিনিধিত্ব করে।/async-task
এ রিকোয়েস্ট পাঠালে, সার্ভার 5 সেকেন্ড অপেক্ষা করে তার রেসপন্স প্রদান করবে, কিন্তু মূল থ্রেড ব্লক হবে না। এটি অন্যান্য রিকোয়েস্ট প্রসেস করতে সক্ষম থাকবে।Callable
ব্যবহার করে Asynchronous Request HandlingSpring MVC তে Callable
এর সাহায্যে আপনি একটি কন্ট্রোলার মেথডে asynchronous রিকোয়েস্ট প্রসেসিং করতে পারেন। এটি মূলত রিকোয়েস্ট প্রসেসিং সময়কে কমাতে সাহায্য করে এবং I/O-bound tasks এর জন্য উপকারী।
Callable
ব্যবহার করে কন্ট্রোলার মেথডimport org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Callable;
@RestController
public class CallableController {
@GetMapping("/callable-task")
public Callable<String> callableTask() {
return () -> {
// Simulate a long-running task
Thread.sleep(5000); // 5 seconds delay
return "Callable Task Completed";
};
}
}
Callable
: এটি একটি functional interface যা একটি long-running task encapsulate করে এবং asynchronous execution এর জন্য উপযুক্ত।Callable
অবজেক্টটি রান হবে, কিন্তু আসল সার্ভার থ্রেডটি ব্লক হবে না।/callable-task
এ রিকোয়েস্ট পাঠালে, সার্ভার 5 সেকেন্ড পর রেসপন্স করবে, কিন্তু অন্য রিকোয়েস্টগুলোর প্রসেসিং চলতে থাকবে।DeferredResult
ব্যবহার করে Asynchronous Request HandlingDeferredResult
একটি কমপ্লেক্স অ্যাসিনক্রোনাস টুল যা আপনি request processing ও response generation এর মধ্যে asynchronous কাজ করতে পারেন। এটি কখনও কখনও Callable
এর চেয়ে বেশি নিয়ন্ত্রণ এবং flexibility প্রদান করে।
DeferredResult
ব্যবহার করে কন্ট্রোলার মেথডimport org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
@RestController
public class DeferredResultController {
@GetMapping("/deferred-result-task")
public DeferredResult<String> deferredResultTask() {
DeferredResult<String> output = new DeferredResult<>();
// Simulate a long-running task in another thread
new Thread(() -> {
try {
Thread.sleep(5000); // 5 seconds delay
output.setResult("DeferredResult Task Completed");
} catch (InterruptedException e) {
output.setErrorResult("Error occurred");
}
}).start();
return output; // Return DeferredResult
}
}
DeferredResult
: এটি রিকোয়েস্টের response আলাদা থ্রেডে প্রস্তুত হতে দেয়। এই থ্রেডটি মূল থ্রেডের বাইরে চলবে এবং রিকোয়েস্ট সম্পূর্ণ হওয়ার পর রেসপন্স ফেরত করবে।output.setResult()
: এটি DeferredResult
অবজেক্টের মাধ্যমে আসল রেসপন্স সেট করা হয়।output.setErrorResult()
: কোন সমস্যা হলে DeferredResult
এর মাধ্যমে error result ফেরত দেওয়া হয়।/deferred-result-task
এ রিকোয়েস্ট পাঠালে সার্ভার 5 সেকেন্ড পরে রেসপন্স করবে এবং থ্রেড ব্লক হবে না।Spring MVC তে asynchronous হ্যান্ডলিং সক্ষম করতে, @EnableAsync
এবং async supported=true
কনফিগারেশন ব্যবহার করা হয়।
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(30000); // Set the timeout for asynchronous requests
}
}
configureAsyncSupport()
: এই মেথডটি asynchronous request processing কনফিগার করার জন্য ব্যবহার করা হয়।setDefaultTimeout()
: এই মেথডের মাধ্যমে আমরা asynchronous রিকোয়েস্টের জন্য টাইমআউট নির্ধারণ করতে পারি।Spring MVC তে Asynchronous Request Handling দ্বারা আপনি দীর্ঘ-running কার্যক্রমের জন্য সার্ভারের মূল থ্রেড ব্লক না করে কার্যক্ষমতা বাড়াতে পারেন। এর জন্য আপনি @Async
, Callable
, বা DeferredResult
ব্যবহার করতে পারেন। এই পদ্ধতিগুলি ওয়েব অ্যাপ্লিকেশনকে আরও প্রতিক্রিয়া (responsive) এবং কার্যকরী করে তোলে, বিশেষত যখন আপনার অ্যাপ্লিকেশনটির I/O-bound বা সময়সাপেক্ষ কার্যক্রম থাকে।
Read more