通知服务的问题?

2 views
Skip to first unread message

Simon Tao

unread,
Feb 25, 2009, 12:50:18 AM2/25/09
to ace-china
我写了个通知服务的应用:

多个提供者和多个消费者,但我发现,同一程序内可以收到消息,不同进程间,总是收不到消息??

Stone Jiang

unread,
Feb 25, 2009, 1:18:13 AM2/25/09
to Simon Tao, ace-...@googlegroups.com
hi Simon,
     请把你遇到的问题及环境描述得更详细一点。
      操作系统
      编译器及版本
      ace版本
      tao版本
      config.h的内容

     尽量把输入的日志附上,有源代码更好。

thanks.

Stone Jiang

2009/2/25 Simon Tao <taoyo...@hotmail.com>

Simon Tao

unread,
Feb 25, 2009, 2:39:41 AM2/25/09
to ace-china
This is ACE version 5.6.7, released Thu Nov 27 04:09:39 CST 2008


提供者代码:
CORBA::Boolean CQueueMgrImp::InitChanel (void)
{
ACE_DEBUG((LM_DEBUG,"(%t) Init NameService context.\n"));
CORBA::Object_var naming_obj =
this->m_orb->resolve_initial_references (NAMING_SERVICE_NAME);

// Need to check return value for errors.
if (CORBA::is_nil (naming_obj.in ()))
throw CORBA::UNKNOWN ();

this->naming_context_ =
CosNaming::NamingContext::_narrow (naming_obj.in ());

ACE_DEBUG((LM_DEBUG,"(%t) Init Notify Factory context.\n"));
CosNaming::Name name (1);
name.length (1);
name[0].id = CORBA::string_dup (NOTIFY_FACTORY_NAME);

CORBA::Object_var obj =
this->naming_context_->resolve (name);

ACE_DEBUG((LM_DEBUG,"(%t) Create EventChannelFactory.\n"));
this->notify_factory_ =
CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ());

CosNotifyChannelAdmin::ChannelID id;

ec_ = notify_factory_->create_channel (initial_qos_,
initial_admin_,
id);

ACE_ASSERT (!CORBA::is_nil (ec_.in ()));

ACE_DEBUG((LM_DEBUG,"(%t) Create CosNotifyChannelAdmin.\n"));
CosNotifyChannelAdmin::AdminID adminid;

supplier_admin_ =
ec_->new_for_suppliers (CosNotifyChannelAdmin::AND_OP, adminid);

ACE_ASSERT (!CORBA::is_nil (supplier_admin_.in ()));


ACE_DEBUG((LM_DEBUG,"(%t) Create CosNotifyChannelAdmin.\n"));
CosNotifyChannelAdmin::AdminID adminid2;
consumer_admin_ =
ec_->new_for_consumers (CosNotifyChannelAdmin::OR_OP, adminid2);

consumer_queue_ = new Consumer<CQueueMgrImp> (this);
consumer_queue_->connect (this->consumer_admin_.in ());

supplier_queue_ = new Supplier ();
supplier_queue_->connect (this->supplier_admin_.in ());

CosNotification::EventTypeSeq added(1);
CosNotification::EventTypeSeq removed (0);
added.length (1);

added[0].domain_name = CORBA::string_dup (DOMAIN_SYSTEM);
added[0].type_name = CORBA::string_dup (TYPE_ERROR);

this->consumer_admin_->subscription_change (added, removed);

CosNotification::EventTypeSeq added_1(1);
CosNotification::EventTypeSeq removed_1 (0);
added_1.length (1);

added_1[0].domain_name = CORBA::string_dup (DOMAIN_QUEUE);
added_1[0].type_name = CORBA::string_dup (TYPE_INFO);
removed_1.length (0);
this->consumer_queue_->get_proxy_supplier ()->subscription_change
(added_1, removed_1);

// Create the events - one of each type
// Event 1

string strMsg;

CosNotification::StructuredEvent event1;
event1.header.fixed_header.event_type.domain_name =
CORBA::string_dup(DOMAIN_SYSTEM);
event1.header.fixed_header.event_type.type_name =
CORBA::string_dup(TYPE_ERROR);
event1.header.fixed_header.event_name = CORBA::string_dup("");
event1.header.variable_header.length (0); // put nothing here
event1.filterable_data.length (0);
strMsg = "System Init at QueueMgr:";
event1.remainder_of_body <<= strMsg.c_str();


// event 3
CosNotification::StructuredEvent event3;
event3.header.fixed_header.event_type.domain_name =
CORBA::string_dup(DOMAIN_QUEUE);
event3.header.fixed_header.event_type.type_name =
CORBA::string_dup(TYPE_INFO);
event3.header.fixed_header.event_name = CORBA::string_dup("");
event3.header.variable_header.length (0); // put nothing here
event3.filterable_data.length (0);
strMsg = "Queue Mgr Init.";
event3.remainder_of_body <<= strMsg.c_str();

