The OMG Notification Service specifies three kinds of pre-defined event channels: Untyped, 
Structured, and 
Sequence. The advantage of pre-defined channels is that they are easy for user level implementations. Therefore, almost all notification service products on the market support pre-defined channels. The disadvantage of pre-defined channels are:
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      The following push consumer example is located in 
<install_dir>/examples/vbroker/notify/basic_cpp/structPushConsumer.C.
 
      // 1. Implementing the push consumer servant
class StructuredPushConsumerImpl : public POA_CosNotifyComm::StructuredPushConsumer, public virtual PortableServer::RefCountServantBase
   {
		...
		public:
		...		
void push_structured_event(const CosNotification::StructuredEvent&
			event) { ... }
      ...
   };
// The consumer server
int main(int argc, char** argv) 
{
	// get orb and POA ...
	...
	// construct a push consumer servant
	StructuredPushConsumerImpl* servant = new StructuredPushConsumerImpl;
// 2. Activate the consumer servant on a POA
poa->activate_object(servant);
// 3. Activate the POA
poa->the_POAManager()->activate();
       ...
// 4. Somehow, we get the channel from somewhere
CosNotifyChannelAdmin::EventChannel_var channel = ...;
// 5. Somehow, we decide to use the default admin
CosNotifyChannelAdmin::ConsumerAdmin_var admin = 
		channel->default_consumer_admin();
// 6. Obtain a proxy push supplier from the admin
CosNotifyChannelAdmin::ProxyID pxy_id;
CosNotifyChannelAdmin::ProxySupplier_var proxy = 
		admin->obtain_notification_push_supplier(
			CosNotifyChannelAdmin::STRUCTURED_EVENT, pxy_id);
CosNotifyChannelAdmin::StructuredProxyPushSupplier_var supplier =
		CosNotifyChannelAdmin::StructuredProxyPushSupplier::_narrow(proxy);
// 7. Get consumer object reference and connect it to the proxy
CORBA::Object_var obj = poa->servant_to_reference(servant);
CosNotifyComm::StructuredPushConsumer_var consumer
		= CosNotifyComm::StructuredPushConsumer::_narrow(obj);
supplier->connect_structured_push_consumer(consumer);
// working loop
orb->run();
   }
 
      
      The following push consumer example is located in 
<install_dir>/examples/vbroker/notify/basic_java/structPushConsumer.java.
 
      
      // 1. Implement the push consumer servant
     public void push_structured_event(StructuredEvent event) { ... }
      ...
     public static int main(String[] args) {
// get orb and POA ...
       ...
// construct a push consumer servant
       StructPushConsumerImpl servant = new StructPushConsumerImpl();
// 2. Activate the consumer servant on a POA
       poa.activate_object(servant);
// 3. Activate the POA
       poa.the_POAManager().activate();
       ...
// 4. Somehow, we get the channel from somewhere
       EventChannel channel = ...;
// 5. Somehow, we decide to use the default admin
       ConsumerAdmin admin = channel.default_consumer_admin();
// 6. Obtain a proxy push supplier from the admin
ProxyIDHolder pxy_id = new ProxyIDHolder();
ProxySupplier proxy = admin.obtain_notification_push_supplier(
		ClientType.STRUCTURED_EVENT, pxy_id);
StructuredProxyPushSupplier supplier
		= StructuredProxyPushSupplierHelper.narrow(proxy);
// 7. Get consumer object reference and connect it to the proxy
org.omg.CORBA::Object obj = poa.servant_to_reference(servant);
StructuredPushConsumer consumer = StructuredPushConsumerHelper.narrow(obj);
		supplier.connect_structured_push_consumer(consumer);
// working loop
orb.run();
    }
  }
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      The following pull consumer example is located in 
<install_dir>/examples/vbroker/notify/basic_cpp/structPullConsumer.C.
 
      // The consumer client
