Interceptors হল EJB (Enterprise JavaBeans) এবং Java EE (Enterprise Edition) এর একটি শক্তিশালী ফিচার যা অ্যাপ্লিকেশনটির কার্যক্রমে (method invocations) হস্তক্ষেপ করার জন্য ব্যবহৃত হয়। Interceptors ব্যবহার করে আপনি একটি মেথড কলের আগে বা পরে অতিরিক্ত কার্যকলাপ সম্পাদন করতে পারেন, যেমন লগিং, সিকিউরিটি চেক, ট্রানজেকশন ম্যানেজমেন্ট, বা অন্যান্য ক্রস-কাটিং কনসার্নস (cross-cutting concerns) সম্পাদন।
১. Interceptors এর ধারণা
Interceptors হল এমন ক্লাস বা মেথড যা এক বা একাধিক business method এর আগে বা পরে স্বয়ংক্রিয়ভাবে কার্যকরী হয়। Interceptors সাধারণত AOP (Aspect-Oriented Programming) এর একটি অংশ হিসেবে ব্যবহৃত হয়, যেখানে আপনি কোডের প্রধান কার্যাবলীর (core logic) বাইরে কিছু ক্রস-কাটিং কনসার্ন (যেমন লগিং, সিকিউরিটি চেক, ট্রানজেকশন) ম্যানেজ করতে পারেন।
EJB, CDI (Contexts and Dependency Injection), এবং JAX-RS (Java API for RESTful Web Services) এর মতো Java EE ফ্রেমওয়ার্কে Interceptors ব্যাপকভাবে ব্যবহৃত হয়।
২. Interceptors এর কাজ
Interceptors একটি method invocation এর আগে বা পরে কার্যকরী হয় এবং বিভিন্ন ক্রস-কাটিং কার্যাবলী যেমন:
- Logging
- Transaction management
- Security checks
- Monitoring
- Performance tracking
- Error handling ইত্যাদি।
এগুলি অ্যাপ্লিকেশন লজিকের থেকে পৃথকভাবে কাজ করে, ফলে আপনার মূল কোড আরও পরিষ্কার এবং সহজে রক্ষণাবেক্ষণযোগ্য হয়।
৩. Interceptors এর ধরন
EJB এবং CDI Context এ সাধারণত দুটি ধরনের Interceptors ব্যবহৃত হয়:
- Method Interceptors: একটি নির্দিষ্ট মেথডের আগে বা পরে কার্যকরী হয়।
- Lifecycle Interceptors: EJB Bean lifecycle (যেমন
@PostConstruct,@PreDestroy) এর আগে বা পরে কার্যকরী হয়।
৪. Interceptors উদাহরণ
৪.১ Method Interceptor উদাহরণ
এখানে একটি method interceptor এর উদাহরণ দেওয়া হলো যেখানে একটি লগিং ইন্টারসেপ্টর তৈরি করা হয়েছে। ইন্টারসেপ্টরটি ক্লায়েন্টের মেথড কলের আগে এবং পরে লগিং করবে।
৪.১.১ LoggingInterceptor.java (Interceptor ক্লাস)
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
@Interceptor
public class LoggingInterceptor {
@AroundInvoke
public Object logMethodCall(InvocationContext context) throws Exception {
// মেথড কলের আগে লগ করা
System.out.println("Method called: " + context.getMethod().getName());
// মেথড কল করা
Object result = context.proceed();
// মেথড কলের পরে লগ করা
System.out.println("Method execution finished: " + context.getMethod().getName());
return result;
}
}
এখানে, @Interceptor অ্যানোটেশন দিয়ে LoggingInterceptor ক্লাসটিকে একটি ইন্টারসেপ্টর হিসেবে চিহ্নিত করা হয়েছে। @AroundInvoke অ্যানোটেশন দিয়ে logMethodCall মেথডটি বলছে যে এটি যেকোনো মেথডের আগে এবং পরে কার্যকর হবে।
৪.১.২ BusinessBean.java (EJB ক্লাস)
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors(LoggingInterceptor.class)
public class BusinessBean {
public void processBusinessLogic() {
System.out.println("Processing business logic...");
}
}
এখানে, @Interceptors(LoggingInterceptor.class) অ্যানোটেশন দিয়ে BusinessBean ক্লাসে LoggingInterceptor ইন্টারসেপ্টরটি যুক্ত করা হয়েছে। এর ফলে, যখন processBusinessLogic() মেথড কল করা হবে, তখন ইন্টারসেপ্টরটি মেথড কলের আগে এবং পরে লগ করবে।
৪.১.৩ EJBClient.java (Client ক্লাস)
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBClient {
public static void main(String[] args) throws NamingException {
Context context = new InitialContext();
BusinessBean businessBean = (BusinessBean) context.lookup("java:global/myapp/BusinessBean");
// Method invocation, logging will happen before and after execution
businessBean.processBusinessLogic();
}
}
এখানে, EJBClient ক্লাসে processBusinessLogic() মেথড কল করার সাথে সাথে LoggingInterceptor ইন্টারসেপ্টরটির কার্যকলাপ শুরু হবে, যা মেথডের আগে এবং পরে লগিং করবে।
৪.২ Lifecycle Interceptor উদাহরণ
EJB এ লাইফসাইকেল ইন্টারসেপ্টর ব্যবহার করা হয়, যা EJB কম্পোনেন্টের জীবনচক্রের বিভিন্ন পর্যায়ে কার্যকরী হয়। উদাহরণস্বরূপ, @PostConstruct এবং @PreDestroy ইন্টারসেপ্টর ব্যবহার করা যেতে পারে।
৪.২.১ LifecycleInterceptor.java (Lifecycle Interceptor)
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
@Interceptor
public class LifecycleInterceptor {
@PostConstruct
public void init(InvocationContext context) throws Exception {
System.out.println("Initializing bean: " + context.getTarget());
}
@PreDestroy
public void destroy(InvocationContext context) throws Exception {
System.out.println("Destroying bean: " + context.getTarget());
}
}
এখানে, @PostConstruct এবং @PreDestroy অ্যানোটেশন ব্যবহার করা হয়েছে যাতে Bean এর জীবনচক্রের শুরু এবং শেষের সময় ইন্টারসেপ্টর কার্যকরী হয়।
৪.২.২ BusinessBean.java (EJB ক্লাস)
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors(LifecycleInterceptor.class)
public class BusinessBean {
public void processBusinessLogic() {
System.out.println("Processing business logic...");
}
}
এখানে, BusinessBean ক্লাসে LifecycleInterceptor ইন্টারসেপ্টর যুক্ত করা হয়েছে যাতে @PostConstruct এবং @PreDestroy মেথডগুলো স্বয়ংক্রিয়ভাবে কল হয়।
৪.২.৩ EJBClient.java (Client ক্লাস)
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBClient {
public static void main(String[] args) throws NamingException {
Context context = new InitialContext();
BusinessBean businessBean = (BusinessBean) context.lookup("java:global/myapp/BusinessBean");
// Calling method which will trigger PostConstruct and PreDestroy lifecycle callbacks
businessBean.processBusinessLogic();
}
}
এখানে, BusinessBean এর processBusinessLogic() মেথড কল করার সাথে সাথে LifecycleInterceptor ক্লাসের @PostConstruct এবং @PreDestroy মেথডগুলো কল হবে।
৫. Interceptors এর ব্যবহারের সুবিধা
- Code Reusability: Interceptors ব্যবহারের মাধ্যমে আপনি একাধিক EJB বা মেথডে পুনরায় একই ধরনের কোড (যেমন লগিং, সিকিউরিটি চেক) ব্যবহার করতে পারেন, যা কোড পুনরাবৃত্তি (code duplication) কমায়।
- Separation of Concerns: Interceptors ক্রস-কাটিং কনসার্ন (যেমন সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট, লগিং) আলাদাভাবে পরিচালনা করতে সহায়তা করে, ফলে মূল ব্যবসায়িক লজিক (business logic) পরিষ্কার থাকে।
- Cleaner Business Logic: Interceptors ব্যবহার করলে ব্যবসায়িক লজিকের কোড সহজ, পরিষ্কার এবং কার্যকরী হয়, কারণ ক্রস-কাটিং কনসার্নগুলি আলাদাভাবে পরিচালিত হয়।
সারাংশ
Interceptors হল EJB এবং Java EE অ্যাপ্লিকেশনে ব্যবহার করা একটি শক্তিশালী ফিচার, যা মেথড কলের আগে বা পরে অতিরিক্ত কার্যাবলী সম্পাদন করতে সাহায্য করে। এগুলি লগিং, সিকিউরিটি চেক, এবং অন্যান্য ক্রস-কাটিং কনসার্নগুলি পরিচালনা করার জন্য ব্যবহৃত হয়। Interceptors ব্যবহার করার মাধ্যমে আপনি AOP (Aspect-Oriented Programming) ধারণা প্রয়োগ করতে পারেন এবং আপনার অ্যাপ্লিকেশনটির কোড আরও পরিষ্কার ও রক্ষণাবেক্ষণযোগ্য করতে পারেন। EJB এবং CDI (Contexts and Dependency Injection) এ ইন্টারসেপ্টর ব্যবহারের উদাহরণ এবং এর কার্যকারিতা আগের উদাহরণে দেখানো হয়েছে।
Read more