[Ace-users] [tao-users] JacORB and TAO 1.5 notification service incompatibility

Johnny Willemsen jwillemsen at remedy.nl
Sat Nov 10 01:07:50 CST 2007


Hi,

Thanks for using the PRF form. Can you try x.6.1, we did fix some
interoperability issues.

Regards,

Johnny Willemsen
Remedy IT
Postbus 101
2650 AC  Berkel en Rodenrijs
The Netherlands
www.theaceorb.nl / www.remedy.nl  

*** Integrated compile and test statistics see
http://scoreboard.theaceorb.nl ***
*** Commercial service and support for ACE/TAO/CIAO             ***
*** See http://www.theaceorb.nl/en/support.html                 ***

<christian.galli at gmail.com> wrote in message
news:<1194646870.640087.320390 at 22g2000hsm.googlegroups.com>...
>     ACE VERSION: 5.5.9 and 5.5a_p4
> 
>     HOST MACHINE and OPERATING SYSTEM:
>     Redhat Enterprise Linux 4.2, Intel Xeon
> 
>     TARGET MACHINE and OPERATING SYSTEM, if different from HOST:
>     COMPILER NAME AND VERSION (AND PATCHLEVEL): GCC 3.4.4
> 
>     CONTENTS OF $ACE_ROOT/ace/config.h [if you use a link to a
> platform-
>     specific file, simply state which one]:
> 
>     #include "config-linux.h"
>     #undef ACE_LACKS_MKSTEMP_PROTOTYPE
> 
>     CONTENTS OF $ACE_ROOT/include/makeinclude/platform_macros.GNU [if
> you
>     use a link to a platform-specific file, simply state which one
>     (unless this isn't used in this case, e.g., with Microsoft Visual
>     C++)]:
> 
>     platform_linux.GNU
> 
>     CONTENTS OF $ACE_ROOT/bin/MakeProjectCreator/config/
> default.features
>     (used by MPC when you generate your own makefiles):
> 
>     LEVEL OF URGENCY (LOW, MEDIUM, or HIGH): MEDIUM
> 
>     AREA/CLASS/EXAMPLE AFFECTED:
>         Notification services
> 
>     DOES THE PROBLEM AFFECT:
>         EXECUTION of my application
> 
>     SYNOPSIS:
>         Sending StructuredEvent from JacORB 2.2.4 to TAO 1.5 fails to
>         deserialize remainder_of_body using >>= operator. Works with
> TAO 1.4
> 
>     DESCRIPTION:
>         Java test client sends StructuredEvent but C++ server fails to
>         deserialize the message. Test programs are included below.
> This
>         works with TAO 1.4 but not with TAO 1.5 (tried both 5.5a_p4
> and 5.5.9).
>         C++ client sends same StructuredEvent, which the server can
>         deserialize properly with either TAO version. I don't see any
>         exceptions on either program. The >>= operator returns false.
> 
>     REPEAT BY:
> 
> ---------------
> IDL Definition
> ---------------
> /*
>   Proxy type enum
> */
> enum PROXYTYPE
> {
>   PUB,
>   SUB,
>   CLIENT,// bidirectional subscriber
>   SERVER // bidirectional publisher
> };
> 
> /*
>   Proxy location enum
> */
> enum PROXYLOC
> {
>   LOCAL_SYSTEM,
>   REMOTE_SYSTEM
> };
> 
> /*
>   Used to identify individual proxy. Comprised of local machine ip,
> process id
>   and an instance number that can be used to support multiple proxy
> instances
>   in the future. Its use is confined to DLMProxy, Channel Manager and
>   TapPoint Manager.
> */
> struct ProxyID
> {
>   long   process_id;  // PID DLM proxy belongs to
>   long   instance;    // unique ID to distinguish between
>                       // multiple proxies in the same process
>   string ip;          // IP Address of proxy location
> };
> 
> 
> /**
>  * Header to fully identify a proxy local or remote
>  */
> struct ProxyHeader
> {
>   ProxyID       pID;
>   PROXYTYPE     type;
>   PROXYLOC      location;
> };
> typedef sequence<ProxyHeader> PROXYHEADERSEQ;
> 
> /**
> 	Message from TPM to DLM to attach a publisher to a subscriber
>  */
> struct Attach
> {
> 	ProxyHeader publisher;
> 	ProxyHeader subscriber;
> };
> 
> ---------------
> C++ Server Code
> ---------------
> #include <ace/Version.h>
> #if ( ACE_MAJOR_VERSION == 5 ) && ( ACE_MINOR_VERSION > 4 )
> #include <tao/AnyTypeCode/AnyTypeCode_methods.h>
> #include <tao/AnyTypeCode/TypeCode.h>
> #else
> #include <tao/Typecode.h>
> #endif
> #include <tao/corba.h>
> #include <tao/PortableServer/PortableServer.h>
> #include <orbsvcs/Notify/Notify_EventChannelFactory_i.h>
> #include <iostream>
> #include <fstream>
> #include "TapPointManagerC.h"
> 
> using std::cout;
> using std::endl;
> 
> namespace
> {
> 	const char* g_types[] = {
> 		"PUB",
> 		"SUB",
> 		"CLIENT",
> 		"SERVER"
> 	};
> 
> 	const char* g_locations[] = {
> 		"LOCAL_SYSTEM",
> 		"REMOTE_SYSTEM"
> 	};
> }
> 
> class TestConsumer : public POA_CosNotifyComm::StructuredPushConsumer
> {
> public:
> 	virtual void push_structured_event(
> 		const CosNotification::StructuredEvent& p_event
> 		ACE_ENV_ARG_DECL_WITH_DEFAULTS)
> 			ACE_THROW_SPEC((CORBA::SystemException))
> 	{
> 		cout << "---------------" << endl;
> 		cout << "StructuredEvent" << endl;
> 		cout << "---------------" << endl;
> 		cout << "Domain Name: '" <<
> p_event.header.fixed_header.event_type.domain_name.in() << "'" <<
> endl;
> 		cout << "Type Name: '" <<
> p_event.header.fixed_header.event_type.type_name.in() << "'" << endl;
> 		cout << "Event Name: '" <<
> p_event.header.fixed_header.event_name.in() << "'" << endl;
> 		cout << "Variable Header Length: " <<
> p_event.header.variable_header.length() << endl;
> 		cout << "Filterable Data Length: " <<
> p_event.filterable_data.length() << endl;
> 
> 		CORBA::TypeCode_var pTypeCode =
p_event.remainder_of_body.type();
> 		CORBA::String_var pTypeID = pTypeCode->id();
> 		cout << "Body Type ID = " << pTypeID.in() << endl;
> 
> 		const Attach* pAttach;
> 		if(p_event.remainder_of_body >>= pAttach)
> 		{
> 			cout << "Deserialized Attach Msg From Body OK" <<
endl;
> 			cout << "Publisher - " <<
pAttach->publisher.pID.ip.in() << ":"
> 				<< pAttach->publisher.pID.process_id << ":"
> 				<< pAttach->publisher.pID.instance << ", "
> 				<< g_types[pAttach->publisher.type] << ", "
> 				<< g_locations[pAttach->publisher.location]
<< endl;
> 			cout << "Subscriber - " <<
pAttach->subscriber.pID.ip.in() << ":"
> 				<< pAttach->subscriber.pID.process_id << ":"
> 				<< pAttach->subscriber.pID.instance << ", "
> 				<< g_types[pAttach->subscriber.type] << ", "
> 				<< g_locations[pAttach->subscriber.location]
<< endl;
> 		}
> 		else
> 		{
> 			cout << "Deserialize Body Failed" << endl;
> 		}
> 	}
> 
> 	virtual void offer_change(
> 		const CosNotification::EventTypeSeq& p_added,
> 		const CosNotification::EventTypeSeq& p_removed
> 		ACE_ENV_ARG_DECL_WITH_DEFAULTS)
> 			ACE_THROW_SPEC((CORBA::SystemException))
> 	{
> 	}
> 
> 	virtual void disconnect_structured_push_consumer(
> 		ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
> 			ACE_THROW_SPEC((CORBA::SystemException))
> 	{
> 	}
> };
> 
> int main(int argc, char* argv[])
> {
> 	try
> 	{
> 		CORBA::ORB_var pOrb = CORBA::ORB_init(argc, argv,
"ServerOrb");
> 		CORBA::Object_var pPoaObj = pOrb-
> >resolve_initial_references("RootPOA");
> 		PortableServer::POA_var pPoa =
> PortableServer::POA::_narrow(pPoaObj.in());
> 		PortableServer::POAManager_var pMgr =
pPoa->the_POAManager();
> 		pMgr->activate();
> 
> 		CosNotification::QoSProperties channelQoS;
> 		CosNotification::AdminProperties channelAdmin;
> 		CosNotifyChannelAdmin::ChannelID channelID;
> 
> 		CosNotifyChannelAdmin::EventChannelFactory_var pFactory =
> 			TAO_Notify_EventChannelFactory_i::create(pPoa.in());
> 		CosNotifyChannelAdmin::EventChannel_var pChannel =
> 			pFactory->create_channel(channelQoS, channelAdmin,
channelID);
> 
> 		CORBA::String_var pIOR =
pOrb->object_to_string(pChannel.in());
> 
> 		ofstream iorFile("test.ior");
> 		iorFile << pIOR.in() << endl;
> 		iorFile.close();
> 
> 		cout << "Saved IOR = " << pIOR.in() << endl;
> 
> 		TestConsumer consumer;
> 		PortableServer::ObjectId_var pConsumerID = pPoa-
> >activate_object(&consumer);
> 		CORBA::Object_var pConsumerObj = pPoa-
> >id_to_reference(pConsumerID.in());
> 		CosNotifyComm::StructuredPushConsumer_var pConsumer =
>
CosNotifyComm::StructuredPushConsumer::_narrow(pConsumerObj.in());
> 
> 		CosNotifyChannelAdmin::AdminID consumerAdminID;
> 		CosNotifyChannelAdmin::ProxyID consumerProxyID;
> 		CosNotifyChannelAdmin::ConsumerAdmin_var pConsumerAdmin =
>
pChannel->new_for_consumers(CosNotifyChannelAdmin::AND_OP,
> consumerAdminID);
> 		CosNotifyChannelAdmin::ProxySupplier_var pProxySupplier =
> 		  	pConsumerAdmin->obtain_notification_push_supplier(
> 				CosNotifyChannelAdmin::STRUCTURED_EVENT,
consumerProxyID);
> 		CosNotifyChannelAdmin::StructuredProxyPushSupplier_var
> pStructuredSupplier =
> 	
>
CosNotifyChannelAdmin::StructuredProxyPushSupplier::_narrow(pProxySupplier.i
n());
> 		pStructuredSupplier-
> >connect_structured_push_consumer(pConsumer.in());
> 
> 		cout << "Server Ready" << endl;
> 
> 		pOrb->run();
> 	}
> 	catch(const CORBA::Exception& ex)
> 	{
> 		cout << "Exception: " << ex._rep_id() << endl;
> 		return 1;
> 	}
> 
> 	return 0;
> }
> 
> ----------------
> Java Client Code
> ----------------
> import java.io.*;
> import java.util.*;
> import org.omg.CORBA.*;
> import org.omg.PortableServer.*;
> import org.omg.CosNotification.*;
> import org.omg.CosNotifyComm.*;
> import org.omg.CosNotifyChannelAdmin.*;
> import idlgen.*;
> 
> public class TestClient
> {
> 	private static class TestSupplier extends StructuredPushSupplierPOA
> 	{
> 		public void subscription_change(EventType[] added,
EventType[]
> removed)
> 		{
> 		}
> 
> 		public void disconnect_structured_push_supplier()
> 		{
> 		}
> 	}
> 
> 	public static void main(String[] args)
> 	{
> 		try
> 		{
> 			Properties props = new Properties();
> 			props.setProperty("org.omg.CORBA.ORBClass",
"org.jacorb.orb.ORB");
> 			props.setProperty("org.omg.CORBA.ORBSingletonClass",
> "org.jacorb.orb.ORBSingleton");
> 
> 			ORB orb = ORB.init(args, props);
> 			POA poa =
> POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
> 			poa.the_POAManager().activate();
> 
> 			// get IOR
> 			Scanner scanner = new Scanner(new File("test.ior"));
> 			String ior = scanner.nextLine();
> 			System.out.println("Got IOR = " + ior);
> 
> 			// get channel
> 			EventChannel channel =
> EventChannelHelper.narrow(orb.string_to_object(ior));
> 
> 			// create supplier
> 			TestSupplier supplier = new TestSupplier();
> 			poa.activate_object(supplier);
> 			StructuredPushSupplier supplierObj =
> StructuredPushSupplierHelper.narrow(
> 					poa.servant_to_reference(supplier));
> 
> 			// connect supplier
> 			IntHolder adminID = new IntHolder();
> 			IntHolder proxyID = new IntHolder();
> 			SupplierAdmin admin = channel.new_for_suppliers(
> 				InterFilterGroupOperator.AND_OP, adminID);
> 			StructuredProxyPushConsumer proxyConsumer =
> 				StructuredProxyPushConsumerHelper.narrow(
>
admin.obtain_notification_push_consumer(
> 						ClientType.STRUCTURED_EVENT,
proxyID));
>
proxyConsumer.connect_structured_push_supplier(supplierObj);
> 
> 			System.out.println("Connected, Sending Attach");
> 
> 			// send test event
> 			StructuredEvent event = new StructuredEvent(
> 				new EventHeader(
> 					new FixedEventHeader(
> 						new
EventType("DataLinkManager", "Attach"),
> 						""),
> 					new
org.omg.CosNotification.Property[0]),
> 				new org.omg.CosNotification.Property[0],
> 				orb.create_any());
> 			Attach attachMsg = new Attach();
> 			attachMsg.publisher = new ProxyHeader();
> 			attachMsg.publisher.pID = new ProxyID(12345, 0,
"192.168.2.77");
> 			attachMsg.publisher.type = PROXYTYPE.PUB;
> 			attachMsg.publisher.location =
PROXYLOC.LOCAL_SYSTEM;
> 			attachMsg.subscriber = new ProxyHeader();
> 			attachMsg.subscriber.pID = new ProxyID(12345, 1,
"192.168.2.77");
> 			attachMsg.subscriber.type = PROXYTYPE.SUB;
> 			attachMsg.subscriber.location =
PROXYLOC.LOCAL_SYSTEM;
> 			AttachHelper.insert(event.remainder_of_body,
attachMsg);
> 			proxyConsumer.push_structured_event(event);
> 
> 			System.out.println("Attach Message Sent");
> 
> 			System.exit(0);
> 		}
> 		catch(Exception ex)
> 		{
> 			ex.printStackTrace();
> 			System.exit(1);
> 		}
> 	}
> }
> 
> ---------------
> C++ Client Code
> ---------------
> #include <tao/corba.h>
> #include <tao/PortableServer/PortableServer.h>
> #include <orbsvcs/CosNotificationC.h>
> #include <orbsvcs/CosNotifyCommS.h>
> #include <orbsvcs/CosNotifyChannelAdminC.h>
> #include <iostream>
> #include <fstream>
> #include "TapPointManagerC.h"
> 
> using std::cout;
> using std::endl;
> 
> class TestSupplier : public POA_CosNotifyComm::StructuredPushSupplier
> {
> public:
> 	virtual void subscription_change(
> 		const CosNotification::EventTypeSeq& p_added,
> 		const CosNotification::EventTypeSeq& p_removed
> 		ACE_ENV_ARG_DECL_WITH_DEFAULTS)
> 			ACE_THROW_SPEC((CORBA::SystemException))
> 	{
> 	}
> 
> 	virtual void disconnect_structured_push_supplier(
> 		ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
> 			ACE_THROW_SPEC((CORBA::SystemException))
> 	{
> 	}
> };
> 
> int main(int argc, char* argv[])
> {
> 	try
> 	{
> 		CORBA::ORB_var pOrb = CORBA::ORB_init(argc, argv,
"ServerOrb");
> 		CORBA::Object_var pPoaObj = pOrb-
> >resolve_initial_references("RootPOA");
> 		PortableServer::POA_var pPoa =
> PortableServer::POA::_narrow(pPoaObj.in());
> 		PortableServer::POAManager_var pMgr =
pPoa->the_POAManager();
> 		pMgr->activate();
> 
> 		std::string sIOR;
> 		ifstream iorFile("test.ior");
> 		getline(iorFile, sIOR);
> 		iorFile.close();
> 
> 		cout << "Server IOR = " << sIOR << endl;
> 
> 		CORBA::Object_var pChannelObj = pOrb-
> >string_to_object(sIOR.c_str());
> 		CosNotifyChannelAdmin::EventChannel_var pChannel =
>
CosNotifyChannelAdmin::EventChannel::_narrow(pChannelObj.in());
> 
> 		TestSupplier supplier;
> 		PortableServer::ObjectId_var pSupplierID = pPoa-
> >activate_object(&supplier);
> 		CORBA::Object_var pSupplierObj = pPoa-
> >id_to_reference(pSupplierID.in());
> 		CosNotifyComm::StructuredPushSupplier_var pSupplier =
>
CosNotifyComm::StructuredPushSupplier::_narrow(pSupplierObj.in());
> 
> 		CosNotifyChannelAdmin::AdminID supplierAdminID;
> 		CosNotifyChannelAdmin::ProxyID supplierProxyID;
> 		CosNotifyChannelAdmin::SupplierAdmin_var pSupplierAdmin =
>
pChannel->new_for_suppliers(CosNotifyChannelAdmin::AND_OP,
> supplierAdminID);
> 		CosNotifyChannelAdmin::ProxyConsumer_var pProxyConsumer =
> 		  	pSupplierAdmin->obtain_notification_push_consumer(
> 				CosNotifyChannelAdmin::STRUCTURED_EVENT,
supplierProxyID);
> 		CosNotifyChannelAdmin::StructuredProxyPushConsumer_var
> pStructuredConsumer =
> 	
>
CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow(pProxyConsumer.i
n());
> 		pStructuredConsumer-
> >connect_structured_push_supplier(pSupplier.in());
> 
> 		cout << "Supplier Ready" << endl;
> 
> 		CosNotification::StructuredEvent event;
> 		event.header.fixed_header.event_type.domain_name =
> CORBA::string_dup("DataLinkManager");
> 		event.header.fixed_header.event_type.type_name =
> CORBA::string_dup("Attach");
> 		Attach attachMsg;
> 		attachMsg.publisher.pID.ip =
CORBA::string_dup("192.168.2.77");
> 		attachMsg.publisher.pID.process_id = 12345;
> 		attachMsg.publisher.pID.instance = 0;
> 		attachMsg.publisher.type = PUB;
> 		attachMsg.publisher.location = LOCAL_SYSTEM;
> 		attachMsg.subscriber.pID.ip =
CORBA::string_dup("192.168.2.77");
> 		attachMsg.subscriber.pID.process_id = 12345;
> 		attachMsg.subscriber.pID.instance = 1;
> 		attachMsg.subscriber.type = SUB;
> 		attachMsg.subscriber.location = LOCAL_SYSTEM;
> 		event.remainder_of_body <<= attachMsg;
> 		pStructuredConsumer->push_structured_event(event);
> 
> 		cout << "Message Sent" << endl;
> 
> 		pPoa->destroy(true, true);
> 		pOrb->destroy();
> 	}
> 	catch(const CORBA::Exception& ex)
> 	{
> 		cout << "Exception: " << ex._rep_id() << endl;
> 		return 1;
> 	}
> 
> 	return 0;
> }
> 
>     SAMPLE FIX/WORKAROUND:
>         Use TAO 1.4 version
> 
> Any help would be appreciated. If there's something I can do inside
> the Java code to make this work properly that would help a lot.
> 



More information about the Ace-users mailing list