স্টেটলেস এবং স্টেটফুল এন্টারপ্রাইজ জাভা বিনস


94

আমি জাভা ইই 6 টি টিউটোরিয়ালটি দিয়ে যাচ্ছি এবং আমি রাষ্ট্রবিহীন এবং রাষ্ট্রীয় অধিবেশন মটরশুটিগুলির মধ্যে পার্থক্যটি বোঝার চেষ্টা করছি। স্টেটলেস সেশন মটরশুটি যদি পদ্ধতি কলগুলির মধ্যে তাদের রাজ্য ধরে না রাখে তবে আমার প্রোগ্রামটি কেন এটি আচরণ করছে?

package mybeans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

ক্লায়েন্ট

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;

@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

আমি প্রতিবার getNumber 0 ফিরে আসার প্রত্যাশা করছিলাম তবে এটি 1 ফিরছে এবং আমার ব্রাউজারে সার্লেটের পুনরায় লোড এটি আরও বাড়িয়ে তুলবে। সমস্যাটি রাষ্ট্রবিহীন সেশন মটরশুটি কীভাবে কাজ করে তা অবশ্যই বোঝার সাথে আছে এবং অবশ্যই লাইব্রেরি বা অ্যাপ্লিকেশন সার্ভারের সাথে নয়। রাজ্যবিহীন সেশন বিনের কোনও সাধারণ আমাকে হ্যালো ওয়ার্ল্ড টাইপের উদাহরণ দিতে পারে যা আপনি যখন এটি রাষ্ট্রীয়ভাবে পরিবর্তন করেন তখন আলাদা আচরণ করে?


6
সম্পর্কিত: stackoverflow.com/questions/8887140/… এই উত্তরটি বুঝতে সম্ভবত সহজ। নোট করুন যে সার্লেলেটগুলি মূলত অ্যাপ্লিকেশনটি স্কোপড হয় (কেবলমাত্র 1 টি সার্ভলেট উদাহরণ অ্যাপ্লিকেশন জুড়ে রয়েছে যা সমস্ত এইচটিটিপি অনুরোধ / সেশন জুড়ে ভাগ / পুনঃব্যবহার করা হয়
BalusC

হাই, আপনি প্রথমে ইনক্রিমেন্ট করেন, এবং তার পরে মান পাবেন .... সুতরাং আপনি 0 এর মান আশা করতে পারবেন না
rzur2004

আমি এই জিজ্ঞাসার জন্য আপনাকে ধন্যবাদ জানাতে চাই, এটি এই মুহূর্তে আমার সমস্যার সমাধান করে। আমি এর চেয়ে আরও ভাল জিজ্ঞাসা করতে পারিনি
খোলোফেলো মালোমা

উত্তর:


94

গুরুত্বপূর্ণ পার্থক্যটি প্রাইভেট সদস্যের ভেরিয়েবল নয়, তবে কোনও নির্দিষ্ট ব্যবহারকারীর সাথে রাষ্ট্রকে যুক্ত করে (মনে করুন "শপিং কার্ট")।

স্টেটফুল সেশন শিমের স্টেটফুল টুকরা সার্লেটলে সেশনের মতো। জবাবদিহি সেশন মটরশুটি আপনার অ্যাপ্লিকেশনটিকে এখনও কোনও ওয়েব ক্লায়েন্ট না থাকলেও সেই অধিবেশনটিকে অনুমতি দেয়। যখন অ্যাপ্লিকেশন সার্ভারটি অবজেক্ট পুলের বাইরে একটি রাষ্ট্রবিহীন সেশন শিম আনে, তখন এটি জানে যে এটি যে কোনও অনুরোধ সন্তুষ্ট করতে ব্যবহার করা যেতে পারে, কারণ এটি কোনও নির্দিষ্ট ব্যবহারকারীর সাথে সম্পর্কিত নয়।

একটি রাষ্ট্রীয় অধিবেশন শিমটি ব্যবহারকারীকে প্রথমে পেয়ে গেছে যা তাদের শপিং কার্টের তথ্য কেবল তাদেরই জানা উচিত to অ্যাপ্লিকেশন সার্ভার নিশ্চিত করে যে এটি এমনই। আপনি কেনাকাটি শুরু করতে পারলে আপনার অ্যাপ্লিকেশনটি কতটা জনপ্রিয় হবে তা কল্পনা করুন এবং আমি যখন আসি তখন অ্যাপ্লিকেশন সার্ভারটি আপনার রাষ্ট্রীয় সেশন বিন আমাকে দিয়ে দেয়!

সুতরাং আপনার ব্যক্তিগত ডেটা সদস্য প্রকৃতপক্ষে "রাষ্ট্র", তবে এটি "শপিং কার্ট" নয়। আপনার (খুব ভাল) উদাহরণটি আবার তৈরি করার চেষ্টা করুন যাতে বর্ধিত ভেরিয়েবল কোনও নির্দিষ্ট ব্যবহারকারীর সাথে যুক্ত থাকে। এটি বৃদ্ধি করুন, একটি নতুন ব্যবহারকারী তৈরি করুন এবং দেখুন তারা এখনও বর্ধিত মান দেখতে পারে কিনা। যদি সঠিকভাবে করা হয় তবে প্রতিটি ব্যবহারকারীর কাউন্টারটির কেবল তাদের সংস্করণ দেখতে হবে।


আপনি একটি মন্তব্য একটি সুস্পষ্ট উত্তর প্রদান করতে পারেন? এই উদাহরণে থাকা রাজ্যহীন শিম কেন সর্বদা মূল্য রাখে এবং প্রতিবার এটি বাড়িয়ে তোলে? কারণ সেখানে একজনই আছেন?
arjacsoh

4
কাউন্টার ব্যবহারকারীর সংখ্যা নির্বিশেষে বৃদ্ধি করবে। সুতরাং যদি ব্যবহারকারী 1 আসে এবং 1 টির সাথে পাল্টা বৃদ্ধি করে এবং একই সাথে ব্যবহারকারী 2 আসে এবং এটি বৃদ্ধি করে তবে মানটি 2 হবে It এটি আসলে দেখানো উচিত যে ব্যবহারকারী 1 এর 1 এবং ব্যবহারকারী 2 এর 1 আছে (যদি আপনি যা করতে চান তা যদি থাকে তবে শপিং কার্ট) উপরোক্ত উদাহরণ হিসাবে)।
কৃষ্ণ