int main(int argc, char** argv) 
{
	// get orb ...
	...
// 1. Somehow, we get the channel from somewhere
	CosNotifyChannelAdmin::EventChannel_var channel = ...;
// 2. Somehow, we decide to use the default admin
	CosNotifyChannelAdmin::ConsumerAdmin_var admin 				= 
		channel->default_consumer_admin();
// 3. Obtain a proxy pull supplier from the admin
	CosNotifyChannelAdmin::ProxyID pxy_id;
	CosNotifyChannelAdmin::ProxySupplier_var proxy = 
	admin->obtain_notification_pull_supplier(
		CosNotifyChannelAdmin::STRUCTURED_EVENT, pxy_id);
	CosNotifyChannelAdmin::StructuredProxyPullSupplier_var supplier =
	 CosNotifyChannelAdmin::StructuredProxyPullSupplier::_narrow(proxy);
// 4. Connect to the proxy
	supplier->connect_structured_pull_consumer(NULL);
// 5. Pull events from the proxy pull supplier
	for(int i=0;i<100;i++) {
		CosNotification::StructuredEvent_var event;
		event = supplier->pull_structured_event();
	 ...
	}  
// 6. Gracefully cleanup
	supplier->disconnect_structured_pull_supplier();
   }
 
      
      The following pull consumer example is located in 
<install_dir>/examples/vbroker/notify/basic_java/structPullConsumer.java.
 
      
      		StructuredProxyPullSupplierHelper.narrow(proxy);
	// 4. Connect to the proxy
	supplier.connect_structured_pull_consumer(null);	
// 5. Pull events from the proxy pull supplier
	for(int i=0;i<100;i++) {
		StructuredEvent event = supplier.pull_structured_event();
		...
		}  	
// 6. Gracefully cleanup
	supplier.disconnect_structured_pull_supplier();
	}
}
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      The push supplier example is located in examples/vbroker/notify/basic_cpp/structPushSupplier.C.
 
      // The push supplier client
int main(int argc, char** argv) 
{
	// get orb ...
	...
	// 1. Somehow, we get the channel from somewhere
	CosNotifyChannelAdmin::EventChannel_var channel = ...;	
// 2. Somehow, we decide to use the default admin
	CosNotifyChannelAdmin::SupplierAdmin_var admin = 
	channel->default_supplier_admin();	
// 3. Obtain a proxy push consumer from the admin
	CosNotifyChannelAdmin::ProxyID pxy_id;
	CosNotifyChannelAdmin::ProxyConsumer_var proxy = 
	admin->obtain_notification_push_consumer(
		CosNotifyChannelAdmin::STRUCTURED_EVENT, pxy_id);
	CosNotifyChannelAdmin::StructuredProxyPushConsumer_var consumer
		 = CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow(proxy);
	// 4. Connect to the proxy
	consumer->connect_structured_push_supplier(NULL);	
// 5. Push events to the proxy push consumer
	for(int i=0;i<100;i++) {
		CosNotification::StructuredEvent_var event = ...;
		consumer->push_structured_event(event);
	}  	
// 6. Gracefully cleanup
	consumer->disconnect_structured_push_consumer();
}
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      The pull supplier example is located in examples/vbroker/notify/basic_cpp/structPullSupplier.C.
 
      // 1. Implement the pull supplier servant
class StructuredPullSupplierImpl : public
		POA_CosNotifyComm::StructuredPullSupplier, public virtual
		PortableServer::RefCountServantBase 
	{
		...
		public:
		...			
CosNotification::StructuredEvent* pull_structured_event() { ... }
			CosNotification::StructuredEvent* try_pull_structured_event(
					CORBA::Boolean& has_event) { ... }
      ...
   };
	// The supplier server
	int main(int argc, char** argv) 
   {
		// get orb and POA ...
       ...
		// Construct a pull supplier servant
		StructuredPullSupplierImpl* servant = new StructuredPullSupplierImpl;		
// 2. Activate the consumer servant on a POA
		poa->activate_object(servant);		
// 3. Activate the POA
		poa->the_POAManager()->activate();
       ...		
// 4. Somehow, we get the channel from somewhere
		CosNotifyChannelAdmin::EventChannel_var channel = ...;		
// 5. Somehow, we decide to use the default admin
		CosNotifyChannelAdmin::SupplierAdmin_var admin = channel
				->default_supplier_admin();		
// 6. Obtain a proxy pull consumer from the admin
		CosNotifyChannelAdmin::ProxyID pxy_id;
		CosNotifyChannelAdmin::ProxyConsumer_var proxy = admin
				->obtain_notification_pull_consumer(
					CosNotifyChannelAdmin::STRUCTURED_EVENT, pxy_id);
		CosNotifyChannelAdmin::StructuredProxyPullConsumer_var consumer =
				CosNotifyChannelAdmin::StructuredProxyPullConsumer::_narrow(proxy);
		// 7. Get supplier object reference and connect it to the proxy
		CORBA::Object_var obj = poa->servant_to_reference(servant);
		CosNotifyComm::StructuredPullSupplier_var supplier
            = CosNotifyComm::StructuredPullSupplier::_narrow(obj);
		consumer->connect_structured_pull_supplier(supplier);
		// working loop
		orb->run();
   }
 
      
      The pull supplier example is located in examples/vbroker/notify/basic_java/structPullSupplier.java.
 
      import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin,*;
