Здравствуйте. В предыдущей публикации был рассмотрен способ получения активных аварий через 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);
//получили ссылку на наш сервер
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();

Для запуска ORB будем использовать подпроцесс:
private class notificationThread extends Thread {
	public void run() {
		_notificationOrb.run();
		}
}

OSS перестанет отправлять нам нотификации по истечении времени timetick, либо пока мы не откажемся от этого вызвав метод detach. Если нам понадобится получать сообщения после истечения таймера, нужно сообщить об этом системе используя метод 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();
			}
	}

}

Спасибо за внимание. Получилось кратко, но, на мой взгляд, основные моменты рассмотрены, надеюсь данная информация будет полезной. Вопросы и комментарии приветствуются.

Комментарии (0)