Asynchronous Processing একটি প্রযুক্তি যা সার্ভলেট বা ওয়েব অ্যাপ্লিকেশনকে দীর্ঘ-running কাজগুলো (যেমন, ডেটাবেস কল, ফাইল প্রক্রিয়াকরণ, বা অন্যান্য স্লো নেটওয়ার্ক অপারেশন) করতে দেয় কিন্তু একই সাথে ওয়েব সার্ভার বা অ্যাপ্লিকেশন থ্রেডকে ব্লক না করে। এর মাধ্যমে সার্ভলেট রিকোয়েস্ট প্রসেসিং অন্য কোনো থ্রেডে চলে যায় এবং মূল থ্রেড অবাধে অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে থাকে।
এটি সার্ভলেট 3.0 (Java EE 6) থেকে একটি নতুন ফিচার হিসেবে অন্তর্ভুক্ত করা হয়েছে এবং এর মাধ্যমে সার্ভলেট অ্যাপ্লিকেশনগুলি উচ্চ পারফরম্যান্সের সাথে স্কেল করা সম্ভব হয়।
Asynchronous Processing এ সার্ভলেট, @WebServlet
এন্ডপয়েন্টে asyncSupported=true
সেট করা হয় এবং বিভিন্ন asyncContext মেথড ব্যবহার করে প্রসেসিং অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়।
Servlets এ Asynchronous Processing চালু করতে হলে আপনাকে সার্ভলেটের @WebServlet
অ্যানোটেশন বা web.xml
কনফিগারেশন ফাইলে asyncSupported=true
নির্ধারণ করতে হবে। এরপর, AsyncContext
ব্যবহার করে আসিঙ্ক্রোনাস প্রসেসিং করা হয়।
asyncSupported=true
যোগ করতে হবে।AsyncContext
ব্যবহার করে কাজের প্রসেসিং শুরু করা হয়।AsyncContext.complete()
মেথড ব্যবহার করে কাজের সমাপ্তি জানানো হয়।ধরা যাক, আমরা একটি ওয়েব সার্ভলেট তৈরি করতে চাই যা অ্যাসিঙ্ক্রোনাসভাবে দীর্ঘ-running কাজ যেমন ডেটাবেস কল বা ওয়েব সার্ভিস কল করবে এবং তখন সার্ভলেট মূল থ্রেডকে ব্লক করবে না। নিচে একটি উদাহরণ দেখানো হয়েছে।
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;
import java.util.concurrent.TimeUnit;
@WebServlet(urlPatterns = "/async", asyncSupported = true) // Enable async support
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Start asynchronous context
final AsyncContext asyncContext = request.startAsync();
// Set timeout for async operation (e.g., 30 seconds)
asyncContext.setTimeout(30000);
// Run the asynchronous task in a separate thread
asyncContext.start(new Runnable() {
@Override
public void run() {
try {
// Simulate long-running operation (e.g., database or external service call)
TimeUnit.SECONDS.sleep(5); // Sleep for 5 seconds
// Write response after the task is done
PrintWriter out = asyncContext.getResponse().getWriter();
out.println("<html><body><h1>Asynchronous Processing Complete!</h1></body></html>");
} catch (InterruptedException | IOException e) {
e.printStackTrace();
} finally {
asyncContext.complete(); // Complete the async processing
}
}
});
}
}
এখানে:
@WebServlet
: সার্ভলেটের জন্য asyncSupported=true
সেট করা হয়েছে, যা এই সার্ভলেটের জন্য অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করে।startAsync()
: এটি রিকোয়েস্ট প্রসেসিং শুরু করতে অ্যাসিঙ্ক্রোনাস কন্টেক্সট তৈরি করে।asyncContext.start()
: এটি একটি নতুন থ্রেডে দীর্ঘ-running কাজ (এখানে sleep(5)
দিয়েছি) চালায়।asyncContext.complete()
: কাজ শেষ হওয়ার পর অ্যাসিঙ্ক্রোনাস প্রসেসিং সমাপ্ত হয় এবং ক্লায়েন্টকে রেসপন্স পাঠানো হয়।<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>AsyncServlet</servlet-name>
<servlet-class>com.example.AsyncServlet</servlet-class>
<async-supported>true</async-supported> <!-- Enable async processing -->
</servlet>
<servlet-mapping>
<servlet-name>AsyncServlet</servlet-name>
<url-pattern>/async</url-pattern>
</servlet-mapping>
</web-app>
এখানে, async-supported=true
নিশ্চিত করে যে সার্ভলেটটি অ্যাসিঙ্ক্রোনাসভাবে কাজ করতে পারে।
Asynchronous Processing সার্ভলেট 3.0 থেকে শুরু হয়ে Java EE এবং Servlet API এর মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিতে ব্যবহারকারীদের জন্য উন্নত পারফরম্যান্স এবং স্কেলেবিলিটি আনতে সহায়তা করে। এটি বিশেষভাবে ব্যবহার করা হয় দীর্ঘ-running কাজগুলি (যেমন ডেটাবেস কল, ওয়েব সার্ভিস কল, ইত্যাদি) প্রক্রিয়া করার জন্য, যাতে সার্ভারের মূল থ্রেড ব্লক না হয় এবং অন্যান্য রিকোয়েস্ট প্রসেস করা যায়। অ্যাসিঙ্ক্রোনাস প্রসেসিং সিস্টেমের সামগ্রিক কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।
Asynchronous Servlets হল সার্ভলেট প্রযুক্তির একটি বৈশিষ্ট্য, যা সার্ভলেটের মাধ্যমে HTTP রিকোয়েস্টের প্রসেসিং সময়কে কমাতে সহায়তা করে। সার্ভলেটের Asynchronous Processing এর মাধ্যমে, সার্ভলেট একাধিক রিকোয়েস্টকে একসাথে প্রসেস করতে পারে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত হয়, বিশেষত যখন সার্ভার একাধিক দীর্ঘ-running কাজের জন্য রেসপন্স করতে সময় নেবে।
একটি সাধারণ সার্ভলেটের মাধ্যমে, একটি HTTP রিকোয়েস্ট প্রক্রিয়াকরণের জন্য সার্ভার ব্লক (block) হয়ে থাকে, অর্থাৎ সার্ভার একসাথে শুধুমাত্র একটি রিকোয়েস্টের জন্য অপেক্ষা করে এবং অন্যান্য রিকোয়েস্টের জন্য সার্ভার অলস থাকে। কিন্তু Asynchronous Servlet এর মাধ্যমে, সার্ভার একই সময়ে একাধিক রিকোয়েস্ট প্রসেস করতে পারে এবং প্রতিটি রিকোয়েস্টের জন্য সার্ভার নির্দিষ্ট সময় অপেক্ষা না করে রেসপন্স প্রদান করতে পারে।
Asynchronous Servlet HTTP রিকোয়েস্ট প্রসেস করার সময় ব্লকিংয়ের পরিবর্তে asynchronous I/O ব্যবহার করে। সার্ভলেট 3.0 সংস্করণে asyncSupported=true
এর মাধ্যমে asynchronous প্রসেসিং সক্ষম করা যায়।
asyncContext.start()
: এটি নতুন থ্রেড শুরু করার জন্য ব্যবহৃত হয়, যাতে সার্ভার রিকোয়েস্ট প্রক্রিয়া করতে অন্য কাজ করতে পারে।asyncContext.dispatch()
: এটি অ্যাসিঙ্ক্রোনাস প্রসেসিং শেষ হলে রিকোয়েস্টের জন্য রেসপন্স প্রদান করতে ব্যবহৃত হয়।Asynchronous Servlet সার্ভলেট 3.0 বা তার পরবর্তী সংস্করণে উপলব্ধ।
ধরা যাক, আপনি একটি সার্ভলেট তৈরি করতে চান যেটি দীর্ঘ-running কাজ যেমন ডেটাবেস অপারেশন বা ওয়েব সার্ভিস কল করতে সক্ষম। সার্ভলেটটি asynchronously কাজ করবে এবং কাজটি শেষ হলে রেসপন্স প্রদান করবে।
asyncSupported=true
অ্যাট্রিবিউট সার্ভলেটের জন্য সক্রিয় করতে হবে যাতে এটি অ্যাসিঙ্ক্রোনাস প্রসেসিং করতে পারে।
@WebServlet(urlPatterns = "/asyncServlet", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// AsyncContext নেওয়া হচ্ছে
AsyncContext asyncContext = request.startAsync();
// নতুন থ্রেডে প্রসেসিং শুরু করা হচ্ছে
new Thread(() -> {
try {
// কিছু সময় নেবেন এমন দীর্ঘ-running কাজ
Thread.sleep(5000); // 5 সেকেন্ড
// কাজ শেষ হলে রেসপন্স পাঠানো
response.getWriter().write("Async Processing Done!");
asyncContext.complete(); // প্রসেসিং শেষ হয়েছে
} catch (InterruptedException | IOException e) {
e.printStackTrace();
}
}).start(); // থ্রেড শুরু হচ্ছে
}
}
এখানে:
asyncSupported = true
অ্যাট্রিবিউটটি সার্ভলেটকে অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করার জন্য সেট করা হয়েছে।startAsync()
মেথডটি অ্যাসিঙ্ক্রোনাস প্রসেসিং শুরু করার জন্য ব্যবহার করা হয়েছে।Thread.sleep(5000)
দিয়ে দীর্ঘ-running কাজের জন্য কিছু বিলম্বিত সময় যোগ করা হয়েছে।asyncContext.complete()
দিয়ে কাজ সম্পন্ন করার সিগন্যাল দেওয়া হয়েছে।web.xml
ফাইল কনফিগারেশন (অপশনাল)web.xml
ফাইলে asynchronous servlet কনফিগার করার জন্য কোনো বিশেষ কনফিগারেশন প্রয়োজন নেই যদি আপনি @WebServlet
অ্যানোটেশন ব্যবহার করেন। তবে, আপনি ঐতিহ্যবাহী কনফিগারেশনও ব্যবহার করতে পারেন।
<servlet>
<servlet-name>AsyncServlet</servlet-name>
<servlet-class>com.example.AsyncServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>AsyncServlet</servlet-name>
<url-pattern>/asyncServlet</url-pattern>
</servlet-mapping>
এখানে:
<async-supported>
ট্যাগে true
দেওয়া হয়েছে, যা সার্ভলেটের জন্য অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করে।যখন কোনো রিকোয়েস্টে দীর্ঘ-running কাজ (যেমন ডেটাবেস অপারেশন, ফাইল আপলোড, বা API কল) প্রক্রিয়া করতে হয়, তখন আপনি Asynchronous Servlet ব্যবহার করতে পারেন। এটি সার্ভারকে অন্য রিকোয়েস্টের জন্য ব্লক না করে কাজ করতে সাহায্য করে।
অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের মাধ্যমে সার্ভার অনেক বেশি রিকোয়েস্ট একসাথে প্রক্রিয়া করতে পারে, যার ফলে সার্ভারের স্কেলেবিলিটি এবং পারফরম্যান্স বৃদ্ধি পায়। যখন একটি দীর্ঘ-running কাজ প্রক্রিয়া করা হচ্ছে, তখন অন্য রিকোয়েস্ট প্রসেস করা সম্ভব হয়।
Asynchronous Servlet নেটওয়ার্ক কল বা ডিস্ক অপারেশনের মতো I/O কাজগুলিতে ব্লকিং এড়াতে সাহায্য করে, যা সার্ভারের কার্যক্ষমতা বাড়ায়।
try-catch
ব্লক ব্যবহার করে ত্রুটি হ্যান্ডলিং করতে পারেন।Asynchronous Servlets হল এমন সার্ভলেট যা HTTP রিকোয়েস্ট প্রসেস করার জন্য ব্লকিং না হয়ে নন-ব্লকিং থ্রেড ব্যবহার করে। এটি অ্যাপ্লিকেশনের পারফরম্যান্স ও স্কেলেবিলিটি উন্নত করতে সাহায্য করে, বিশেষ করে দীর্ঘ-running কাজের ক্ষেত্রে। startAsync()
এবং AsyncContext
এর মাধ্যমে সার্ভলেটের রিকোয়েস্ট প্রসেসিং অ্যাসিঙ্ক্রোনাসভাবে পরিচালিত হয়, যা সার্ভারের থ্রেডগুলোকে আরও কার্যকরভাবে ব্যবহার করতে সাহায্য করে।
Asynchronous Servlets কার্যকরভাবে ডেটাবেস কল, দীর্ঘ-কালীন API কল, এবং অন্যান্য সিস্টেম-লেভেল কাজগুলো প্রসেস করার জন্য বিশেষভাবে উপযোগী।
Java Servlets-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো অ্যাসিনক্রোনাস প্রসেসিং, যা AsynchronousContext
এর মাধ্যমে পরিচালিত হয়। এটি Servlet 3.0 থেকে চালু হয়েছে এবং একটি Servlet-এ দীর্ঘ-চলমান কাজগুলির জন্য খুবই কার্যকর।
AsynchronousContext
কী?AsynchronousContext
এমন একটি ইন্টারফেস যা সার্ভলেট অ্যাসিনক্রোনাস প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এটি সার্ভলেটের রিকোয়েস্ট এবং রেসপন্স প্রসেসিং আলাদা থ্রেডে সরিয়ে নেয়, ফলে সার্ভার ব্লকিং এড়ায় এবং কার্যকারিতা বাড়ায়।
AsynchronousContext
মেথডসমূহ এবং তাদের ব্যবহারনিম্নে AsynchronousContext
এর গুরুত্বপূর্ণ মেথডসমূহ এবং তাদের ব্যবহার ব্যাখ্যা করা হলো:
start(Runnable run)
উদাহরণ:
asyncContext.start(() -> {
try {
// কিছু দীর্ঘ-চলমান কাজ
Thread.sleep(5000);
asyncContext.getResponse().getWriter().write("Async processing completed!");
} catch (Exception e) {
e.printStackTrace();
} finally {
asyncContext.complete(); // কাজ শেষে সম্পূর্ণ করা
}
});
dispatch()
এবং dispatch(String path)
উদাহরণ:
asyncContext.dispatch("/result.jsp");
complete()
উদাহরণ:
asyncContext.complete();
getRequest()
এবং getResponse()
উদাহরণ:
HttpServletRequest req = (HttpServletRequest) asyncContext.getRequest();
HttpServletResponse res = (HttpServletResponse) asyncContext.getResponse();
setTimeout(long timeout)
উদাহরণ:
asyncContext.setTimeout(10000); // ১০ সেকেন্ড
addListener(AsyncListener listener)
উদাহরণ:
asyncContext.addListener(new AsyncListener() {
@Override
public void onComplete(AsyncEvent event) throws IOException {
System.out.println("Async process completed");
}
@Override
public void onTimeout(AsyncEvent event) throws IOException {
System.out.println("Async process timed out");
}
@Override
public void onError(AsyncEvent event) throws IOException {
System.out.println("Error occurred in async process");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
System.out.println("Async process started");
}
});
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/asyncServlet", asyncSupported = true)
public class AsyncServletExample extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// অ্যাসিনক্রোনাস প্রসেসিং শুরু
AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(5000); // টাইমআউট সেট (মিলিসেকেন্ডে)
asyncContext.start(() -> {
try {
// দীর্ঘ কাজ
Thread.sleep(3000);
asyncContext.getResponse().getWriter().write("Async Task Completed!");
} catch (Exception e) {
e.printStackTrace();
} finally {
asyncContext.complete(); // কাজ শেষে সম্পন্ন করা
}
});
}
}
AsynchronousContext
গুরুত্বপূর্ণ?এইভাবে, AsynchronousContext
এর ব্যবহার বড় অ্যাপ্লিকেশনগুলির কার্যকারিতা এবং স্কেলেবিলিটি নিশ্চিত করে।
সার্ভলেটস (Servlets) হলো Java EE (Jakarta EE) টেকনোলজির একটি অংশ, যা সার্ভার-সাইড প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। সার্ভলেটস সাধারণত ক্লায়েন্টের অনুরোধ (HTTP Request) গ্রহণ করে এবং সেই অনুযায়ী একটি রেসপন্স (HTTP Response) তৈরি করে।
Asynchronous Processing সার্ভলেট API-তে Servlet 3.0 থেকে যুক্ত করা হয়েছে। এটি সার্ভলেটকে একসঙ্গে একাধিক অনুরোধ পরিচালনা করতে সাহায্য করে, যেখানে দীর্ঘ সময় ধরে চলমান কাজ (যেমন ডেটাবেস অ্যাক্সেস, ওয়েব সার্ভিস কল ইত্যাদি) ব্লক না করে কার্যকরভাবে হ্যান্ডেল করা যায়।
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.CompletableFuture;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/asyncServlet", asyncSupported = true)
public class AsyncServletExample extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Asynchronous Context শুরু
AsyncContext asyncContext = request.startAsync();
// Asynchronous কাজ সম্পন্ন করার জন্য CompletableFuture ব্যবহার
CompletableFuture.runAsync(() -> {
try {
// দীর্ঘ সময় ধরে চলমান কাজ (Simulation: 3 সেকেন্ডের ডিলে)
Thread.sleep(3000);
// রেসপন্স লেখার সময়
HttpServletResponse asyncResponse = (HttpServletResponse) asyncContext.getResponse();
asyncResponse.setContentType("text/plain");
PrintWriter out = asyncResponse.getWriter();
out.println("Asynchronous Processing Completed!");
// কাজ শেষ হলে AsyncContext সম্পন্ন করা
asyncContext.complete();
} catch (Exception e) {
asyncContext.complete();
throw new RuntimeException(e);
}
});
}
}
@WebServlet
অ্যানোটেশন:asyncSupported = true
সেট করতে হবে, যাতে সার্ভলেট অ্যাসিঙ্ক্রোনাস মোডে কাজ করতে পারে।request.startAsync()
:AsyncContext
অবজেক্ট প্রদান করে।CompletableFuture.runAsync
:asyncContext.complete()
:http://localhost:8080/asyncServlet
এ যান।৩ সেকেন্ডের পর রেসপন্স দেখাবে:
Asynchronous Processing Completed!
আপনার প্রয়োজনে এই উদাহরণ আরও কাস্টমাইজ করা যেতে পারে।
Read more