EJB 3.1 এবং সিডিআই কোথায় ব্যবহার করবেন?


120

আমি একটি জাভা ইই ভিত্তিক পণ্য তৈরি করছি যেখানে আমি গ্লাস ফিশ 3 এবং ইজেবি 3.1 ব্যবহার করছি ।

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

যেখানে আমি সিডিআই ইতিমধ্যে সরবরাহ করে না এমন কোনও বৈশিষ্ট্যের প্রয়োজন নেই সেখানে আমি সেশন বিনগুলি প্রতিস্থাপন করতে পারি? এবং যদি তা হয় তবে আমি কী সুবিধা পেতে পারি?

উত্তর:


408

হ্যাঁ, আপনি অবাধে সিডিআই এবং ইজেবি উভয়কে মিশ্রিত করতে পারেন এবং দুর্দান্ত ফলাফল অর্জন করতে পারেন। মনে হচ্ছে আপনি ব্যবহার করছেন @WebServiceএবং @Schedule, যা মিশ্রণে ইজেবি যুক্ত করার ভাল কারণ are

সেখানে প্রচুর বিভ্রান্তি রয়েছে, সুতরাং ইজেবি এবং সিডিআই সম্পর্কিত কিছু সাধারণ তথ্য যেমন তারা একে অপরের সাথে সম্পর্কিত।

ইজেবি> = সিডিআই

লক্ষ্য করুন EJBs হয় CDI মটরশুটি এবং সেইজন্য CDI সব সুবিধা আছে। বিপরীতটি সত্য নয় (এখনও)। সুতরাং অবশ্যই "EJB বনাম সিডিআই" ভাবার অভ্যাসে উঠবেন না কারণ যুক্তিটি সত্যই "EJB + CDI বনাম সিডিআই" তে অনুবাদ করে, যা একটি বিজোড় সমীকরণ।

জাভা EE এর ভবিষ্যতের সংস্করণগুলিতে আমরা সেগুলি সারিবদ্ধ করে রাখব। মানে কি সমতলতা, মানুষ কি তারা ইতিমধ্যে কি করতে পারেন না, যার ফলে শুধু ছাড়া @Stateful, @Statelessঅথবা @Singletonউপরের টীকা।

বাস্তবায়ন শর্তাদি EJB এবং সিডিআই

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

পার্থক্যটি কেবল তখনই আসে যখন কীভাবে অনুরোধ করা হবে তার সমাধান করা হয়। "সমাধান করা" দ্বারা আমরা কেবল বোঝাতে পারি, কোথায় এবং কীভাবে ধারক প্রকৃত দৃষ্টান্তটি দেখতে চাইবে।

সিডিআইতে ধারকটি একটি "স্কোপ" এ দেখায় যা মূলত একটি হ্যাশম্যাপ হবে যা নির্দিষ্ট সময়ের জন্য বেঁচে থাকে (প্রতি অনুরোধ অনুযায়ী @RequestScoped, এইচটিটিপি সেশন অনুযায়ী @SessionScoped, প্রতিটি অ্যাপ্লিকেশন @ApplicationScoped, জেএসএফ কথোপকথন @ConversationScopedবা আপনার কাস্টম স্কোপ বাস্তবায়নের জন্য)।

ইজেবিতে ধারকটি শিমটি টাইপ করা হলে একটি হ্যাশম্যাপেও দেখায় @Stateful। একটি @Statefulশিমও স্কোপে থাকা সমস্ত অন্যান্য মটরশুটিগুলির সাথে এটি বেঁচে থাকার এবং মরে যাওয়ার জন্য উপরোক্ত স্কোপ এনটোটেশনগুলির কোনও ব্যবহার করতে পারে। ইজেবিতে @Statefulমূলত "যে কোনও স্কোপড" শিম রয়েছে। @Statelessমূলত একটি দৃষ্টান্ত পুকুর - আপনি এক আবাহন চলাকালীন পুকুর থেকে একটি দৃষ্টান্ত পেতে। @Singletonমূলত@ApplicationScoped

সুতরাং একটি মৌলিক স্তরে, "ইজেবি" শিমের সাথে আপনি যে কোনও কিছু করতে পারেন আপনার "সিডিআই" শিমের সাথে করা উচিত। আচ্ছাদনগুলির নীচে এগুলি আলাদা করে বলা খুব শক্ত। সমস্ত নদীর গভীরতানির্ণয় উদাহরণগুলি কীভাবে সমাধান করা হয় তার ব্যতিক্রম the

এই প্রক্সিংটি করার সময় ধারকরা যে পরিষেবাগুলি সরবরাহ করবে সেগুলির ক্ষেত্রে তারা বর্তমানে একই নয় তবে আমি যেমনটি বলেছি আমরা এটি জাভা ইই স্পেস লেভেলে কাজ করছি।

পারফরম্যান্স নোট

