Erhalten Sie Unfälle durch NotificationIRP in OSS

  • Tutorial
Guten Tag. In einer früheren Veröffentlichung wurde ein Verfahren zum Erhalten aktiver Alarme über AlarmIRP betrachtet. Überlegen Sie als Nächstes, wie Sie mit NotificationIRP Alarmmeldungen erhalten. Im Beispiel verwenden wir Nokias NetAct.

Im Vergleich zu AlarmIRP müssen Sie bei der in diesem Artikel behandelten Schnittstelle neben dem Erstellen eines CORBA-Clients auch einen "CORBA-Server" erstellen, der eingehende Nachrichten von NotificationIRP verarbeitet. Dieser „Server“ sollte unter anderem die Methode push_structured_events implementieren, an die der OSS die Ereignisse in Form von StructuredEvent [] überträgt . Dafür brauchen wir folgende Klasse:

privateclassIRPManagerextendsorg.omg.CosNotifyComm.SequencePushConsumerPOA{
	@Overridepublicvoidpush_structured_events(StructuredEvent[] notifications)throws org.omg.CosEventComm.Disconnected {
		for (StructuredEvent alarm: notifications) {
			alarmPrint(alarm);
		}
	}
	@Overridepublicvoidoffer_change(EventType[] arg0, EventType[] arg1)throws org.omg.CosNotifyComm.InvalidEventType {
		System.out.println("Offer Change!");
	}
	@Overridepublicvoiddisconnect_sequence_push_consumer(){
		System.out.println("Disconnected!");
	}
}

Die alarmPrint-Methode ähnelt der aus dem vorherigen Artikel. Am Ende wird der vollständige Code des gesamten Projekts angehängt.

Jetzt müssen Sie diese Klasse mit der Funktionalität des ORB-Servers "umschließen", NotificationIRP abrufen und eine Verknüpfung zum empfangenen Objekt übergeben.

_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();

Um den ORB auszuführen, verwenden wir einen Unterprozess:
privateclassnotificationThreadextendsThread{
	publicvoidrun(){
		_notificationOrb.run();
		}
}

OSS wird uns keine Mitteilung nach der Zeit senden TIMETICK oder bis wir diese Methode verlassen den Aufruf einen detach . Wenn wir nach Ablauf des Timers Nachrichten empfangen müssen, müssen wir das System mit der Methode get_subscription_status informieren . Wenn Sie ihn anrufen, beginnt der Timer erneut zu zählen.
Es bleibt alles zusammen zu sammeln, die erforderlichen Bibliotheken in NetAct zu finden und eine Verbindung zu der virtuellen Maschine herzustellen, auf der der nbi3gc- Server ausgeführt wird (da das IOR in diesem Beispiel aus der Datei gelesen wird). Um das vorgeschlagene Beispiel auszuführen, verwenden wir den Befehl:
java -cp .: jacorb-3.1.jar: jacorb-services-3.1.jar: nbi3gc-internal-corba-interface-17.8.0.158.jar AlarmClient

Unter dem Spoiler der vollständige Code des Beispiels
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;
publicclassAlarmClient{
	private com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.NotificationIRP _notifIrp = null;
	public String alarmFilter ="";
	privatefinallong 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;
	publicint timetick = 15;
	publicstaticvoidmain(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;
	}
	privatevoidalarmPrint(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);
	}
	publicvoidstartNotifications(){
		_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();
		}
	}
	publicvoidstopNotifications(){
		try {
			_notifIrp.detach(_notifyServer, _attId);
			_notificationOrb.shutdown(true);
		} catch (com.nsn.oss.nbi.internal.corba.NotificationIRPSystem.DetachException | ParameterNotSupported
				| InvalidParameter e) {
			e.printStackTrace();
		}
	}
	publicintrenewSubscription(){
		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();
	}
	privateclassIRPManagerextendsorg.omg.CosNotifyComm.SequencePushConsumerPOA{
		@Overridepublicvoidpush_structured_events(StructuredEvent[] notifications)throws org.omg.CosEventComm.Disconnected {
			for (StructuredEvent alarm: notifications) {
				alarmPrint(alarm);
			}
		}
		@Overridepublicvoidoffer_change(EventType[] arg0, EventType[] arg1)throws org.omg.CosNotifyComm.InvalidEventType {
			System.out.println("Offer Change!");
		}
		@Overridepublicvoiddisconnect_sequence_push_consumer(){
			System.out.println("Disconnected!");
		}
	}
	privateclassnotificationThreadextendsThread{
		publicvoidrun(){
			_notificationOrb.run();
			}
	}
}

Vielen Dank für Ihre Aufmerksamkeit. Es stellte sich kurz heraus, aber meiner Meinung nach werden die wichtigsten Punkte berücksichtigt. Ich hoffe, diese Informationen werden nützlich sein. Fragen und Kommentare sind willkommen.

Jetzt auch beliebt: