跳转到内容

ACE+TAO 开源编程笔记/创建事件提供者

来自维基教科书,开放世界中的开放书籍

设计两个事件端中较容易的一端是提供者。在 TAO 1.5 中,有几个事件示例。我最喜欢的是 TAO 网站上的 COSEC,它类似于 TAO 开发者指南中的示例。不幸的是,在 TAO 网站上的示例中没有注释。以下是发送每 6 秒一个事件的简单事件提供者示例。为了实现这一点,设置了一个 ACE 计时器(带有关联的处理程序/回调),它用于在指定时间发送事件。最后,计时器被插入到一个 ACE 反应器中,并被告知以开环模式“运行”。

在阅读代码时,请注意 main 顶部连接到 orb、命名服务和事件服务的方式。然后,可以找到大量与创建到事件服务的连接相关的样板代码。此样板代码的最后一行确定事件通道将不会关心消费者断开连接。

/************************************************
 * EventSource
 * 
 * A test program for snding events over TAO's event service
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include "eventsourceI.h"
#include "eventsourceC.h"
#include "etimer.h"
#include <ace/Reactor.h>
#include <orbsvcs/CosNamingC.h>
#include <orbsvcs/CosEventCommS.h>
#include <orbsvcs/CosEventChannelAdminC.h>

using namespace std;
using namespace CORBA;
CosEventChannelAdmin::ProxyPushConsumer_var consumer;

int main(int argc, char *argv[])
{
 // Initialize the ORB.
  ORB_var orb = ORB_init(argc, argv, "whatever");
   
  Object_var poa_object = orb->resolve_initial_references ("RootPOA");
  //Now we need a reference to the naming service
  Object_var naming_context_object = orb->resolve_initial_references ("NameService");
  CosNaming::NamingContext_var naming_context = 
      CosNaming::NamingContext::_narrow (naming_context_object.in ());
  
  CosNaming::Name ec_name;
  ec_name.length(1);
  ec_name[0].id = string_dup("CosEventService"); //TAO Specific

    // Resolve the binding to the event channel object reference.
  CosEventChannelAdmin::EventChannel_var channel = CosEventChannelAdmin::EventChannel::_narrow(naming_context->resolve(ec_name));
      //resolve_name<CosEventChannelAdmin::EventChannel>(
      //naming_context, ec_name);
  
  // Get the admin object to the event channel 
  CosEventChannelAdmin::SupplierAdmin_var supplier_admin =
      channel->for_suppliers();
  
  // Obtain a ProxyPushConsumer from the SupplierAdmin.
  consumer =  supplier_admin->obtain_push_consumer();
  
  // Invoke the connect_push_supplier operation, passing
// a nil PushSupplier reference to it.
  CosEventComm::PushSupplier_var nil_supplier =
      CosEventComm::PushSupplier::_nil();
  consumer->connect_push_supplier(nil_supplier);
  
  MyTimer *mt = new MyTimer();
  ACE_Time_Value initialDelay (3);
  ACE_Time_Value interval (6);
  ACE_Reactor reactor;
  reactor.schedule_timer (mt, 0, initialDelay, interval);
  reactor.run_reactor_event_loop();
  
  while(1){
    cout << "In while loop." << endl;
    sleep(100);
  }
  
  orb->destroy ();
  return EXIT_SUCCESS;
}

#ifndef MYTIMER_H
#define MYTIMER_H
#include <ace/streams.h>
#include <orbsvcs/CosNamingC.h>
#include <orbsvcs/CosEventCommS.h>
#include <orbsvcs/CosEventChannelAdminC.h>
#include "eventsourceC.h"
/**
Simple ACE timer impl for polling the bill acceptor & handling events

	@author Evan Carew <[email protected]>
 */
class MyTimer: public ACE_Event_Handler{
  public:
    int handle_timeout(const ACE_Time_Value &, const void * = 0);
};

#endif

etimer.cpp

[编辑 | 编辑源代码]
/************************************************
 * EventSource
 * 
 * A test program for snding events over TAO's event service
 */
#include "etimer.h"
#include "eventsourceC.h"
using namespace std;
using namespace CORBA;

extern CosEventChannelAdmin::ProxyPushConsumer_var consumer;

/*!
    \fn MyTimer::handle_timeout(const ACE_Time_Value &, const void * = 0)
 */
int MyTimer::handle_timeout(const ACE_Time_Value &current_time, const void *nuts)
{
  //create an event
  accepted accept_event;
  accept_event.bill = 1;
  accept_event.status = 1;
  accept_event.command = 0;

  //Insert the event data into an any. 
  Any any;
  any <<= accept_event;
  
  //Now, push the event to the proxy (consumer)
  consumer->push(any);
  cout << "Pushing event." << endl;
}

eventsource.idl

[编辑 | 编辑源代码]
  struct accepted{
    unsigned long bill;
    unsigned long status;
    unsigned long command;
  };
[编辑 | 编辑源代码]

-lTAO_CosNaming -lTAO_CosEvent -lTAO_PortableServer -lTAO_AnyTypeCode -lTAO -lACE

华夏公益教科书