আপনার কাছে থাকা কোনও "হালকা" বা "ভারী" মানসিক চিত্রকে উপেক্ষা করুন। এটাই সব বিপণন। তাদের বেশিরভাগ অংশের জন্য একই অভ্যন্তরীণ নকশা রয়েছে। সিডিআই ইনস্ট্যান্স রেজোলিউশন সম্ভবত কিছুটা জটিল কারণ এটি কিছুটা বেশি গতিশীল এবং প্রসঙ্গগত। EJB উদাহরণ রেজোলিউশন তুলনামূলকভাবে মোটামুটি স্থির, বোবা এবং সহজ।

আমি আপনাকে টমইই-র একটি বাস্তবায়নের দৃষ্টিকোণ থেকে বলতে পারি, একটি ইজেবি বনাম একটি সিডিআই বিনের ডাক দেওয়ার মধ্যে শূন্য পারফরম্যান্সের পার্থক্য রয়েছে।

ডিফল্ট POJOs, তারপরে CDI, তারপরে EJB

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

সেই বুনিয়াদি ছাড়াও, বেশ দরকারী ধারক পরিষেবার একটি সংখ্যা আপনি শুধুমাত্র ব্যবহার করতে বিকল্প আছে যদি আপনি আপনার CDI শিম এছাড়াও যোগ করে একটি EJB করা হয় @Stateful, @Statelessঅথবা @Singletonএটা।

আমি যখন ইজেবিগুলি ভেঙে ফেলি তার একটি সংক্ষিপ্ত তালিকা এখানে।

জ্যাক্স-ডাব্লুএস ব্যবহার করে

একটি জ্যাক্স-ডাব্লুএস প্রকাশ করা হচ্ছে @WebService। আমি অলস. যখন @WebServiceএটিও একটি ইজেবি হয়, আপনাকে এটিকে তালিকাভুক্ত করতে হবে না এবং এটি web.xmlফাইলের মধ্যে একটি সার্লেট হিসাবে ম্যাপ করতে হবে না । এটাই আমার কাছে কাজ। প্লাস আমি নীচে উল্লিখিত অন্য যে কোনও কার্যকারিতা ব্যবহার করার বিকল্প পেয়েছি। সুতরাং এটি আমার জন্য কোনও বুদ্ধিমান নয়।

@Statelessএবং @Singletonশুধুমাত্র উপলব্ধ ।

জ্যাকস-আরএস ব্যবহার করে

এর মাধ্যমে একটি জ্যাক্স-আরএস সংস্থান উন্মোচন করা হচ্ছে @Path। আমি এখনও অলস। যখন রেস্টস্টুল সার্ভিসটিও একটি ইজেবি হয়, আবার আপনি স্বয়ংক্রিয় আবিষ্কার পাবেন এবং এটিকে জ্যাক্স-আরএস Applicationসাবক্লাস বা এর মতো কিছুতে যুক্ত করতে হবে না। আমি @WebServiceযদি নীচে উল্লিখিত দুর্দান্ত কার্যকারিতাটি ব্যবহার করতে বা ব্যবহার করতে চাই তবে আমি ঠিক একই শিমটি প্রকাশ করতে পারি ।

@Statelessএবং @Singletonশুধুমাত্র উপলব্ধ ।

প্রারম্ভিক যুক্তি

মাধ্যমে স্টার্টআপ লোড করুন @Startup। সিডিআইতে বর্তমানে এর সমতুল্য নেই। কোনওভাবে আমরা AfterStartupধারক লাইফসাইলে কোনও ইভেন্টের মতো কিছু যুক্ত করতে মিস করেছি । যদি আমরা এটি করে থাকি তবে আপনার কাছে এমন @ApplicationScopedশিম থাকতে পারে যা এটি শুনেছিল এবং এটি কার্যকরভাবে একই @Singletonসাথে হবে @Startup। এটি সিডিআই 1.1 এর তালিকায় রয়েছে।

@Singletonশুধুমাত্র উপলব্ধ ।

সমান্তরালে কাজ করা

@Asynchronousপদ্ধতি প্রার্থনা। থ্রেড শুরু করা কোনও সার্ভার-পার্শ্ববর্তী পরিবেশে হ'ল না। অনেক বেশি থ্রেড থাকা গুরুতর পারফরম্যান্স হত্যাকারী। এই টীকাটি আপনাকে কনটেইনার থ্রেড পুল ব্যবহার করে করা জিনিসগুলিকে সমান্তরাল করতে দেয়। এটা সত্যিই দারুন.

উপলব্ধ @Stateful, @Statelessএবং @Singleton

নির্ধারিত কাজ

@Scheduleবা ScheduleExpressionমূলত একটি ক্রোন বা Quartzকার্যকারিতা। এছাড়াও খুব দুর্দান্ত। বেশিরভাগ পাত্রে কেবল এর জন্য কভার্টজ ব্যবহার করে। তবে বেশিরভাগ লোকই জানেন না যে জাভা ইই-র শিডিয়ুলিংয়ের কাজটি লেনদেনের! আপনি যদি একটি ডেটাবেস আপডেট করেন তবে কিছু কাজের সময় নির্ধারণ করুন এবং তার মধ্যে একটি ব্যর্থ হয়, উভয়ই স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যাবে। যদি EntityManagerঅবিরাম কল ব্যর্থ হয় বা ফ্লাশ করতে সমস্যা দেখা দেয় তবে কাজটি আন-শিডিয়ুল করার দরকার নেই। হ্যাঁ, লেনদেন

