Discuss about PortableRemoteObject.narrow()

Disucss List
 
Q:
 
When using remote references (stubs) to EJB's they must be narrowed in the following mannor:
InitialContext ctx =  new InitialContext(); 
Object obj = ctx.lookup(SomeObject); 
SpecificObject so = (SpecificObject) PortableRemoteObject.narrow(obj, SpecificObject. class); 
 
However, do you also have to use PortableRemoteObject.narrow() when obtaining a datasource, or some other kind of object?

Thanks in advance!
 
A1:
For database, you have to search database JNDI name and cast it to DataSource.
Datasource ds = (Datasource)ctx.lookup("myDB");
 
The narrowing is from the CORBA world and got introduced in J2EE when they decided to adopt IIOP as the protocol for doing RMI. Consequently, you have to narrow only when you are dealing with IIOP, such as for remote bean handles. 

DataSource objects are usually not accessed that way (intra-VM instead) and hence don't need narrowing.
 
Q2:
Just out of interest how are Datasources handled since to retrieve a datasource the same syntax is used ie.

InitialContext ctx = new InitialContext();
ctx.lookup("Datasource");

I'm assuming they don't use RMI? 
A2:
Anything you lookup in JNDI is handled by a class-specific ObjectFactory that (loosely speaking) converts the name into an object of the class you lookup. What is actually bound inside JNDI is not really the Object that you get on lookup, but rather some reference data containing information about what class the object belongs to, and how to construct an 'equivalent' instance on lookup. Such an equivalent Object is the real result of the lookup.

So technically, the casting is all you need (like for the DataSource): it tells both the compiler and the runtime VM that the name you lookup is expected to be of the class you cast to. The JNDI and the class-specific ObjectFactory do the rest.

For pure Java, this mechanism is sufficient in most if not all cases.

For IIOP/CORBA (and dito bean handles), the case is more complex because the underlying CORBA runtime also needs a special treatment that can't be done by casting and the reference information alone. That is why you have to do the explicit call to narrow. It's really a special case as far as JNDI is concerned.
 
A3:
generally everything you obtain from "java:" namespace does not need narrowing, since it is VM-local.

However, you might find links to remote ressources (typically under java:comp/env/), so it might be better you always narrow, unless you know you deal with VM local objects (like DataSources). I have not yet found a case where narrow hurts.
Another Q:
this code is not working for me..
can anyone help me where i have did mistake.
pubserhome is the home for session bean and pubserremote is the remote interface for session bean.

   Properties properties = new Properties();
 properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "localhost:1099");


try{

          Context jndiContext = new InitialContext(properties);

          Object ref=jndiContext.lookup("pubserremote"); 

          pubserhome home =(pubserhome) PortableRemoteObject.narrow( ref, pubserhome.class);

          pubserremote searchbean=home.create();

in the above code i get the error as 

incompatible types..

found:publisher.src.ejb.pubserhome
required:publisher.src.ejb.pubserremote
pubserhome searchbean=home.create();
                           ^
and also in this line 
  pubserhome home =(pubserhome) PortableRemoteObject.narrow( ref, pubserhome.class);

thanks in advance 
A:
pubserhome searchbean=home.create();

the above stmt is giving an error coz home.create() returns an object of remote type.

that is why u r getting this message:

found:publisher.src.ejb.pubserhome
required:publisher.src.ejb.pubserremote 



    本文转自danni505 51CTO博客,原文链接:http://blog.51cto.com/danni505/168739,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值