你好 在以前的
出版物中 ,考虑了一种通过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(); } }
在时间
间隔到期之后 ,或者直到我们通过调用
detach方法
拒绝它
时 ,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(); } } }
谢谢您的关注。 结果很短暂,但我认为要点已经考虑在内,希望这些信息对您有所帮助。 欢迎提出问题和意见。