@Statelessএবং @Singletonশুধুমাত্র উপলব্ধ ।

জেটিএ লেনদেনে সত্ত্বা ব্যবস্থাপক ব্যবহার করে

অবশ্যই লেনদেনের উপরের নোটটি আপনাকে একটি JTAপরিচালিত ব্যবহারের প্রয়োজন EntityManager। আপনি এগুলিকে সাধারণ "সিডিআই" দিয়ে ব্যবহার করতে পারেন, তবে ধারক-পরিচালিত লেনদেন ছাড়াই এটি সত্যই একঘেয়ে হতে পারে UserTransactionপ্রতিশ্রুতি / রোলব্যাক যুক্তির নকল করে ।

CDI, JSF সহ সব জাভা EE উপাদান উপলব্ধ @ManagedBean, @WebServlet, @WebListener, @WebFilter, ইত্যাদি @TransactionAttributeটীকা অবশ্য প্রাপ্তিসাধ্য হয় @Stateful, @Statelessএবং @Singletonশুধুমাত্র।

জেটিএ পরিচালিত হচ্ছে EntityManager

EXTENDEDপরিচালিত EntityManagerআপনি একটি রাখার অনুমতি দেয় EntityManagerমধ্যে খোলা JTAলেনদেন এবং না হারান ক্যাশে করা ডেটা। সঠিক সময় এবং স্থানের জন্য ভাল বৈশিষ্ট্য। দায়িত্বপূর্ণভাবে ব্যবহার করুন :)

@Statefulশুধুমাত্র উপলব্ধ ।

সহজ সিঙ্ক্রোনাইজেশন

যখন আপনার সিঙ্ক্রোনাইজেশন দরকার হয়, @Lock(READ)এবং @Lock(WRITE)টীকাগুলি বেশ দুর্দান্ত। এটি আপনাকে নিখরচায় একযোগে অ্যাক্সেস পরিচালনা করতে দেয়। সমস্ত রেন্ট্রেন্টরিডড্রাইটলক প্লাম্বিং এড়িয়ে যান। একই বালতিতে এটি @AccessTimeoutআপনাকে বলতে দেয় যে হাল ছেড়ে দেওয়ার আগে বিনের দৃষ্টান্তটিতে অ্যাক্সেস পেতে কোনও থ্রেডের কতক্ষণ অপেক্ষা করা উচিত।

@Singletonশুধুমাত্র শিমের জন্য উপলব্ধ ।


32
শুভ আসমান ডেভিড :) আমি মনে করি আপনি এটি আবৃত করেছেন।
লাইটগার্ড

7
এই উত্তরের জন্য আপনাকে ধন্যবাদ। আপনি আমার মাথার চুলকানি পরিষ্কার করেছেন এবং প্রচুর বিন্দু সংযুক্ত করেছেন।
Thupten

7
এটি আমি কখনও পড়েছি on বিষয়টির এটি সর্বোত্তম ব্যাখ্যা। এটি রিয়েল-লাইফ ব্যবহারে ইজেবি-র প্রায় সব গুরুত্বপূর্ণ দিককেও কভার করে। মহান কাজ!!
ন্যানাকোয়াক

3
খুব বোধগম্য এবং কঠোর আইনী শর্তে আদম ভুল নয়, তবে পার্থক্যটি মূল কথা। মহাকাশটি বলেছে যে ইজেবি উদাহরণটি প্রাসঙ্গিক নয়, তবে পরে বলেছে ইজেবি-র রেফারেন্স (প্রক্সি) প্রাসঙ্গিক। স্টেটফুল শিমের জীবনচক্র পুরোপুরি রেফারেন্স (প্রক্সি) এর মাধ্যমে নিয়ন্ত্রণ করা হয়, সুতরাং সিডিআই ধারক যখন সেই রেফারেন্স (প্রক্সি) নিয়ন্ত্রণ করে তখন গণিতটি একই রকম হয় - স্টেটফুল ইজেবিগুলি কার্যকরভাবে প্রাসঙ্গিক হতে পারে।
ডেভিড ব্ল্যুইন্স 21

3
আপনি কি টেस्লায় আপনার মধ্যাহ্নভোজে এই কথাটি লিখেছিলেন?
এডিসন

2

আপনি যদি সত্যিই ejb 3.1 এর কোনও বৈশিষ্ট্য ব্যবহার না করে থাকেন তবে উত্তরটি সহজ। তবে অনুমান করুন যে আপনার অনুসন্ধানটি আপনার ইঙ্গিত দেয় যে আপনি সন্দেহ করছেন যে এখানে 3.1 ধারণা রয়েছে তবে সেগুলি সম্পর্কে অবগত না হয়ে আপনি উপকৃত হচ্ছেন। একটি উদাহরণ হতে পারে যে ধারকটি এসএলএসবি ব্যবহারের জন্য একটি পুল রাখতে পারে, যাতে জেএমএস এবং ডাটাবেস সংযোগগুলি অনুরোধের অংশ হিসাবে ইঞ্জেকশন করতে না পারে

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