138

স্টেটলেস সেশন বিন (এসএলএসবি) একটি ক্লায়েন্টের সাথে আবদ্ধ নয় এবং এক ক্লায়েন্টের প্রতিটি পদ্ধতি অনুরোধের সাথে একই উদাহরণ পাওয়ার কোনও গ্যারান্টি নেই (কিছু ধারক প্রতিটি পদ্ধতি অনুরোধ অধিবেশন দিয়ে মটরশুটি তৈরি করতে এবং ধ্বংস করতে পারে, এটি একটি বাস্তবায়ন-নির্দিষ্ট সিদ্ধান্ত , তবে উদাহরণগুলি সাধারণত পুল করা হয় - এবং আমি ক্লাস্টারযুক্ত পরিবেশের কথা উল্লেখ করি না)। অন্য কথায়, যদিও রাজ্যহীন শিমের উদাহরণ ভেরিয়েবল থাকতে পারে তবে এই ক্ষেত্রগুলি একটি ক্লায়েন্টের জন্য সুনির্দিষ্ট নয়, তাই তাদের উপর দূরবর্তী কলগুলির মধ্যে নির্ভর করবেন না।

বিপরীতে, স্টেটফুল সেশন বিন (এসএফএসবি) তাদের পুরো জীবনের জন্য একজন ক্লায়েন্টকে উত্সর্গীকৃত , কোনও অদলবদল বা পোলিং নেই (সম্পদ সংরক্ষণের জন্য এটি প্যাসিভেশন পরে স্মৃতি থেকে উচ্ছেদ করা যেতে পারে তবে এটি অন্য গল্প) এবং কথোপকথনের অবস্থা বজায় রাখে । এর অর্থ হ'ল বিনের দৃষ্টান্তের ভেরিয়েবলগুলি পদ্ধতি আহ্বানের মধ্যে ক্লায়েন্টের সাথে সম্পর্কিত ডেটা রাখতে পারে। এবং এটি আন্তঃনির্ভর পদ্ধতি কলগুলি করা সম্ভব করে তোলে (একটি পদ্ধতি দ্বারা করা পরিবর্তনগুলি পরবর্তী পদ্ধতি কলগুলিকে প্রভাবিত করে)। মাল্টি-স্টেপ প্রক্রিয়াগুলি (একটি নিবন্ধকরণ প্রক্রিয়া, একটি শপিং কার্ট, বুকিং প্রক্রিয়া ...) এসএফএসবি-র জন্য সাধারণ ব্যবহারের ক্ষেত্রে cases