import org.omg.CosNotification.*;
class structPullSupplierImpl extends StructuredPullSupplierPOA
{
	...
	// 1. Implement the push consumer servant
	public StructuredEvent pull_structured_event() { ... }
	public StructuredEvent try_pull_structured_event(
			org.omg.CORBA.BooleanHolder has_event) {...}
	...
	public static int main(String[] args) {
		// Get orb and POA ...
		...
		// A pull supplier servant
		structPullSupplierImpl servant = new structPullSupplierImpl();
		// 2. Activate the supplier servant on a POA
		poa.activate_object(servant);
		// 3. Activate the POA
		poa.the_POAManager()Activate();
		...
		// 4. Somehow, we get the channel from somewhere
		EventChannel channel = ...;
		// 5. Somehow, we decide to use the default admin
		ConsumerAdmin admin = channel.default_supplier_admin();
		// 6. Obtain a proxy pull consumer from the admin
		ProxyIDHolder pxy_id = new ProxyIDHolder();
		ProxyConsumer proxy = admin.obtain_notification_pull_consumer(
				ClientType.STRUCTURED_EVENT, pxy_id);
		StructuredProxyPullConsumer consumer =
				StructuredProxyPullConsumerHelper.narrow(proxy);
		// 7. Get supplier object reference and connect it to the proxy
		org.omg.CORBA::Object obj = poa.servant_to_reference(servant);
		StructuredPullSupplier supplier =
				StructuredPullSupplierHelper.narrow(obj);
		consumer.connect_structured_pull_supplier(supplier);
		// working loop
		orb.run();
	}
}
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      VisiBroker Publish/Subscribe Adapter (PSA) architecture resolves these two issues. See “Using the Publish Subscribe Adapter (PSA)” for additional information. The PSA simplifies and unifies the connection procedure to notification and typed notification services. It also presents an elegant solution for typed pulling.
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      The typed push consumer example is located in examples/vbroker/notify/basic_cpp/typedPushConsumer.C.
 
      // 1. Implement the user defined typed consumer servant
