مرحبًا. في
منشور سابق ، تم النظر في طريقة لتلقي الإنذارات النشطة من خلال AlarmIRP. بعد ذلك ، سنلقي نظرة على كيفية تلقي الإنذارات عند حدوثها باستخدام NotificationIRP. في المثال ، سنستخدم NetAct Nokia.
بالمقارنة مع AlarmIRP ، فإن الواجهة التي تم تناولها في هذه المقالة تتطلب منا ، بالإضافة إلى إنشاء عميل CORBA ، إنشاء "خادم CORBA" الذي سيعالج الرسائل من NotificationIRP. يجب على "الخادم" هذا ، من بين أمور أخرى ، تنفيذ طريقة
push_structured_events التي سينقل إليها OSS الأحداث في شكل
StructuredEvent [] . للقيام بذلك ، نحتاج إلى الفئة التالية:
private class IRPManager extends org.omg.CosNotifyComm.SequencePushConsumerPOA{ @Override public void push_structured_events(StructuredEvent[] notifications) throws org.omg.CosEventComm.Disconnected { for (StructuredEvent alarm: notifications) { alarmPrint(alarm); } } @Override public void offer_change(EventType[] arg0, EventType[] arg1) throws org.omg.CosNotifyComm.InvalidEventType { System.out.println("Offer Change!"); } @Override public void disconnect_sequence_push_consumer() { System.out.println("Disconnected!"); } }
تشبه طريقة alarmPrint نفس الاسم من المقالة السابقة. في النهاية ، سيتم إرفاق الرمز الكامل للمشروع بأكمله.
تحتاج الآن إلى "لف" هذه الفئة بوظيفة خادم ORB ، والحصول على NotificationIRP وتمريرها إلى الكائن المستلم.
_irpMan = new IRPManager(); _notificationOrb = ORB.init(new String[0], null); org.omg.CORBA.ORB orb = ORB.init(new String[0], null); org.omg.CORBA.Object rootObj = orb.string_to_object(readIOR()); _notifIrp = com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRPHelper.narrow(rootObj); POA poa; poa = POAHelper.narrow(_notificationOrb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); _notifySrvr = poa.servant_to_reference(_irpMan); _notifyServer = _notificationOrb.object_to_string(_notifySrvr);
لتشغيل ORB ، سنستخدم عملية فرعية:
private class notificationThread extends Thread { public void run() { _notificationOrb.run(); } }
سيتوقف OSS عن إرسال إشعارات إلينا بعد
انتهاء صلاحية الجدول الزمني ، أو حتى
نرفض ذلك عن طريق استدعاء طريقة الفصل. إذا كنا بحاجة إلى تلقي الرسائل بعد انتهاء الموقت ، فيجب إبلاغ النظام بذلك باستخدام طريقة
get_subscription_status . عندما يتم استدعاؤه ، سيبدأ المؤقت العد التنازلي مرة أخرى.
يبقى جمع كل شيء معًا ، والعثور على المكتبات المطلوبة في NetAct والاتصال بالجهاز الظاهري الذي
يعمل عليه خادم
nbi3gc (نظرًا لأن IOR في هذا المثال الذي
نقرأه من الملف). لتشغيل المثال المقترح ، سنستخدم الأمر:
java-cp .: jacorb-3.1.jar: jacorb-services-3.1.jar: nbi3gc-internal-corba-interface-17.8.0.158.jar AlarmClient
تحت المفسد ، رمز المثال الكامل import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.omg.CORBA.IntHolder; import org.omg.CORBA.ORB; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNotification.EventType; import org.omg.CosNotification.Property; import org.omg.CosNotification.StructuredEvent; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POAManagerPackage.AdapterInactive; import org.omg.PortableServer.POAPackage.ServantNotActive; import org.omg.PortableServer.POAPackage.WrongPolicy; import org.omg.TimeBase.UtcT; import org.omg.TimeBase.UtcTHelper; import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPConstDefs.StringTypeOpt; import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPConstDefs.StringTypeOptHolder; import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.InvalidParameter; import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.OperationNotSupported; import com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.ParameterNotSupported; import com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.NotificationTypesSetHolder; import com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.GetNotificationCategories; public class AlarmClient { private com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRP _notifIrp = null; public String alarmFilter =""; private final long UNIX_OFFSET = 122192928000000000L; public String delimiter = ";"; private org.omg.CORBA.ORB _notificationOrb = null; private String _notifyServer = null; private org.omg.CORBA.Object _notifySrvr = null; private String _attId = ""; private IRPManager _irpMan = null; public int timetick = 15; public static void main(String[] args) { AlarmClient ac = new AlarmClient(); ac.startNotifications(); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } ac.stopNotifications(); } private String readIOR(String iorType) { File f = new File("/d/oss/global/var/NSN-nbi3gc/ior/NotificationIRP.ior"); BufferedReader br; String iorContents = null; try { br = new BufferedReader(new FileReader(f)); iorContents = br.readLine(); br.close(); } catch (IOException e) { e.printStackTrace(); } return iorContents; } private void alarmPrint(StructuredEvent alarm){ String result = ""; UtcT timeValue = null; Date dt; DateFormat df; if (alarm.filterable_data != null) { for (Property filterableData: alarm.filterable_data) { String fieldName = filterableData.name; switch (fieldName){ case "b": timeValue = UtcTHelper.extract(filterableData.value); dt = new Date((timeValue.time - UNIX_OFFSET) / 10000); df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); result = result + df.format(dt) + delimiter; break; case "e": result = result + filterableData.value.extract_string() + delimiter; break; case "i": result = result + filterableData.value.extract_string() + delimiter; break; } } } System.out.println(result); } public void startNotifications(){ _irpMan = new IRPManager(); _notificationOrb = ORB.init(new String[0], null); org.omg.CORBA.ORB orb = ORB.init(new String[0], null); org.omg.CORBA.Object rootObj = orb.string_to_object(readIOR("NotificationIRP")); _notifIrp = com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRPHelper.narrow(rootObj); POA poa; try { poa = POAHelper.narrow(_notificationOrb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); _notifySrvr = poa.servant_to_reference(_irpMan); _notifyServer = _notificationOrb.object_to_string(_notifySrvr); String[] aCat = _notifIrp.get_notification_categories(new NotificationTypesSetHolder()); StringTypeOpt alarmFltr = new StringTypeOpt(); alarmFltr.value(alarmFilter); _attId = _notifIrp.attach_push(_notifyServer, timetick, aCat, alarmFltr, ""); (new notificationThread()).start(); } catch (InvalidName | AdapterInactive | ParameterNotSupported | com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupported | InvalidParameter | com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.Attach | com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.AlreadySubscribed | ServantNotActive | WrongPolicy | GetNotificationCategories | OperationNotSupported e) { e.printStackTrace(); } } public void stopNotifications() { try { _notifIrp.detach(_notifyServer, _attId); _notificationOrb.shutdown(true); } catch (com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.DetachException | ParameterNotSupported | InvalidParameter e) { e.printStackTrace(); } } public int renewSubscription() { com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.SubscriptionStateHolder arg2 = new com.nsn.oss.nbi.internal.corba.NotificationIRPConstDefs.SubscriptionStateHolder(); IntHolder arg3 = new IntHolder(); StringTypeOptHolder arg1 = new StringTypeOptHolder(); arg1.value.value(alarmFilter); try { _notifIrp.get_subscription_status(_attId, arg1, arg2, arg3); } catch (InvalidParameter | com.nsn.oss.nbi.internal.corba.ManagedGenericIRPSystem.OperationNotSupported | com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.GetSubscriptionStatus e) { e.printStackTrace(); } return arg2.value.value(); } private class IRPManager extends org.omg.CosNotifyComm.SequencePushConsumerPOA{ @Override public void push_structured_events(StructuredEvent[] notifications) throws org.omg.CosEventComm.Disconnected { for (StructuredEvent alarm: notifications) { alarmPrint(alarm); } } @Override public void offer_change(EventType[] arg0, EventType[] arg1) throws org.omg.CosNotifyComm.InvalidEventType { System.out.println("Offer Change!"); } @Override public void disconnect_sequence_push_consumer() { System.out.println("Disconnected!"); } } private class notificationThread extends Thread { public void run() { _notificationOrb.run(); } } }
شكرا لكم على اهتمامكم. اتضح لفترة وجيزة ، ولكن ، في رأيي ، يتم النظر في النقاط الرئيسية ، وآمل أن تكون هذه المعلومات مفيدة. الأسئلة والتعليقات مرحب بها.