আরেকটা জিনিস. আপনি যদি এসএফএসবি ব্যবহার করছেন, তবে আপনাকে অবশ্যই সেগুলি ক্লাসগুলিতে ইনজেকশন এড়ানো উচিত নয় যা প্রকৃতিতে মাল্টিথ্রেডযুক্ত, যেমন সার্লেটলেট এবং জেএসএফ পরিচালিত মটরশুটি (আপনি চান না যে এটি সমস্ত ক্লায়েন্টের দ্বারা ভাগ করা হোক)। আপনি যদি নিজের ওয়েব অ্যাপ্লিকেশনটিতে এসএফএসবি ব্যবহার করতে চান, তবে আপনাকে HttpSessionভবিষ্যতের ক্রিয়াকলাপের জন্য কোনও জেএনডিআই লুকআপ করতে হবে এবং প্রত্যাবর্তিত EJB উদাহরণটি বস্তুটিতে সংরক্ষণ করতে হবে। এরকম কিছু:

try {
    InitialContext ctx = new InitialContext();
    myStateful = (MyStateful)ctx.lookup("java:comp/env/MyStatefulBean");
    session.setAttribute("my_stateful", myStateful);
} catch (Exception e) {
    // exception handling
}

সাফ করার জন্য ধন্যবাদ। আমি যখন ক্লায়েন্টের জন্য একটি স্বতন্ত্র কমান্ড লাইন প্রোগ্রামটি ব্যবহার করি, ততক্ষণ পার্থক্যটি দেখা যায়।
স্ট্যানলি কেলি 12

আপনার মন্তব্যের জন্য ধন্যবাদ, তারা আরও আলোকিত। প্রথমে আপনার বিমূর্ত সংজ্ঞা দিন, তারপরে প্রতিটি পরিস্থিতির জন্য কিছু ব্যবহারের ক্ষেত্রে সুনির্দিষ্ট করুন এবং তারপরে কিছু সমস্যাগুলি চিহ্নিত করুন। দুর্দান্ত +1
আর্থার

কি এড়ানোর ইনজেকশনের অংশ EJB 3.1 পাশাপাশি আউট যায়?
জ্যাকট্রেডস

7
@ প্যাসাল যদি "স্টেটফুল সেশন বিনস (এসএফএসবি) তাদের পুরো জীবনের জন্য একজন ক্লায়েন্টকে উত্সর্গীকৃত হয়", এই দক্ষতাটি এসএফএসবিতে নির্মিত হয়, তবে কেন এইচটিটিপিএসশন অবজেক্টে সেগুলি সঞ্চয় করতে হবে?
ব্যবহারকারী 1169587

4
ইতিমধ্যে 'সেশনড' থাকলে আমাদের কেন অধিবেশনীয় রাষ্ট্রীয় শিমের প্রয়োজন? এইভাবে আমরা প্রতিটি বস্তুকে সেশন করতে পারি।
প্লিজ

18

রাষ্ট্রহীন এবং এই প্রসঙ্গে রাষ্ট্রীয় অর্থ আপনি যা আশা করতে পারেন তার পুরোপুরি অর্থ নেই।

EJBs এর সাথে রাষ্ট্রবোধ বলতে আমি কথোপকথনের স্থিতিটিকে বোঝায় । ক্লাসিক উদাহরণটি একটি ফ্লাইট বুকিং। যদি এটি তিনটি পদক্ষেপ নিয়ে গঠিত:

  • রিজার্ভ আসন
  • চার্জ ক্রেডিট কার্ড
  • ইস্যু টিকিট

এগুলির প্রত্যেকটি একটি সেশন বিনের জন্য একটি পদ্ধতি কল gine একটি রাষ্ট্রীয় অধিবেশন শিম এই জাতীয় কথোপকথন বজায় রাখতে পারে যাতে কলগুলির মধ্যে কী ঘটে তা মনে পড়ে।

রাজ্যহীন অধিবেশন মটরশুটি কথোপকথন রাষ্ট্রের জন্য যেমন ক্ষমতা নেই।

একটি অধিবেশন শিমের ভিতরে গ্লোবাল ভেরিয়েবল (রাষ্ট্রবিহীন বা রাষ্ট্রীয়) পুরোপুরি অন্য কিছু। রাষ্ট্রীয় অধিবেশন মটরশুটিগুলিতে একটি মটরশুটি তৈরি করা হবে (যেহেতু শিম কেবল একবারে একটি কথোপকথনে ব্যবহার করা যেতে পারে) যেখানে রাষ্ট্রবিহীন সেস সিমের প্রায়শই কেবল একটি উদাহরণ থাকে যা বৈশ্বিক পরিবর্তনশীল কাজগুলি করে দেবে, তবে আমি মনে করি না এটি অবশ্যই গ্যারান্টিযুক্ত।


