Skill

Servlet এর জন্য Asynchronous Processing

Java Technologies - সার্ভলেটস (Servlets)
134
134

Asynchronous Processing কি?

Asynchronous Processing একটি প্রযুক্তি যা সার্ভলেট বা ওয়েব অ্যাপ্লিকেশনকে দীর্ঘ-running কাজগুলো (যেমন, ডেটাবেস কল, ফাইল প্রক্রিয়াকরণ, বা অন্যান্য স্লো নেটওয়ার্ক অপারেশন) করতে দেয় কিন্তু একই সাথে ওয়েব সার্ভার বা অ্যাপ্লিকেশন থ্রেডকে ব্লক না করে। এর মাধ্যমে সার্ভলেট রিকোয়েস্ট প্রসেসিং অন্য কোনো থ্রেডে চলে যায় এবং মূল থ্রেড অবাধে অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে থাকে।

এটি সার্ভলেট 3.0 (Java EE 6) থেকে একটি নতুন ফিচার হিসেবে অন্তর্ভুক্ত করা হয়েছে এবং এর মাধ্যমে সার্ভলেট অ্যাপ্লিকেশনগুলি উচ্চ পারফরম্যান্সের সাথে স্কেল করা সম্ভব হয়।

Asynchronous Processing এ সার্ভলেট, @WebServlet এন্ডপয়েন্টে asyncSupported=true সেট করা হয় এবং বিভিন্ন asyncContext মেথড ব্যবহার করে প্রসেসিং অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়।


Asynchronous Servlet Processing এর সুবিধা

  1. Non-blocking Requests: সাধারণ সার্ভলেট রিকোয়েস্টের সময়, থ্রেড একটি দীর্ঘ-running অপারেশন (যেমন ডেটাবেস কল) সম্পন্ন হওয়া পর্যন্ত ব্লক হয়ে থাকে। Asynchronous Processing এর মাধ্যমে, সার্ভার থ্রেড মুক্ত থাকে এবং অন্যান্য রিকোয়েস্ট হ্যান্ডেল করতে পারে।
  2. Scalability: ওয়েব অ্যাপ্লিকেশন সহজে স্কেল করা যায় কারণ দীর্ঘ-running কাজগুলি মূল থ্রেড ব্লক না করে অন্য থ্রেডে চলতে থাকে। এতে সার্ভারের পারফরম্যান্স এবং রেসপন্স টাইম উন্নত হয়।
  3. Resource Optimization: সার্ভার থ্রেডগুলি ব্লক না হওয়ায় রিসোর্সগুলি আরও কার্যকরভাবে ব্যবহৃত হয়, বিশেষত যখন অ্যাপ্লিকেশনে একাধিক রিকোয়েস্ট থাকে।
  4. Faster Response Time: যেহেতু রিকোয়েস্ট প্রসেসিং অন্য থ্রেডে চলে, মূল থ্রেড দ্রুত অন্যান্য রিকোয়েস্ট প্রসেস করতে সক্ষম হয়, ফলে সার্ভারের রেসপন্স টাইম কমে যায়।

Servlet এর জন্য Asynchronous Processing কিভাবে কাজ করে?

Servlets এ Asynchronous Processing চালু করতে হলে আপনাকে সার্ভলেটের @WebServlet অ্যানোটেশন বা web.xml কনফিগারেশন ফাইলে asyncSupported=true নির্ধারণ করতে হবে। এরপর, AsyncContext ব্যবহার করে আসিঙ্ক্রোনাস প্রসেসিং করা হয়।

Steps to implement Asynchronous Servlet Processing:

  1. Enable Async Support: সার্ভলেটের জন্য asyncSupported=true যোগ করতে হবে।
  2. AsyncContext: AsyncContext ব্যবহার করে কাজের প্রসেসিং শুরু করা হয়।
  3. Complete the Processing: কাজ শেষ হওয়ার পরে AsyncContext.complete() মেথড ব্যবহার করে কাজের সমাপ্তি জানানো হয়।

উদাহরণ: Asynchronous Servlet Implementation

ধরা যাক, আমরা একটি ওয়েব সার্ভলেট তৈরি করতে চাই যা অ্যাসিঙ্ক্রোনাসভাবে দীর্ঘ-running কাজ যেমন ডেটাবেস কল বা ওয়েব সার্ভিস কল করবে এবং তখন সার্ভলেট মূল থ্রেডকে ব্লক করবে না। নিচে একটি উদাহরণ দেখানো হয়েছে।

