Obtendo acidentes através do NotificationIRP no OSS

Olá. Em uma publicação anterior, um método para receber alarmes ativos através do AlarmIRP foi considerado. A seguir, veremos como receber alarmes à medida que ocorrem usando o NotificationIRP. No exemplo, usaremos o NetAct Nokia.

Em comparação com o AlarmIRP, a interface considerada neste artigo exigirá que, além de criar um cliente CORBA, também crie um "servidor CORBA" que processe as mensagens do NotificationIRP. Esse "servidor", entre outras coisas, deve implementar o método push_structured_events para o qual o OSS transmitirá eventos na forma de StructuredEvent [] . Para fazer isso, precisamos da seguinte classe:

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!"); } } 

O método alarmPrint é semelhante ao mesmo nome do artigo anterior. No final, o código completo de todo o projeto será anexado.

Agora você precisa "agrupar" essa classe com a funcionalidade do servidor ORB, obter o NotificationIRP e passar um link para o objeto recebido.

 _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); //     String[] aCat = _notifIrp.get_notification_categories(new NotificationTypesSetHolder()); StringTypeOpt alarmFltr = new StringTypeOpt(); alarmFltr.value(alarmFilter); //   _attId = _notifIrp.attach_push(_notifyServer, timetick, aCat, alarmFltr, ""); // ORB   (new notificationThread()).start(); 

Para executar o ORB, usaremos um subprocesso:
 private class notificationThread extends Thread { public void run() { _notificationOrb.run(); } } 

O OSS deixará de nos enviar notificações depois que o horário expirar , ou até recusarmos isso chamando o método de desanexação . Se precisarmos receber mensagens depois que o cronômetro expirar, precisamos reportar isso ao sistema usando o método get_subscription_status . Quando é chamado, o timer inicia a contagem regressiva novamente.
Resta coletar tudo juntos, encontrar as bibliotecas necessárias no NetAct e conectar-se à máquina virtual na qual o servidor nbi3gc está sendo executado (desde o IOR neste exemplo, estamos lendo o arquivo). Para executar o exemplo proposto, usaremos o comando:
java -cp .: jacorb-3.1.jar: jacorb-services-3.1.jar: nbi3gc-internal-corba-interface-17.8.0.158.jar AlarmClient

Sob o spoiler, o código de exemplo completo
 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(); } } } 

Obrigado pela atenção. Acabou por ser breve, mas, na minha opinião, os principais pontos são considerados, espero que esta informação seja útil. Perguntas e comentários são bem-vindos.

Source: https://habr.com/ru/post/pt423583/


All Articles