5

ভাল প্রশ্ন,

এই কোডটি ব্যবহার করে দেখুন (মাইবিয়ান স্টেটফুল / স্টেটলেস পরিবর্তন করুন):

import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.ejb.Stateless;

@LocalBean 
@Stateless 
public class MyBean {

    private int number = 0;

    public int getNumber() {
        return number;
    }

    public void increment() {
        this.number++;
    }
}

সার্লেটলেট

 import java.io.IOException;
    import javax.ejb.EJB;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.WebServlet;

    import java.io.PrintWriter;

    @WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
    public class ServletClient extends HttpServlet {

        private static final long serialVersionUID = 1L;

        @EJB
        MyBean mybean;

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            PrintWriter out = response.getWriter();
            mybean.increment();
            out.println(mybean.getNumber());
        }

    }

পরিবেষ্টা ৩

import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;

import java.io.PrintWriter;

@WebServlet(name = "NewServletClient", urlPatterns = { "/NewServletClient" })
public class NewServletClient extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @EJB
    MyBean mybean;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        mybean.increment();
        out.println(mybean.getNumber());
    }

}

কেস: মাইবিয়ান - @ স্টেটলেস

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট

http: // লোকালহোস্ট: 8080 / এমওয়াই সার্লেটডেমো_ওয়ার_এক্সপ্লোড / নতুন সার্লেটক্লিনেন্ট

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট

কেস: মাইবিয়ান - @ স্টেটফুল

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট

http: // লোকালহোস্ট: 8080 / এমওয়াই সার্লেটডেমো / নতুন সার্লেটক্লিয়েন্ট

HTTP: // লোকালহোস্ট: 8080 / এমওয়াই সার্ভেলেটডেমো / সার্ভলেটক্লিয়েন্ট


4
হ্যাঁ, এটি এটি কাজ করে! খুব সহজ ব্যাখ্যা, ধন্যবাদ!
Nesquik27

5

দুটি প্রধান ধরণের সেশন বিনের মধ্যে প্রধান পার্থক্যগুলি হ'ল:

স্টেটলেস বিনস

  1. আড়ম্বরহীন সেশন বিন্স যার আছে কোন conversationa ক্লায়েন্ট যা তার পদ্ধতি ডেকেছেন সঙ্গে ঠ রাষ্ট্র। এই কারণে তারা বস্তুর একটি পুল তৈরি করতে পারে যা একাধিক ক্লায়েন্টের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করা যেতে পারে ।
  2. পারফরমেন্স জ্ঞানী আড়ম্বরহীন মটরশুটি হয় ভাল যেহেতু তারা না ক্লায়েন্ট প্রতি রাজ্যের আছে।
  3. তারা সমান্তরালে একাধিক ক্লায়েন্টের একাধিক অনুরোধগুলি পরিচালনা করতে পারে ।

রাষ্ট্রীয় শিম

  1. রাষ্ট্রীয় অধিবেশন মটরশুটি একসাথে একাধিক ক্লায়েন্টের সাথে কথোপকথনের রাজ্য বজায় রাখতে পারে এবং ক্লায়েন্টদের মধ্যে টাস্ক ভাগ করা হয় না।
  2. অধিবেশন শেষ হওয়ার পরে রাজ্যটি ধরে রাখা হয় না
  3. ধারকটি ভবিষ্যতে ব্যবহারের জন্য রাজ্যটিকে বাসি রাজ্য হিসাবে সিরিয়ালাইজ করতে এবং সঞ্চয় করতে পারে। এটি অ্যাপ্লিকেশন সার্ভারের সংস্থানগুলি সংরক্ষণ এবং শিম ব্যর্থতা সমর্থন করার জন্য করা হয়।

4

এই জিনিসটি ঘটে কারণ পাত্রে কেবল একটি বিন বিন রয়েছে যা সমস্ত কলের জন্য পুনরায় ব্যবহৃত হচ্ছে। আপনি যদি ক্লায়েন্টকে সমান্তরালভাবে চালনা করেন তবে আপনি একটি আলাদা ফলাফল দেখতে পাবেন কারণ পাত্রে পুলে আরও সিমের উদাহরণ তৈরি হবে।


4

এটির ভাল উত্তর রয়েছে। আমি ছোট উত্তর যোগ করতে চাই। স্টেটলেস বিন কোনও ক্লায়েন্টের ডেটা ধরে রাখতে ব্যবহার করা উচিত নয়। এটি "ক্রিয়া বা প্রক্রিয়াগুলির মডেল করতে যা একটি শটে করা যায়" ব্যবহার করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.