১. Servlet Code Example (AsyncServlet.java)

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.xml Configuration

<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 এর প্রয়োজনীয়তা

  1. Non-blocking I/O: যখন ওয়েব অ্যাপ্লিকেশন বড় এবং দীর্ঘ-running কাজ করে (যেমন ডেটাবেস কোয়েরি, ওয়েব সার্ভিস কল), অ্যাসিঙ্ক্রোনাস প্রসেসিং ব্যবহারের মাধ্যমে আপনি মূল সার্ভার থ্রেডকে ব্লক না করে অন্যান্য রিকোয়েস্ট হ্যান্ডল করতে পারেন, যার ফলে অ্যাপ্লিকেশন আরও স্কেলেবল এবং রেসপন্সিভ হয়।
  2. Improved Scalability: অ্যাসিঙ্ক্রোনাস প্রসেসিং সার্ভারের থ্রেডগুলোকে আরও কার্যকরভাবে ব্যবহার করতে দেয়, কারণ থ্রেডগুলি দীর্ঘ-running কাজগুলিতে আটকে না থেকে অন্য রিকোয়েস্টগুলো প্রোসেস করতে পারে।
  3. Better User Experience: ব্যবহারকারীরা দ্রুত রেসপন্স পেতে পারে, কারণ সার্ভার একই সময়ে একাধিক রিকোয়েস্ট হ্যান্ডল করতে সক্ষম হয়। এটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।
  4. Efficient Resource Usage: সার্ভার রিসোর্স আরও কার্যকরভাবে ব্যবহৃত হয়, কারণ থ্রেডগুলোকে ব্লক না করে কাজ সম্পন্ন হতে দেয়।

সারাংশ

Asynchronous Processing সার্ভলেট 3.0 থেকে শুরু হয়ে Java EE এবং Servlet API এর মাধ্যমে ওয়েব অ্যাপ্লিকেশনগুলিতে ব্যবহারকারীদের জন্য উন্নত পারফরম্যান্স এবং স্কেলেবিলিটি আনতে সহায়তা করে। এটি বিশেষভাবে ব্যবহার করা হয় দীর্ঘ-running কাজগুলি (যেমন ডেটাবেস কল, ওয়েব সার্ভিস কল, ইত্যাদি) প্রক্রিয়া করার জন্য, যাতে সার্ভারের মূল থ্রেড ব্লক না হয় এবং অন্যান্য রিকোয়েস্ট প্রসেস করা যায়। অ্যাসিঙ্ক্রোনাস প্রসেসিং সিস্টেমের সামগ্রিক কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে।


Content added By

Asynchronous Servlet কি এবং এর প্রয়োগ

82
82

Asynchronous Servlets হল সার্ভলেট প্রযুক্তির একটি বৈশিষ্ট্য, যা সার্ভলেটের মাধ্যমে HTTP রিকোয়েস্টের প্রসেসিং সময়কে কমাতে সহায়তা করে। সার্ভলেটের Asynchronous Processing এর মাধ্যমে, সার্ভলেট একাধিক রিকোয়েস্টকে একসাথে প্রসেস করতে পারে, ফলে অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি উন্নত হয়, বিশেষত যখন সার্ভার একাধিক দীর্ঘ-running কাজের জন্য রেসপন্স করতে সময় নেবে।

একটি সাধারণ সার্ভলেটের মাধ্যমে, একটি HTTP রিকোয়েস্ট প্রক্রিয়াকরণের জন্য সার্ভার ব্লক (block) হয়ে থাকে, অর্থাৎ সার্ভার একসাথে শুধুমাত্র একটি রিকোয়েস্টের জন্য অপেক্ষা করে এবং অন্যান্য রিকোয়েস্টের জন্য সার্ভার অলস থাকে। কিন্তু Asynchronous Servlet এর মাধ্যমে, সার্ভার একই সময়ে একাধিক রিকোয়েস্ট প্রসেস করতে পারে এবং প্রতিটি রিকোয়েস্টের জন্য সার্ভার নির্দিষ্ট সময় অপেক্ষা না করে রেসপন্স প্রদান করতে পারে।