class TMNTypedEventImpl : public POA_TMN::TypedEvent, 
			public virtual PortableServer::RefCountServantBase
{
	...
	public:
	...
	void attributeValueChange (...) { ... }
	void qosAlarm(...) { ... }
	...
};
// 2. Implement the handler servant
class HandlerImpl : public POA_CosTypedNotifyComm::TypedPushConsumer,
			public virtual PortableServer::RefCountServantBase
{
		CORBA::Object_var   _the_typed_consumer; // the <I> interface
	public:
		HandlerImpl(CORBA::Object_ptr ref)
			: _the_typed_consumer(CORBA::Object::_duplicate(ref)) {}		
CORBA::Object_ptr get_typed_consumer() { 
			// return the <I> interface
			return CORBA::Object::_duplicate(_the_typed_consumer); }
...
};
// The typed consumer server
int main(int argc, char** argv) 
{
	// Get orb and POA ...
	...
	// Construct a push consumer servant
	TMNTypedEventImpl* servant = new TMNTypedEventImpl;	
// 3. Activate the typed consumer on a POA
	poa->activate_object(servant);
	// 4. Get typed consumer reference 
	CORBA::Object_var obj = poa->servant_to_reference(servant);	
// 5. Construct a handler servant and pass it the typed consumer reference
	HandlerImpl* handler = new HandlerImpl(obj);	
// 6. Activate the handler object on a POA
	poa->activate_object(handler);	
// 7. Activate the POA(s)
	poa->the_POAManager()->activate();
	...	
// 8. Somehow, we get a typed channel
	CosTypedNotifyChannelAdmin::TypedEventChannel_var channel = ...;	
// 9. Somehow, we decide to use the default admin
	CosTypedNotifyChannelAdmin::TypedConsumerAdmin_var admin = 
			channel->default_consumer_admin();	
// 10. Obtain a proxy push supplier from the admin using the event 
	// repository id "IDL:example.borland.com/TMN/TypedEvent:1.0" as the key.
	CosNotifyChannelAdmin::ProxyID pxy_id;
	CosTypedNotifyChannelAdmin::ProxySupplier_var proxy
			= admin->obtain_typed_notification_push_supplier(
				"IDL:example.borland.com/TMN/TypedEvent:1.0", pxy_id);	
// 11. Get handler object reference and connect it to the proxy
	CORBA::Object_var ref = poa->servant_to_reference(handler);
	CosTypedNotifyComm::TypedPushConsumer_var consumer
			= CosTypedNotifyComm::TypedPushConsumer::_narrow(ref);
	proxy->connect_typed_push_consumer(consumer);
	// working loop
	orb->run();
}
 
      
      The typed push consumer example is located in examples/vbroker/notify/basic_java/typedPushConsumer.java.
 
      // 1. Implement the user defined typed consumer servant
class TMNTypedEventImpl extends TMN.TypedEventPOA {
	...	
public void attributeValueChange (...) { ... }
	public void qosAlarm(...) { ... }
	...
}
// 2. Implement the handler servant
class TypedPushConsumerImpl 
			extends org.omg.CosTypedNotifyComm.TypedPushConsumer {
	org.omg.CORBA.Object _the_typed_consumer = null; // the <I> interface
	TypedPushConsumerImpl(org.omg.CORBA.Object ref) {
			_the_typed_consumer = ref;
	}                           
	org.omg.CORBA.Object get_typed_consumer() { 
		// Return the <I> interface
		return _the_typed_consumer; }
...   
	public static void main(String [] args) {
	// Get orb and POA ...
	...
	// Construct a push consumer servant
	TMNTypedEventImpl servant = new TMNTypedEventImpl();	
// 3. Activate the typed consumer on a POA
	poa.activate_object(servant);	
// 4. Get typed consumer reference
	org.omg.CORBA.Object obj = poa.servant_to_reference(servant);	
// 5. Construct a handler servant and pass it the typed consumer reference
	TypedPushConsumerImpl handler = new TypedPushConsumerImpl(obj);	
// 6. Activate the handler object on a POA
	poa.activate_object(handler);	
// 7. Activate the POA(s)
	poa.the_POAManager()Activate();
...	
// 8. Somehow, we get a typed channel from somewhere
	org.omg.CosTypedNotifyChannelAdmin.TypedEventChannel channel = ...;	
// 9. Somehow, we decide to use the default admin
	org.omg.CosTypedNotifyChannelAdmin.TypedConsumerAdmin admin =
			channel.default_consumer_admin();	
// 10. Obtain a proxy push supplier from the admin using the event 
	// repository id "IDL:example.borland.com/TMN/TypedEvent:1.0" as the key.
	org.omg.CosNotifyChannelAdmin.ProxyIDHolder pxy_id_holder
			= new org.omg.CosNotifyChannelAdmin.ProxyIDHolder();
	org.omg.CosTypedNotifyChannelAdmin.ProxySupplier proxy
			= admin.obtain_typed_notification_push_supplier(			
"IDL:example.borland.com/TMN/TypedEvent:1.0", pxy_id_holder);	
// 11. Get handler object reference and connect it to the proxy
	org.omg.CORBA.Object ref = poa.servant_to_reference(handler);
	org.omg.CosTypedNotifyComm.TypedPushConsumer consumer =
			org.omg.CosTypedNotifyComm.TypedPushConsumerHelper.narrow(ref);
	proxy.connect_typed_push_consumer(consumer);
	// working loop
	orb.run();
	}
}
 
      
      
      
      
      
      
      
      
      
      
      
      
        
          
            | 
                •     
               | Calling get_typed_consumer() on the typed proxy push consumer to get the <I> interface reference. | 
        
       
      
      
      
      The typed push supplier example is located in examples/vbroker/notify/basic_cpp/typedPushSupplier.C.
 
      // The typed push supplier client