supplier_queue_->send_event (event1);
supplier_queue_->send_event (event3);

ACE_ASSERT (!CORBA::is_nil (consumer_admin_.in ()));

return true;
};

消费者代码:
::CORBA::Boolean CWindowsImp::InitChanel (void)
{
ACE_DEBUG((LM_DEBUG,"(%t) Init NameService context.\n"));
CORBA::Object_var naming_obj =
this->m_orb->resolve_initial_references (NAMING_SERVICE_NAME);

// Need to check return value for errors.
if (CORBA::is_nil (naming_obj.in ()))
throw CORBA::UNKNOWN ();

this->naming_context_ =
CosNaming::NamingContext::_narrow (naming_obj.in ());

ACE_DEBUG((LM_DEBUG,"(%t) Init Notify Factory context.\n"));
CosNaming::Name name (1);
name.length (1);
name[0].id = CORBA::string_dup (NOTIFY_FACTORY_NAME);

CORBA::Object_var obj =
this->naming_context_->resolve (name);

ACE_DEBUG((LM_DEBUG,"(%t) Create EventChannelFactory.\n"));
this->notify_factory_ =
CosNotifyChannelAdmin::EventChannelFactory::_narrow (obj.in ());

CosNotifyChannelAdmin::ChannelID id;

ec_ = notify_factory_->create_channel (initial_qos_,
initial_admin_,
id);

ACE_ASSERT (!CORBA::is_nil (ec_.in ()));

ACE_DEBUG((LM_DEBUG,"(%t) Create CosNotifyChannelAdmin.\n"));
CosNotifyChannelAdmin::AdminID adminid;

supplier_admin_ =
ec_->new_for_suppliers (CosNotifyChannelAdmin::AND_OP, adminid);

ACE_ASSERT (!CORBA::is_nil (supplier_admin_.in ()));


ACE_DEBUG((LM_DEBUG,"(%t) Create CosNotifyChannelAdmin.\n"));
consumer_admin_ =
//ec_->new_for_consumers (CosNotifyChannelAdmin::OR_OP,, adminid);
ec_->new_for_consumers (CosNotifyChannelAdmin::OR_OP, adminid);
ACE_ASSERT (!CORBA::is_nil (consumer_admin_.in ()));

consumer_windows_ = new Consumer<CWindowsImp> (this);
consumer_windows_->connect (this->consumer_admin_.in ());

supplier_windows_ = new Supplier ();
supplier_windows_->connect (this->supplier_admin_.in ());

CosNotification::EventTypeSeq added(1);
CosNotification::EventTypeSeq removed (0);
added.length (1);

added[0].domain_name = CORBA::string_dup (DOMAIN_SYSTEM);
added[0].type_name = CORBA::string_dup (TYPE_ERROR);

this->consumer_admin_->subscription_change (added, removed);

CosNotification::EventTypeSeq added_1(1);
CosNotification::EventTypeSeq removed_1 (0);
added_1.length (1);

added_1[0].domain_name = CORBA::string_dup (DOMAIN_QUEUE);
added_1[0].type_name = CORBA::string_dup (TYPE_INFO);
removed_1.length (0);
this->consumer_windows_->get_proxy_supplier ()-
>subscription_change (added_1, removed_1);

// Create the events - one of each type
// Event 1


ACE_ASSERT (!CORBA::is_nil (consumer_admin_.in ()));

return this->GetMyBusinessInfo();
//return true;
};


关键是这段:
added_1[0].domain_name = CORBA::string_dup (DOMAIN_QUEUE);
added_1[0].type_name = CORBA::string_dup (TYPE_INFO);
removed_1.length (0);
this->consumer_windows_->get_proxy_supplier ()-
>subscription_change (added_1, removed_1);

我订阅了此队列,同一个进程内可以工作,不同进程内收不到,多提供者对应多消息者模式。

On 2月25日, 下午2时18分, Stone Jiang <2005...@gmail.com> wrote:
> hi Simon, 请把你遇到的问题及环境描述得更详细一点。
> 操作系统
> 编译器及版本
> ace版本
> tao版本
> config.h的内容
>
> 尽量把输入的日志附上,有源代码更好。
>
> thanks.
>
> Stone Jiang
>
> 2009/2/25 Simon Tao <taoyongg...@hotmail.com>
>
>
>
> > 我写了个通知服务的应用:
>
> > 多个提供者和多个消费者,但我发现,同一程序内可以收到消息,不同进程间,总是收不到消息??- 隐藏被引用文字 -
>
> - 显示引用的文字 -
Reply all
Reply to author
Forward
0 new messages