Asynchronous Servlet এর প্রধান সুবিধা:

  • Non-blocking I/O: একটি রিকোয়েস্টের জন্য সার্ভার অপেক্ষা না করে অন্যান্য রিকোয়েস্ট প্রসেস করতে পারে।
  • High Scalability: সার্ভার অনেক বেশি রিকোয়েস্ট একসাথে প্রক্রিয়া করতে সক্ষম হয়, যা অ্যাপ্লিকেশনের স্কেলেবিলিটি উন্নত করে।
  • Better Performance: রিকোয়েস্ট প্রসেসিং সময় কমানোর মাধ্যমে সার্ভারের পারফরম্যান্স বৃদ্ধি পায়।

Asynchronous Servlet এর কার্যপ্রণালী

Asynchronous Servlet HTTP রিকোয়েস্ট প্রসেস করার সময় ব্লকিংয়ের পরিবর্তে asynchronous I/O ব্যবহার করে। সার্ভলেট 3.0 সংস্করণে asyncSupported=true এর মাধ্যমে asynchronous প্রসেসিং সক্ষম করা যায়।

  • asyncContext.start(): এটি নতুন থ্রেড শুরু করার জন্য ব্যবহৃত হয়, যাতে সার্ভার রিকোয়েস্ট প্রক্রিয়া করতে অন্য কাজ করতে পারে।
  • asyncContext.dispatch(): এটি অ্যাসিঙ্ক্রোনাস প্রসেসিং শেষ হলে রিকোয়েস্টের জন্য রেসপন্স প্রদান করতে ব্যবহৃত হয়।

Asynchronous Servlet সার্ভলেট 3.0 বা তার পরবর্তী সংস্করণে উপলব্ধ।


Asynchronous Servlet তৈরি করার উদাহরণ

ধরা যাক, আপনি একটি সার্ভলেট তৈরি করতে চান যেটি দীর্ঘ-running কাজ যেমন ডেটাবেস অপারেশন বা ওয়েব সার্ভিস কল করতে সক্ষম। সার্ভলেটটি asynchronously কাজ করবে এবং কাজটি শেষ হলে রেসপন্স প্রদান করবে।

Step 1: সার্ভলেট কনফিগারেশন

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() দিয়ে কাজ সম্পন্ন করার সিগন্যাল দেওয়া হয়েছে।

Step 2: 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 দেওয়া হয়েছে, যা সার্ভলেটের জন্য অ্যাসিঙ্ক্রোনাস প্রসেসিং সক্ষম করে।

Asynchronous Servlet এর ব্যবহারিক প্রয়োগ

1. Long-running Tasks

যখন কোনো রিকোয়েস্টে দীর্ঘ-running কাজ (যেমন ডেটাবেস অপারেশন, ফাইল আপলোড, বা API কল) প্রক্রিয়া করতে হয়, তখন আপনি Asynchronous Servlet ব্যবহার করতে পারেন। এটি সার্ভারকে অন্য রিকোয়েস্টের জন্য ব্লক না করে কাজ করতে সাহায্য করে।

2. Improved Scalability

অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের মাধ্যমে সার্ভার অনেক বেশি রিকোয়েস্ট একসাথে প্রক্রিয়া করতে পারে, যার ফলে সার্ভারের স্কেলেবিলিটি এবং পারফরম্যান্স বৃদ্ধি পায়। যখন একটি দীর্ঘ-running কাজ প্রক্রিয়া করা হচ্ছে, তখন অন্য রিকোয়েস্ট প্রসেস করা সম্ভব হয়।

3. Non-blocking I/O

Asynchronous Servlet নেটওয়ার্ক কল বা ডিস্ক অপারেশনের মতো I/O কাজগুলিতে ব্লকিং এড়াতে সাহায্য করে, যা সার্ভারের কার্যক্ষমতা বাড়ায়।


সার্ভলেটের মধ্যে Asynchronous Processing এর জন্য কিছু Considerations

  1. Thread Management: অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ের জন্য সার্ভার থ্রেড পরিচালনা করতে হয়। যখন আপনি অনেক দীর্ঘ-running কাজ করবেন, তখন নিশ্চিত করুন যে আপনি সঠিক থ্রেড ব্যবস্থাপনা এবং থ্রেড পুল ব্যবহার করছেন।
  2. Error Handling: অ্যাসিঙ্ক্রোনাস প্রসেসিংয়ে ত্রুটি হ্যান্ডলিং কিছুটা জটিল হতে পারে, কারণ থ্রেডটি আলাদাভাবে চলতে থাকে। আপনি try-catch ব্লক ব্যবহার করে ত্রুটি হ্যান্ডলিং করতে পারেন।
  3. Servlet Container Support: অ্যাসিঙ্ক্রোনাস সার্ভলেটগুলো সাধারণত Servlet 3.0 এবং পরবর্তী সংস্করণে সাপোর্টেড হয়। সার্ভারের এই বৈশিষ্ট্য সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করতে হবে।

