গুয়াভা (Guava) লাইব্রেরির @Subscribe এবং @AllowConcurrentEvents অ্যানোটেশনগুলি ইভেন্ট ড্রিভেন আর্কিটেকচার (Event-driven architecture) তৈরি করার জন্য ব্যবহৃত হয়। এই দুটি অ্যানোটেশন Guava Event Bus এর অংশ, যা বিভিন্ন অংশের মধ্যে ইভেন্ট কমিউনিকেশন এবং ডেটা শেয়ারিং সহজ করে তোলে। বিশেষত, Guava Event Bus আপনার অ্যাপ্লিকেশনের মধ্যে মডিউলগুলির মধ্যে অ্যাসিনক্রোনাস (asynchronous) এবং ডিকুপলড (decoupled) যোগাযোগ সরবরাহ করে।
@Subscribe অ্যানোটেশন
@Subscribe অ্যানোটেশনটি গুগল গুয়াভার ইভেন্ট বাসে (Event Bus) ইভেন্ট লিসেনার হিসেবে কাজ করতে ব্যবহৃত হয়। এটি একটি মেথডের উপর প্রয়োগ করা হয় এবং সেই মেথডটি তখন ইভেন্ট বাস থেকে ইভেন্ট গ্রহণ করে। এই মেথডটি সেই ইভেন্টটি গ্রহণ করতে সক্ষম হবে, যেটি ইভেন্ট বাসে সাবস্ক্রাইব করা হয়েছে।
ব্যবহার
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
public class EventExample {
// এই মেথডে @Subscribe অ্যানোটেশন ব্যবহার করা হয়েছে
@Subscribe
public void handleEvent(String eventMessage) {
System.out.println("Received event: " + eventMessage);
}
public static void main(String[] args) {
EventBus eventBus = new EventBus();
EventExample eventExample = new EventExample();
// ইভেন্ট বাসে সাবস্ক্রাইব করা
eventBus.register(eventExample);
// ইভেন্ট পোস্ট করা
eventBus.post("Hello, Guava Event!");
}
}
এখানে, handleEvent() মেথডে @Subscribe অ্যানোটেশন দেওয়া হয়েছে। যখন eventBus.post() কল করা হয়, তখন এই মেথডটি "Hello, Guava Event!" মেসেজটি গ্রহণ করবে।
কেন ব্যবহার করবেন?
- ডিকুপলড কমিউনিকেশন: একাধিক ক্লাস বা কম্পোনেন্টের মধ্যে ডেটা শেয়ারিংয়ের জন্য ইভেন্ট বাস ব্যবহৃত হয়, যা কোডের গঠনকে সহজ এবং পরিষ্কার রাখে।
- অ্যাসিনক্রোনাস প্রসেসিং: এটি একটি অ্যাসিনক্রোনাস মেকানিজম তৈরি করতে সাহায্য করে, যার মাধ্যমে এক ক্লাস অন্য ক্লাসের অবস্থান সম্পর্কে জানে না, কিন্তু ইভেন্ট প্রেরণ করে এবং প্রাপ্ত করে।
- অনেক ইভেন্ট হ্যান্ডলিং: বিভিন্ন ধরনের ইভেন্ট একটি ক্লাসে বা একাধিক ক্লাসে একই সময়ে সাবস্ক্রাইব করা যেতে পারে।
@AllowConcurrentEvents অ্যানোটেশন
@AllowConcurrentEvents অ্যানোটেশনটি ইভেন্ট হ্যান্ডলার মেথডে ব্যবহৃত হয়, যখন আপনি চান যে একই সময়ে একাধিক থ্রেড একই ইভেন্টটি প্রসেস করতে সক্ষম হোক। ডিফল্টভাবে, গুয়াভা ইভেন্ট বাস একই সময়ে একাধিক থ্রেডে ইভেন্ট প্রসেস করার অনুমতি দেয় না। তবে এই অ্যানোটেশনটি ইভেন্ট হ্যান্ডলার মেথডে অ্যাপ্লাই করলে একাধিক থ্রেডের মাধ্যমে ইভেন্ট প্রসেস করা সম্ভব হয়।
ব্যবহার
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.common.eventbus.AllowConcurrentEvents;
public class ConcurrentEventExample {
// এই মেথডে @Subscribe এবং @AllowConcurrentEvents অ্যানোটেশন ব্যবহার করা হয়েছে
@Subscribe
@AllowConcurrentEvents
public void handleConcurrentEvent(String eventMessage) {
System.out.println(Thread.currentThread().getName() + " - Received event: " + eventMessage);
}
public static void main(String[] args) {
EventBus eventBus = new EventBus();
ConcurrentEventExample eventExample = new ConcurrentEventExample();
// ইভেন্ট বাসে সাবস্ক্রাইব করা
eventBus.register(eventExample);
// একাধিক থ্রেডে ইভেন্ট পোস্ট করা
for (int i = 0; i < 5; i++) {
final int index = i;
new Thread(() -> eventBus.post("Event " + index)).start();
}
}
}
এখানে, handleConcurrentEvent() মেথডে @AllowConcurrentEvents অ্যানোটেশন দেওয়া হয়েছে, যা নিশ্চিত করে যে একই সময়ে একাধিক থ্রেড ইভেন্ট প্রসেস করতে পারে।
কেন ব্যবহার করবেন?
- থ্রেড-সেফ প্রসেসিং: যখন একাধিক থ্রেডে একই ইভেন্ট প্রসেস করার প্রয়োজন হয়,
@AllowConcurrentEventsব্যবহার করা হয়। এটি ইভেন্ট হ্যান্ডলিংয়ের ক্ষেত্রে থ্রেড-সেফ কাজ করার সুযোগ দেয়। - পারফরম্যান্স উন্নতি: একাধিক থ্রেডে ইভেন্ট প্রসেস করা হলে, পারফরম্যান্স উন্নত হতে পারে কারণ আপনি একাধিক কাজ একই সময়ে সম্পন্ন করতে পারেন।
@Subscribe এবং @AllowConcurrentEvents এর মধ্যে পার্থক্য
@Subscribe: ইভেন্ট বাসের মাধ্যমে সাবস্ক্রাইব করার জন্য ব্যবহৃত হয় এবং এটি ইভেন্ট হ্যান্ডলিং মেথড চিহ্নিত করে।@AllowConcurrentEvents: এটি নিশ্চিত করে যে ইভেন্ট হ্যান্ডলার মেথডটি একাধিক থ্রেডে নিরাপদে চলতে পারে।
ব্যবহার উদাহরণ
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.common.eventbus.AllowConcurrentEvents;
public class EventBusExample {
// @Subscribe এবং @AllowConcurrentEvents এর ব্যবহার
@Subscribe
@AllowConcurrentEvents
public void handleEvent(String event) {
System.out.println("Thread " + Thread.currentThread().getName() + " received: " + event);
}
public static void main(String[] args) {
EventBus eventBus = new EventBus();
EventBusExample example = new EventBusExample();
// EventBus এ সাবস্ক্রাইব করা
eventBus.register(example);
// ইভেন্ট পোস্ট করার জন্য থ্রেড তৈরি করা
for (int i = 0; i < 3; i++) {
final int eventNumber = i;
new Thread(() -> eventBus.post("Event " + eventNumber)).start();
}
}
}
এখানে, তিনটি থ্রেড একসাথে ইভেন্ট পোস্ট করছে এবং প্রতিটি থ্রেড সেই ইভেন্টটি গ্রহণ করছে।
@Subscribe এবং @AllowConcurrentEvents ইভেন্ট বাস ব্যবস্থাপনায় ইভেন্ট হ্যান্ডলার মেথডগুলো সাবস্ক্রাইব এবং একাধিক থ্রেডে নিরাপদে কার্যকরী হতে সাহায্য করে। এগুলি গুয়াভার ইভেন্ট ড্রিভেন আর্কিটেকচার তৈরি করার ক্ষেত্রে অত্যন্ত গুরুত্বপূর্ণ, যেখানে ইভেন্ট সিস্টেমের মাধ্যমে কম্পোনেন্টগুলো একে অপরের সাথে যোগাযোগ করতে পারে।
Read more