int main(int argc, char** argv) 
{
	// Get orb ...
	...
	// 1. Somehow, we get the typed channel from somewhere 
	CosTypedNotifyChannelAdmin::TypedEventChannel_var channel = ...;	
// 2. Somehow, we decide to use the default admin 
	CosTypedNotifyChannelAdmin::TypedSupplierAdmin_var admin = 
			channel->default_supplier_admin();	
// 3. Obtain a typed proxy push consumer from the admin using the event 
	//    repository id "IDL:example.borland.com/TMN/TypedEvent:1.0"
	//    as the key. 
	CosTypedNotifyChannelAdmin::ProxyID pxy_id;
	CosTypedNotifyChannelAdmin::TypedProxyPushConsumer_var proxy
	= admin->obtain_typed_notification_push_consumer(
			"IDL:example.borland.com/TMN/TypedEvent:1.0", pxy_id);	
// 4. Connect to the proxy 
	proxy->connect_typed_push_supplier(NULL);	
// 5. Get the <I> interface 
	CORBA::Object_var obj = proxy->get_typed_consumer();
	TMN::TypedEvent_var consumer = TMN::TypedEvent::_narrow(obj);
	// 6. Push events to the <I> interface 
	for(int i=0;i<100;i++) {
		consumer->attributeValueChange(...);
		consumer->qosAlarm(...);
}  	
// 7. Flush buffered events 
	consumer->_non_existent();	
// 8. Gracefully cleanup 
	proxy->disconnect_typed_push_consumer();
}
 
      
      The typed push supplier example is located in examples/vbroker/notify/basic_java/typedPushSupplier.java.
 
      import org.omg.CosTypedNotifyComm.*;
import org.omg.CosTypedNotifyChannelAdmin,*;
import org.omg.CosNotification.*;
public class typedPushSupplier
{
	...
	// The typed push supplier client
	public static void main(String[] args) {
		// get orb ...
		...
		// 1. Somehow, we get the typed channel from somewhere 
		org.omg.CosTypedNotifyChannelAdmin.TypedEventChannel_var channel = ...;		
// 2. Somehow, we decide to use the default admin 
		org.omg.CosTypedNotifyChannelAdmin.TypedSupplierAdmin admin 
				 = channel.default_supplier_admin();		
// 3. Obtain a typed proxy push consumer from the admin using the event 
		//    repository id "IDL:example.borland.com/TMN/TypedEvent:1.0"
		//    as the key. 
		Org.omg.CosTypedNotifyChannelAdmin.ProxyIDHolder pxy_id = new
			org.omg.CosTypedNotifyChannelAdmin.ProxyIDHolder();
		CosTypedNotifyChannelAdmin::TypedProxyPushConsumer_var proxy 
			= admin.obtain_typed_notification_push_consumer(
					"IDL:example.borland.com/TMN/TypedEvent:1.0", pxy_id);		
// 4. Connect to the proxy 
		proxy.connect_typed_push_supplier(null);		
// 5. Get the <I> interface 
		org.omg.CORBA.Object obj = proxy.get_typed_consumer();
				TMN.TypedEvent consumer = TMN.TypedEventHelper.narrow(obj);
	// 6. Push events to the <I> interface 
	for(int i=0;i<100;i++) {
		consumer.attributeValueChange(...);
		consumer.qosAlarm(...);
	}  	
// 7. Flush buffered events 
	consumer._non_existent();	
// 8. Gracefully cleanup 
	proxy.disconnect_typed_push_consumer();
}
  }
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      // 1. Implement the user defined typed consumer RMI object 
class RMINotifyImpl 
         extends PortableRemoteObject 
         implements TMN.Notification {
      ...
      public void attributeValueChange (...) { ... }
      public void qosAlarm(...) { ... }
      ...
   }