সারাংশ

Asynchronous Servlets হল এমন সার্ভলেট যা HTTP রিকোয়েস্ট প্রসেস করার জন্য ব্লকিং না হয়ে নন-ব্লকিং থ্রেড ব্যবহার করে। এটি অ্যাপ্লিকেশনের পারফরম্যান্স ও স্কেলেবিলিটি উন্নত করতে সাহায্য করে, বিশেষ করে দীর্ঘ-running কাজের ক্ষেত্রে। startAsync() এবং AsyncContext এর মাধ্যমে সার্ভলেটের রিকোয়েস্ট প্রসেসিং অ্যাসিঙ্ক্রোনাসভাবে পরিচালিত হয়, যা সার্ভারের থ্রেডগুলোকে আরও কার্যকরভাবে ব্যবহার করতে সাহায্য করে।

Asynchronous Servlets কার্যকরভাবে ডেটাবেস কল, দীর্ঘ-কালীন API কল, এবং অন্যান্য সিস্টেম-লেভেল কাজগুলো প্রসেস করার জন্য বিশেষভাবে উপযোগী।

Content added By

AsynchronousContext এবং তার মেথডের ব্যবহার

91
91

Java Servlets-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো অ্যাসিনক্রোনাস প্রসেসিং, যা AsynchronousContext এর মাধ্যমে পরিচালিত হয়। এটি Servlet 3.0 থেকে চালু হয়েছে এবং একটি Servlet-এ দীর্ঘ-চলমান কাজগুলির জন্য খুবই কার্যকর।

AsynchronousContext কী?

AsynchronousContext এমন একটি ইন্টারফেস যা সার্ভলেট অ্যাসিনক্রোনাস প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এটি সার্ভলেটের রিকোয়েস্ট এবং রেসপন্স প্রসেসিং আলাদা থ্রেডে সরিয়ে নেয়, ফলে সার্ভার ব্লকিং এড়ায় এবং কার্যকারিতা বাড়ায়।

AsynchronousContext মেথডসমূহ এবং তাদের ব্যবহার

নিম্নে AsynchronousContext এর গুরুত্বপূর্ণ মেথডসমূহ এবং তাদের ব্যবহার ব্যাখ্যা করা হলো:

