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>
>
>
>
> > 我写了个通知服务的应用:
>
> > 多个提供者和多个消费者,但我发现,同一程序内可以收到消息,不同进程间,总是收不到消息??- 隐藏被引用文字 -
>
> - 显示引用的文字 -