// 2. Implement the handler servant 
public class TypedPushConsumerImpl 
			extends org.omg.CosTypedNotifyComm.TypedPushConsumer {
	org.omg.CORBA.Object _the_typed_consumer = null; 
	// the <I> interface
	TypedPushConsumerImpl(org.omg.CORBA.Object ref){ 
		_the_typed_consumer = ref;
       }                           
	org.omg.CORBA.Object get_typed_consumer() { 
		// return the <I> interface
		return _the_typed_consumer; }
       ...   
	public static void main(String [] args) {
		// Get orb and POA ...
          ...
// 3. Allocate a RMI consumer object 
RMINotifyImpl consumer = new RMINotifyImpl();
// 4. Get the CORBA object reference of the RMI consumer 
org.omg.CORBA.Object corba_obj = javax.rmi.CORBA.Util.getTie(consumer).thisObject();
// 5. Allocate a handler servant and pass it the typed // consumer reference 
TypedPushConsumerImpl handler = new TypedPushConsumerImpl(corba_obj);
// 6. Activate the handler object on a POA 
poa.activate_object(handler);
// 7. Activate the POA(s) 
poa.the_POAManager()Activate();
...
// 8. Somehow, we get a typed channel from somewhere 
org.omg.CosTypedNotifyChannelAdmin.TypedEventChannel channel = ...;
// 9. Somehow, we decide to use the default admin 
org.omg.CosTypedNotifyChannelAdmin.TypedConsumerAdmin admin =
		channel.default_consumer_admin();
// 10. Obtain a proxy push supplier from the admin 
org.omg.CosNotifyChannelAdmin.ProxyIDHolder pxy_id_holder = new
 
      
      
      
      
      import org.omg.CosTypedNotifyComm.*;
import org.omg.CosTypedNotifyChannelAdmin,*;
import org.omg.CosNotification.*;
public class TypedPushSupplierImpl
{
	...
	// The typed push supplier client
	public static void main(String[] args) {
		// get orb ...
		...
		// 1. Somehow, we get the typed channel from somewhere 
		org.omg.CosTypedNotifyChannelAdmin.TypedEventChannel_var channel = ...;		
// 2. Somehow, we decide to use the default admin 
		org.omg.CosTypedNotifyChannelAdmin.TypedSupplierAdmin admin 
					= channel.default_supplier_admin();		
// 3. Obtain a typed proxy push consumer from the admin 
		Org.omg.CosTypedNotifyChannelAdmin.ProxyIDHolder pxy_id
					 = new org.omg.CosTypedNotifyChannelAdmin.ProxyIDHolder();
		CosTypedNotifyChannelAdmin::TypedProxyPushConsumer_var proxy
		= admin.obtain_typed_notification_push_consumer("RMI.Test, pxy_id);
		// 4. Connect to the proxy 
		proxy.connect_typed_push_supplier(null);		
// 5. Get the <I> interface 
		org.omg.CORBA.Object obj = proxy.get_typed_consumer();		
// 6. Narrowing the CORBA object reference into RMI stub. 
		TMN.Notification consumer = (TMN.Notification)PortableRemoteObject.
					narrow(obj, TMN.Notification.class); 		
// 7. Push events to the <I> RMI stub 
		for(int i=0;i<100;i++) {
			consumer.attributeValueChange(...);
			consumer.qosAlarm(...);
		}  		
// 8. Flush buffered events 
		com.inprise.vbroker.orb.BufferedEvents.flush();		
// 9. Gracefully cleanup 
		proxy.disconnect_typed_push_consumer();
	}
}
 
      
      
      
      import javax.ejb.*;
   // 1. The bean implementation 
   public class TMNNotifyBean implements SessionBean {
      ...
      // implement operations declared in bean's remote interface      
public void attributeValueChange (...) { ... }
      public void qosAlarm(...) { ... } 
      ...
   }
 
      
      
      
      
      In this release, a command line utility, subtool, is provided to subscribe an EJB bean as a typed RMI consumer by knowing its JNDI name. To connect a typed event EJB bean to an OMG Typed Notification channel, use the 
subtool command:
 
      
      
      
        
          
            | 
                •     
               | The -channel or -admin  option specify the channel or consumer admin object as the subscribe point. | 
        
       
      
        
          
            | 
                •     
               | The -home <jndi_name> tells subtool  the JNDI name of the bean's Home interface. | 
        
       
      
        
          
            | 
                •     
               | The -type typed option tells subtool  to connect the bean's remote interface as typed consumer. | 
        
       
      
        
          
            | 
                •     
               | The -key <proxy_key> option tells the subtool what should be the key parameter for obtain_typed_notification_push_supplier(). | 
        
       
      This example shows using subtool to subscribe a typed event bean to a OMG Typed Notification Channel:
 
          % subtool  -channel  corbaloc::127.0.0.1:14100/default_channel \             
-home  stock_home  
-type  typed  
-key  Stock
 
      
      
      
      
      import javax.ejb.*;
// The bean implementation 
public class MyStructuredNotifyBean implements SessionBean {
...
public void push_structured_event( 	 org.omg.CosNotification.StructuredEvent event) { ... } 
      ...
   }
 
      
      
      
      
      
      
        
          
            | 
                •     
               | The -channel or -admin  option specify the channel or consumer admin object as the subscribe point. | 
        
       
      
        
          
            | 
                •     
               | The -home <jndi_name > tells subtool the JNDI name of the bean's Home interface. | 
        
       
      
        
          
            | 
                •     
               | The -type struct option tells subtool  to connect the bean's remote interface as structured consumer. | 
        
       
      This example shows using subtool to subscribe a structured event bean to a VisiNotify Structured Notification Channel:
 
      % subtool  -channel  corbaloc::127.0.0.1:14100/default_channel \             
-home  stock_home  
-type struct
 
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      Event buffer is full: This is a per-stub level flush. The default size of this stub level event buffer is 32K. A given supplier application can use 
vbroker.orb.supplier.eventBufferSize  to change this size between 8K and 64K. For example:
 
      
      Number of buffered events reaches the maximum batch size: This is a per-stub level flush. The default maximum number of events that a stub can hold in its buffer is 128. A supplier application can use 
vbroker.orb.supplier.maxBatchSize to change this size to any value less than 256. For example:
 
      
      Internal buffer flush timeout: This is a global flush. On timeout, all events buffered in all stubs will be flushed out. The default timeout interval is 2,000 milliseconds (2 seconds). A supplier application can use 
vbroker.orb.supplier.eventBatchTimerInterval to change this time between 100 millisecond (0.1 second) and 10,000 milliseconds (10 seconds). For example:
 
      
      
      
      
      
      
      Therefore, invoking disconnect_..._push_consumer() operations or 
 _non_existent() on the proxy stubs (above) will flush out all buffered events.
 
      
      Therefore, a supplier application can invoke _non_existent() operation on an <I> interface stub to flush its buffered events. Notice that the calling 
disconnect_typed_push_consumer()  on a typed proxy consumer stub will not cause the buffer in a corresponding <I> stub to be flushed. The application should explicitly 
call _non_existent() on an <I> interface stub before calling 
disconnect_typed_push_consumer() on proxy stub.
 
      
      A Java supplier application can explicitly call com.inprise.vbroker.orb.BufferedEvents.flush() to flush. This is a global level event flush. It is to support VisiBroker RMI applications because there is no pseudo operation on a java.rmi.Remote interface, which can be used for event flush. Calling this static method will flush out all events in every stub.
 
      
      By default, VisiNotify uses TCP port number 14100 unless -Dvbroker.notify.listener.port=<port>  is used in the command line. Therefore, as specified by OMG Notification Service, the URL of the Channel factory and typed channel factory are:
 
      
      where, <host> is the domain name or dotted IP address of the VisiNotify host machine. The VisiNotify server also creates a default channel. The URL of this default channel is: