I have created two liberty instances on my local machine. I deployed a war module which contains a remote ejb in server X and deployed another war in server Y which has to remote lookup the ejb from server X.
Below is the code to lookup the ejb from a restful webservice.
Properties p = new Properties();
p.setProperty("java.naming.provider.url", "corbaname:iiop:localhost:2809");
InitialContext context = new InitialContext (p);
context.lookup("corbaname:rir:#ejb/global/caching/CachingServiceBean!com%5c.ejb%5c.CachingService");
When I try to call the web service I get below exception
DII operation not supported by local object
P.S.
I have enabled ejbRemote feature on both the servers with different port numbers.
I changed my lookup string to "corbaloc:iiop:localhost:2809/NameService#ejb/global/caching/CachingServiceBean!com%5c.ejb%5c.CachingService" and then I get the below error
Then I changed my lookup string to "corbaname:iiop:localhost:2809/NameService#ejb/global/caching/CachingServiceBean!com%5c.ejb%5c.CachingService" and then I got the below error
After checking apache geronimo-yoko implementation on GitHub, I understood that I have to use corbaloc:iiop:localhost:2809. But still I am getting exceptions caused by
org.omg.CORBA.OBJECT_NOT_EXIST: unable to dispatch - servant or POA not found
I used the following urls with no luck:
corbaloc:iiop:localhost:2809/global/caching/CachingServiceBean!com.ejb.CachingService
corbaloc:iiop:localhost:2809/#ejb/global/caching/CachingServiceBean!com.ejb.CachingService
3.corbaloc:iiop:localhost:2809/caching/CachingServiceBean!com.ejb.CachingService
4.corbaloc:iiop:localhost:2809/ejb/global/caching/CachingServiceBean!com.ejb.CachingService
I think the problem is with the packaging. I packed my ejb in a war module.
I followed the steps described in the PDF mentioned in this page http://www.redbooks.ibm.com/redpieces/abstracts/sg248076.html and everything is working now.
I used corbaname::host:port syntax to lookup the remote ejb instead of corbaloc:iiop:host:port
After packing my ejb in an ear then it started working.
Related
Background
I am going to define some JMS queues on Wildfly 20.0.1.
I can list all the defined queue with /subsystem=naming:jndi-view in jboss-cli.
Problem
In the result of /subsystem=naming:jndi-view, the JNDI names are not based on ENC (java:comp/env/~). I want to know the JNDI names used in a Java application.
Question
Is there any way to show all the JNDI names under ENC (java:comp/env/~) that available in a web application on a Wildfly server?
Note: the way that available not only for Wildfly but also other Java EE servers are more preferable.
Every EJB container that is deployed in an application server has its own personal internal registry called the Enterprise Naming Context (ENC).
Anything registered in the JNDI ENC can be looked up by name under the java:comp/ env context.
InitialContext ctx = new InitialContext();
NamingEnumeration<NameClassPair> list = ctx.list("java:comp/env/");
while (list.hasMore()) {
System.out.println(list.next().getName());
}
Obs.: The JNDI name resolves to a different context depending on where you invoke the lookup. For example, if you invoke jndi.lookup(“java:comp/env”) within the MyEJB, you will get that EJB container’s ENC. If you do the same within another EJB, you will get a different ENC registry specific to that bean.
I have EJB packaged jar deployed in a cluster. When I try to create an entity manager with the entitymanager factory I get a namingexception because it can't find my jndi data source (jdbc/oracledb). If I update the datasource to target add the adminserver, I don't get the error it it find the datasource. I am new to EJB and clustering. I am able to see the jndi tree in my cluster from within the Weblogic Admin console and I can programmatically find jdbc/oracledb when I do lookup in my cluster. My entire application is deployed to the cluster, so I don't know why any of it should be within the context of the admin server. I'm wondering if this is a class loading issues. Thanks for any help.
My environment is Weblogic 10.3.5 on Solaris box. EJB is version 3 and there is anotation in the Bean class. Sorry for the confusion as the code is new to me and they also have deployment descriptor to generate ejb2 client code for another client to call, so it's not straigtforward.
I have a stateless session bean deployed to a cluster which has 2 server members say they are member1 and member2.
The session bean is deployed as clusterable as this is in the anotation:
homeIsClusterable = Constants.Bool.TRUE
This is how my Stand alone Java client lookup and call the EJB methods:
private void testBean(){
bean.methodA();
bean.methodB();
}
In the provider URL I ONLY specify the provider URL to ONE server member:
env.put(Context.PROVIDER_URL, "t3://member1:7005");
env.lookup("remote#the.bean.qulified.remoteinterface")
The Jndi name above is using the "mapped name + qualified remote interface class name", the mapped name is defined in the anotation.
Now the problem is, I found out, bean.methodA() got invoked in member1, and methodB() got invoked on member2, I found this from the logs of each server member. So it's always like this, member1 log will only show debug information from methodA, and member2 will only show debug information from methodB.
So here is my conceptual question - is this possible at all ? Are the above 2 methods supposed to be called on member1 only ? I know it's possible when you lookup through home interface you could possibly get a bean from either server, but in this case the ejb3 lookup is not going through the home interface(like in ejb2 we get a home and then call create method) but directly getting a remote object.
This caused issue as our methodB has a dependancy on methodA(methodA is doing some cleanup job, and then method re-initialize the cache), we need to do this on each cluster member.
This is just extra info but please focus on the above question from a concept perspective.
From the documentation:
When home-is-clusterable is True, the EJB can be deployed from multiple WebLogic Servers in a cluster. Calls to the home stub are load-balanced between the servers on which this bean is deployed, and if a server hosting the bean is unreachable, the call automatically fails over to another server hosting the bean.
I believe this is the case even when you explicitly only connect to a single member. This has some pretty good info in the Replica-Aware Home section:
http://www.informit.com/articles/article.aspx?p=101737&seqNum=8
It's more or less the whole point of clustering... a cluster appears as if it's a single server instance to a client.
When i try to make a remote ejb jndi look up, IBM message Broker throws ClassCastexception for the factory object.
But the same code works fine for a normal local java application and junit.Why this problem occurs when called only from IBM WMB
Context context = new InitialContext(ejbJndiProperties);
Object factoryObj = context.lookup("SampleBeanTAFJ/remote");
return (SampleBeanRemote) factoryObj;
This is often called by loading parts of the interface in a different classloader to the implementation classes.
I would use the env var:
IBM_JAVA_OPTIONS=-Dibm.cl.verbose=*
Then restart the broker, this will dump classloading trace to stdout / console.txt which might give you some clues.
What are the exact classes involved in the error and what jars are they stored in? Deployed to the EG or referenced via a SHARED-CLASSES? The exact details determine which classloaders should be in use here.
I am trying to deploy Biztalk project to my local Biztalk Server using Biztalk Deployment Framework and i am getting the following error:
Information: Importing bindings
"C:\Users...\PortBindings.xml"
into application "Mdm" in BizTalk configuration database
(server=".", database="BizTalkMgmtDb")... EXEC : error :
Failed to update binding information.
[C:\Users...\Deployment.btdfproj]
Cannot update receive port "ApprovedRequests". Cannot update receive
location "ApprovedRequestsDb". The following items could not be
matched up to hosts due to name and/or trust level mismatches:
Item: 'ApprovedRequestsDb' Host: 'ReceiveHost' Trust level:
'Untrusted' You must do one of the following:
1) Create hosts with
these names and trust levels and try again
2) Re-export the MSI without the binding files and have a post import script apply a
suitable binding file.
I've already had host named 'ReceiveHost', so i decided that theres something wrong with Trust level. I tried to deploy with trust level 'Trusted' and recieved the same error.
Can't figure out what is causing the problem.
Thanks.
According to the error, in your binding file, the ApprovedRequestsDb receive location is configured to use a host (receive handler) called ReceiveHost, which is untrusted, which BizTalk cannot find.
Double-check the spelling of the host on the local BizTalk server into which you are importing the binding file. Also make sure that it is untrusted.
Finally, the host must be configured as a handler for the adapter used by your receive location. So if your receive location should use the WCF-SQL adapter, then go to the adapter configuration in the BizTalk Administration Console and ensure that the ReceiveHost is configured as a receive handler for that adapter.
Check you have a host for this install, in your case called "ReceiveHost". You can create hosts and host instances in BizTalk Server Admin Console.
Check for each adapter (especially the adapter used for "ApprovedRequestsDb") that your bindings use, that "ReceiveHost" host is set up in direction Send/Receive, this will at first likely be only BizTalkServerApplication which is the default. Under Platform Settings -> Adapters look through these and make new ones where needed to use the "SQL" host.
This error will only ocur if your HostName does not exist or incorrectly spelt. Also check the Trust level is set to Untrusted. Once you have verified the following you can re-create your binding file as ther might be some typo that is causing it not to import properly.