1. start(Runnable run)

  • একটি নতুন থ্রেডে কোড চালানোর জন্য ব্যবহৃত হয়।
  • উদাহরণ:

    asyncContext.start(() -> {
        try {
            // কিছু দীর্ঘ-চলমান কাজ
            Thread.sleep(5000);
            asyncContext.getResponse().getWriter().write("Async processing completed!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            asyncContext.complete(); // কাজ শেষে সম্পূর্ণ করা
        }
    });
    

2. dispatch() এবং dispatch(String path)

  • অ্যাসিনক্রোনাস কাজ সম্পন্ন হওয়ার পরে রিকোয়েস্টটি অন্য সার্ভলেট বা JSP-তে ফরোয়ার্ড করতে ব্যবহৃত হয়।
  • উদাহরণ:

    asyncContext.dispatch("/result.jsp");
    

3. complete()

  • অ্যাসিনক্রোনাস প্রসেসিং শেষ করে। এটি ব্যবহার না করলে রিকোয়েস্ট অপারেশন বন্ধ হবে না।
  • উদাহরণ:

    asyncContext.complete();
    

4. getRequest() এবং getResponse()

  • রিকোয়েস্ট এবং রেসপন্স অবজেক্ট ফেরত দেয়। এই অবজেক্টগুলি অ্যাসিনক্রোনাস প্রসেসিং চলাকালে ব্যবহৃত হয়।
  • উদাহরণ:

    HttpServletRequest req = (HttpServletRequest) asyncContext.getRequest();
    HttpServletResponse res = (HttpServletResponse) asyncContext.getResponse();
    

5. setTimeout(long timeout)

  • টাইমআউট সেট করে, যা অ্যাসিনক্রোনাস প্রসেসিং সম্পন্ন হতে সময় নেবে।
  • উদাহরণ:

    asyncContext.setTimeout(10000); // ১০ সেকেন্ড
    

6. 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 গুরুত্বপূর্ণ?

  • দীর্ঘ-চলমান কাজ (যেমন, ডেটাবেস অপারেশন, থার্ড-পার্টি API কল) সম্পাদনের সময় সার্ভলেট থ্রেড মুক্ত রাখতে সাহায্য করে।
  • থ্রেড ব্যবহারে কার্যকারিতা বাড়ায় এবং সার্ভারের রেসপন্স টাইম উন্নত করে।

এইভাবে, AsynchronousContext এর ব্যবহার বড় অ্যাপ্লিকেশনগুলির কার্যকারিতা এবং স্কেলেবিলিটি নিশ্চিত করে।

Content added By

উদাহরণ সহ Asynchronous Processing

155
155

সার্ভলেটস (Servlets) হলো Java EE (Jakarta EE) টেকনোলজির একটি অংশ, যা সার্ভার-সাইড প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। সার্ভলেটস সাধারণত ক্লায়েন্টের অনুরোধ (HTTP Request) গ্রহণ করে এবং সেই অনুযায়ী একটি রেসপন্স (HTTP Response) তৈরি করে।

Asynchronous Processing সার্ভলেট API-তে Servlet 3.0 থেকে যুক্ত করা হয়েছে। এটি সার্ভলেটকে একসঙ্গে একাধিক অনুরোধ পরিচালনা করতে সাহায্য করে, যেখানে দীর্ঘ সময় ধরে চলমান কাজ (যেমন ডেটাবেস অ্যাক্সেস, ওয়েব সার্ভিস কল ইত্যাদি) ব্লক না করে কার্যকরভাবে হ্যান্ডেল করা যায়।


Asynchronous Processing-এর সুবিধা

  1. উচ্চ কার্যক্ষমতা (High Performance): একাধিক থ্রেড ব্যবহার না করেও কার্যক্ষমতা বৃদ্ধি।
  2. রিসোর্সের কার্যকর ব্যবহার: থ্রেড পুলের উপর চাপ কমায়।
  3. ব্লকিং এড়ানো: দীর্ঘ-সময় ধরে চলমান কাজ সম্পন্ন করার জন্য থ্রেড ব্লক না হয়।

Asynchronous Servlets উদাহরণ

1. সার্ভলেট তৈরি

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);
            }
        });
    }
}

কোড বিশ্লেষণ

  1. @WebServlet অ্যানোটেশন:
    • asyncSupported = true সেট করতে হবে, যাতে সার্ভলেট অ্যাসিঙ্ক্রোনাস মোডে কাজ করতে পারে।
  2. request.startAsync():
    • অ্যাসিঙ্ক্রোনাস প্রসেসিং শুরু করে এবং একটি AsyncContext অবজেক্ট প্রদান করে।
  3. CompletableFuture.runAsync:
    • ভারী কাজ বা দীর্ঘ চলমান কাজ ব্যাকগ্রাউন্ডে সম্পন্ন করার জন্য ব্যবহার করা হয়।
  4. asyncContext.complete():
    • কাজ শেষ হলে এটি কল করতে হবে, যাতে সার্ভার থ্রেডটি মুক্ত হয়।

ডেপ্লয়মেন্ট এবং রানের ফলাফল

  1. সার্ভলেট ডেপ্লয় করুন একটি Java EE কম্প্যাটিবল সার্ভারে (যেমন Apache Tomcat)।
  2. ব্রাউজারে http://localhost:8080/asyncServlet এ যান।
  3. ৩ সেকেন্ডের পর রেসপন্স দেখাবে:

    Asynchronous Processing Completed!
    

প্রাসঙ্গিক অ্যাপ্লিকেশন

  1. ডেটাবেস কোয়েরি: ভারী বা দীর্ঘ চলমান ডেটাবেস কোয়েরি পরিচালনা।
  2. ফাইল প্রসেসিং: বড় ফাইল আপলোড বা ডাউনলোড।
  3. থার্ড-পার্টি API কলস: বহিরাগত সার্ভিসের স্লো রেসপন্স ম্যানেজ করা।

আপনার প্রয়োজনে এই উদাহরণ আরও কাস্টমাইজ করা যেতে পারে।

Content added By
Promotion