Здравствуйте. В предыдущей публикации был рассмотрен способ получения активных аварий через 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!");
}
}
_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();
private class notificationThread extends Thread {
public void run() {
_notificationOrb.run();
}
}
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();
}
}
}
К сожалению, не доступен сервер mySQL