Exception creating stateless session bean
hello, can some one tell what is the cause and the solution of the folowing exception :
EJB5070 Exception creating stateless session bean : [{0}]
com.sun.enterprise.InjectionException: Exception attempting to inject Env-Prop: ejb3.INplateformFacade/timerService@Field-Injectable Resource. Class name = ejb3.INplateformFacade Field name=[email protected]@ejb3.INplateformFacade/timerService@@ into class ejb3.INplateformFacade
at com.sun.enterprise.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:387)
at com.sun.enterprise.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:206)
at com.sun.enterprise.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:127)
at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:533)
at com.sun.ejb.containers.StatelessSessionContainer.access$100(StatelessSessionContainer.java:111)
at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:772)
at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:199)
at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:486)
at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1675)
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1229)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:195)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:127)
at $Proxy63.tachePlanifier(Unknown Source)
thanx on advance
i dont think so it is a typo in the name.
here is my source code :
@Stateless
public class INplateformFacade implements INplateformFacadeLocal {
@PersistenceContext
private EntityManager em;
private Date datePrevis;
@Resource
TimerService timerService;
@Timeout
public void traitementPlanifier(Timer timer) throws NamingException {
listerLeReprtoir(ChercherReprtoir());
public void tachePlanifier(Date datePrevis) {
this.datePrevis = datePrevis;
timerService.createTimer(datePrevis, null);
}
Similar Messages
-
Null Pointer Exception in Stateless Session Beans(EJB 3.0)
I am executing a simple HelloUser example i code session bean interface and implementing session bean class in the EJB project.
package ejb3inaction.ejb;
import javax.ejb.Remote;
@Remote
public interface HelloUser {
public void sayHello(String name);
package ejb3inaction.ejb;
import javax.ejb.Stateless;
@Stateless
public class HelloUserBean implements HelloUser {
public void sayHello(String name) {
System.out.println("Hello " + name + " welcome to EJB 3 In Action!");
And in the client project i code this class and add JAR file of the EJB project.
package ejb3inaction.example;
import javax.ejb.EJB;
import ejb3inaction.ejb.*;
public class HelloUserClient {
@EJB
private static HelloUser helloUser;
public static void main(String[] args) {
helloUser.sayHello("Curious George");
System.out.println("Invoked EJB successfully .. see server console for output");
I am using netbeans 6.0(10 M) and Sun Application server 9.
it gives NullPointer Exception at the following line...
helloUser.sayHello("Curious George");
how i can resolve this error.
regards,
deemyWell, helloUser is just a null reference, you haven't created an instance of HelloUser to use, hence the NPE
-
Class Cast Exception in Stateless session bean
Hi,
i am getting a class cast exception in this particular line....
in my EJBClient program i get this error..
//Getting a reference to the bean's home interface in client program
SimpleSessionHome home=(SimpleSessionHome)PortableRemoteObject.narrow(ref, SimpleSessionHome.class);Wher SimpleSessionHome is my Home interface.
I am not able to correct the error. Plz help me.
Thanks,
AkshathaHi,
Make sure you are looking up the correct JNDI name. And, what king of Classloading is being used.
This could be an issue if there are different classloader in action.
According to the JBoss 4 Admin Guide.
Most developers know that the type of a class in Java is a function of the fully qualified name of the class. However the type is also a function of the java.lang.ClassLoader that is used to define that class.
Feel free to forward your queries / comment.
Pawan. -
WLS10 and Stateless Session Bean
I tried to create EJB3 application example.
1. Created Stateless Session Bean that implements Remote and Local interfaces:
Session Bean code:
package com.session;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless(mappedName="SessionBeanService")
@Remote(ISessionBeanRemote.class)
@Local(ISessionBeanLocal.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class SessionBean implements ISessionBeanLocal,
ISessionBeanRemote
public String reply(){
return "MySessionBean - success !!!";
Remote Interface code :
package com.session;
public interface ISessionBeanRemote
public String reply();
Local Interface code:
package com.session;
public interface ISessionBeanLocal
public String reply();
application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_5.xsd"
version="5">
<display-name>EJB3 Sample Application</display-name>
<module>
<ejb>beans.jar</ejb>
</module>
</application>
weblogic-application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-application PUBLIC
"-//BEA Systems, Inc.//DTD WebLogic Application 8.1.0//EN"
"http://www.bea.com/ns/weblogic/90/weblogic-application.xsd">
<weblogic-application>
<classloader-structure>
<module-ref>
<module-uri>beans.jar</module-uri>
</module-ref>
</classloader-structure>
</weblogic-application>
2. I packaged classes into EAR file and deployed to WLS10.
I didn't include any weblogic specific XML descriptors besides weblogic-application.jar.
My client code lookes as follows:
public void test(){
Context context = getMyServerContext();
// THIS JNDI NAME I SEE ON MY SERVER JNDI TREE
String jndiName = "sessionbeansbeans_jarSessionBean_ISessionBeanRemote";
Object obj;
obj = context.lookup(jndiName);
System.out.println(" obj class : " + obj.getClass().getName());
ISessionBeanRemote remote = (ISessionBeanRemote) PortableRemoteObject.narrow(
obj, ISessionBeanRemote.class );
String res = remote.reply();
System.out.println("res : "+res);
I get an Exception:
Exception occurred!
java.lang.ClassCastException: Cannot narrow remote object to com.session.ISessionBeanRemote
at weblogic.iiop.PortableRemoteObjectDelegateImpl.narrow(PortableRemoteObjectDelegateImpl.java:242)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at ca.cgi.mvest.test.server.wms.GlFacadeTest.runTest(GlFacadeTest.java:91)
at ca.cgi.mvest.test.server.wms.GlFacadeTest.<init>(GlFacadeTest.java:53)
at ca.cgi.mvest.test.server.wms.GlFacadeTest.main(GlFacadeTest.java:151)
java.lang.ClassCastException: Cannot narrow remote object to com.session.ISessionBeanRemote
My server console have the following output:
Root cause of ServletException.java.lang.NoClassDefFoundError: com/session/SessionBean_7pp7ls_ISessionBeanRemot
eIntf
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericCla
ssLoader.java:338)
at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(Generic
ClassLoader.java:291)
Truncated. see log file for complete stacktrace
Server logs a problem already on the line when I do lookup
on JNDI name even before narrow();
It looks like my EAR was missing something. But server never complained during deployment.
May be someone can direct me to a real sample of Weblogic10-ejb3.0 application, since examples that come with WLS 10 intallation combersome and do not follow
docmentation.
Thanks in advance for any suggestion.Hello Freind
The main different b\w stateful and statless is that stateful maintain state of method conversation means it has record that which method call before this method
but in case of stateless conversation state does not saved second different we can say that create method in stateless having no parameter but statefull having parameter I think u can understand easily
With Best Regards
Rajesh Pandey
email :[email protected]
url :-- http://www.sixthquadrant.com
Mob :-- 9811903737
Delhi India -
EJB: Stateless Session Bean create() Question.
Lets say I have a stateless session bean that fetches data from my database. The point of the bean is to just do large SQL searches and funnel data back to the client. The prolem I have is that I am somehow fighting memory leaks. Despite having checked the code a number of times, the memory usage on my appserver continues to climb no matter what I do. I have theorized that the problem might be in the way Im using ma DataFetchBean (DFB).
When I start the client, he obtains a user session. This is a stateful session bean that he uses for almost all communication with the server. Then I call "getDataFetchBean" in the user session which calls DataFetchBeanHome.create(). Then the client holds onto the returned reference, using it for the live of his connection. As he disconnects, he calls remove on the bean.
Question is this:
1) Is it better for me to call create() prior to each call to the stateless session bean ?
2) Do you have any theories on why im loosing memory with this setup?
TIA
-- Rob1. But I thought you were using a 'stateful session bean'?
2. For stateless session beans, there is no direct link between a remote reference and an instance of the bean. It is safe to hang on to the remote reference as long as you would like, of course it may go stale if the server dies. You will also find that the create() method does not actually contact the server, so doing it each usage costs very little. So, either way you should be fine.
3. As for memory leaks, make sure that you are closing all statements, result sets, etc. promptly. These are commonly the problem. Also, use hprof or some other profile tool to determine what types of data you are allocating and (with better tools) what types of data you may be holding on to references to.
Chuck -
EJB 3.1new instance of stateless session bean not created on new invocation
I am using Netbeans 6.8 bundle that comes with JAVA EE 6. I have created a web application then created restful web services and then created few stateless session beans (with local interfaces) that are invoked from restful web services. From the browser, when I call the url with get method, restful web services are being invoked and they in turn calls stateless session beans and does the appropriate business logic. While testing, I observed that for every new url call from the browser, the same bean is being invoked. I tested this by adding a instance variable vector and adding one item ('test") to the vector in bean's method. My understanding is that on every bean's method invocation the vector should have only one item. However, the vector is growing with many "test" items. I am literally confused, not sure this is the way it is supposed to work. I tried to invoke bean's method from restful web service by using both dependency injection and jndi look up, both instances the vector is growing with many "test" items.
I would really appreciate if some body gives me more insight.I appreciate your answers. There is a strong reason for posting this question. Basically, I am using JPA and using stateless session beans to invoke database calls. In the bean I am using the following code for entity manager.
@PersistenceContext(unitName = "AsgProtocolServerPU")
private EntityManager em;
I have noticed very strange scenario while getting records. From the application, I have obtained few records of a table. Then, I manually deleted few records from the table. Very strangely, I have obtained the deleted records during my next call to bean. After 2 hours, I tested the same and did not get those records. This is not consistent.
I am totally confused. I am just wondering this is happening because I made beans local (not remote) and placed them in the web application (Java EE6 allows this). I am not sure whether this is JPA related issue or beans issue. -
I have a stateless Session Bean EJBs deployed on the OC4J Application Server that calls this method:
public String getCurrentTime()
return ""+ new java.util.Date();
I try to access it from a client running on the same machine(windows nt).
DateEJBClient dateEJBClient = new DateEJBClient();
try
Context context = getInitialContext();
DateEJBHome dateEJBHome = (DateEJBHome)PortableRemoteObject.narrow(context.lookup("DateEJB"), DateEJBHome.class);
DateEJB dateEJB;
// Use one of the create() methods below to create a new instance
dateEJB = dateEJBHome.create();
// Call any of the Remote methods below to access the EJB
System.out.println("Date & Time >>> "+dateEJB.getCurrentTime());
catch(Throwable ex)
Any idea why I get this error?
com.evermind.server.rmi.OrionRemoteException: jazn.com/admin is not allowed to call this EJB method, check your security settings (method-permission in ejb-jar.xml and security-role-mapping in orion-application.xml).
at DateEJBHome_StatelessSessionHomeWrapper3.create(DateEJBHome_StatelessSessionHomeWrapper3.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:124)
at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:48)
at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
at java.lang.Thread.run(Thread.java:534)
at connection to localhost/127.0.0.1 as admin
at DateEJBHome_StatelessSessionHomeWrapper3.create(DateEJBHome_StatelessSessionHomeWrapper3.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:124)
at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:48)
at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
at java.lang.Thread.run(Thread.java:534)
Process exited with exit code 0.I beleive you need the POI jar file in the <ias_home>/j2ee//home/applib directory or in your app severs PATH.
-
Stateless Session Bean + EJB Question + Jboss
Hello,
If I have a stateless session bean on a linux machine and it works locally what do i need to do to access a method in the session bean from a remote windows machine.
I would like to be able to execute my client jar file on a windows machine and have it access the jboss server on the linux machine. what do i need to do?
i have the session bean working locally on both windows and linux machine. do i need to to have a JSP/Servlet to access the session bean? can the session bean not be accessed directly? what should my classpath look like? do I need to include extra jar files in my client jar file.?
Thanks,
JoyceThanks guys for the help but I am still a little lost.
My Client windows machine has the client jar file and all the other jar files. This is my client class
package helloworld.client;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
import java.util.Properties;
import helloworld.interfaces.HelloWorldHome;
import helloworld.interfaces.HelloWorld;
public class HelloClient
public static void main(String[] args)
Hashtable prop = new Hashtable();
prop.put ("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
prop.put ("java.naming.provider.url","jnp://172.16.220.160:1099");
prop.put ("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
try
Context ctx = new InitialContext(prop);
Object obj = ctx.lookup("ejb/helloworld/HelloWorld");
System.out.println(obj);
HelloWorldHome home = (HelloWorldHome)javax.rmi.PortableRemoteObject.narrow(obj, HelloWorldHome.class);
HelloWorld helloWorld = home.create();
String str = helloWorld.sayHelloEJB("JOYCE is COOL");
System.out.println(str);
helloWorld.remove();
catch(Exception e)
e.printStackTrace();
I get a NullPointer ie the home object is null. The IP address is the IP of the Linux machine that has Jboss running on.
Questions are:
1. Do I need to have Tomcat running on my client machine if I am to connect via HTTP? Does this alter my client code.?
2. My JNDI lookup is what is causing the problem. Does my jboss.xml and my ejb-jar.jar look okay to you.
jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS//EN" "http://www.jboss.org/j2ee/dtd/jboss.dtd">
<jboss>
<enterprise-beans>
<session>
<ejb-name>helloworld/HelloWorld</ejb-name>
<jndi-name>ejb/helloworld/HelloWorld</jndi-name>
</session>
</enterprise-beans>
<resource-managers>
</resource-managers>
</jboss>
ejb-jar.jar
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar >
<description>No Description.</description>
<display-name>Generated by XDoclet</display-name>
<enterprise-beans>
<!-- Session Beans -->
<session >
<description><![CDATA[No Description.]]></description>
<ejb-name>helloworld/HelloWorld</ejb-name>
<home>helloworld.interfaces.HelloWorldHome</home>
<remote>helloworld.interfaces.HelloWorld</remote>
<ejb-class>helloworld.session.HelloWorldBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
<!--
To add session beans that you have deployment descriptor info for, add
a file to your merge directory called session-beans.xml that contains
the <session></session> markup for those beans.
-->
<!-- Entity Beans -->
<!--
To add entity beans that you have deployment descriptor info for, add
a file to your merge directory called entity-beans.xml that contains
the <entity></entity> markup for those beans.
-->
<!-- Message Driven Beans -->
<!--
To add message driven beans that you have deployment descriptor info for, add
a file to your merge directory called message-driven-beans.xml that contains
the <message-driven></message-driven> markup for those beans.
-->
</enterprise-beans>
<!-- Relationships -->
<!-- Assembly Descriptor -->
<assembly-descriptor >
<!-- finder permissions -->
<!-- transactions -->
<!-- finder transactions -->
</assembly-descriptor>
</ejb-jar>
Do I need RMI ? Do I need to concern myself with CORBA? All Im looking for is a step by step to understanding what I need to configure? Is their some way I can debug?
Thanks alot,
Joyce -
Calling Stateless Session bean from Servlet
Dear Friends,
A help will be Appreciated...
I created a EJB (Stateless Session Bean) using WebSphere Application Developer with its Business logic in Main bean. Its working perfectly fine using UTC (Standalone Test Client). But when i use a servlet to communicate with this EJB, its giving me error as follows:
Error Stack:
java.lang.NoClassDefFoundError: package name/DemoHome
at java.lang.Class.newInstance0(Native Method)
at java.lang.Class.newInstance(Class.java:254)
at java.beans.Beans.instantiate(Beans.java:213)
at java.beans.Beans.instantiate(Beans.java:57)
at com.ibm.servlet.engine.webapp.WebAppServletManager.loadServlet(WebAppServletManager.java:148)
at com.ibm.servlet.engine.webapp.WebAppServletManager.getServletReference(WebAppServletManager.java:287)
at com.ibm.servlet.engine.webapp.WebApp.getServletReference(WebApp.java:354)
at com.ibm.servlet.engine.webapp.WebAppRequestDispatcherInfo.calculateInfo(WebAppRequestDispatcherInfo.java:167)
at com.ibm.servlet.engine.webapp.WebAppRequestDispatcherInfo.<init>(WebAppRequestDispatcherInfo.java:51)
at com.ibm.servlet.engine.webapp.WebApp.getRequestDispatcher(WebApp.java:1145)
at com.ibm.servlet.engine.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:179)
at com.ibm.servlet.engine.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:67)
at com.ibm.servlet.engine.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:122)
at com.ibm.servlet.engine.oselistener.OSEListenerDispatcher.service(OSEListener.java:315)
at com.ibm.servlet.engine.http11.HttpConnection.handleRequest(HttpConnection.java:60)
at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:323)
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:252)
at com.ibm.ws.util.CachedThread.run(ThreadPool.java:122)
For more Info let me provide the snipets of how i used the Sevlet:
Client.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import packagename.*; //package name of imported ear file which is in
//classpath
public class Client extends HttpServlet {
public void doGet(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
PrintWriter out=response.getWriter();
Properties p = new Properties();
p.put(javax.naming.Context.PROVIDER_URL, "iiop:///");
p.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
try {
InitialContext initial = new InitialContext(p);
Object objref = initial.lookup("JDemo");
DemoHome home = (DemoHome)PortableRemoteObject.narrow(objref,DemoHome.class);
Demo demo = home.create();
int r=demo.testBean(4);
out.println("EJB RESULT= "+r);
} catch (Exception ex) {
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
Kindly provide ur solution to this problem. Urgent solution will be helpful as its a part of our present project.
Thanking you for ur esteemed help.
regards,
Arun.Perhaps you webserver can't see your package jar file.
Try putting it in WEB-INF\lib directory of your app and restart your server. -
Stateless Session Bean has no Context when called from WAR
Hello,
Here is the code for my stateless session bean (it will carry out certain actions based on the timer service)
package DigestTest;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.Date;
import javax.ejb.*;
import javax.ejb.TimedObject;
import javax.ejb.Timer;
* This is the bean class for the MasterTimerBean enterprise bean.
* Created Sep 7, 2006 9:05:09 AM
* @author ttaylor
public class MasterTimerBean implements SessionBean, MasterTimerRemoteBusiness, MasterTimerLocalBusiness, TimedObject
private SessionContext context;
public void setSessionContext(SessionContext aContext)
context = aContext;
* @see javax.ejb.SessionBean#ejbActivate()
public void ejbActivate()
* @see javax.ejb.SessionBean#ejbPassivate()
public void ejbPassivate()
* @see javax.ejb.SessionBean#ejbRemove()
public void ejbRemove()
// </editor-fold>
* See section 7.10.3 of the EJB 2.0 specification
* See section 7.11.3 of the EJB 2.1 specification
public void ejbCreate()
// TODO implement ejbCreate if necessary, acquire resources
// This method has access to the JNDI context so resource aquisition
// spanning all methods can be performed here such as home interfaces
// and data sources.
public void ejbTimeout(Timer timer)
try
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\timerTest.txt"));
writer.write("Timer has tripped");
writer.newLine();
writer.flush();
writer.close();
catch(Exception e)
return;
// Add business logic below. (Right-click in editor and choose
// "EJB Methods > Add Business Method" or "Web Service > Add Operation")
public String initializeTimer()
String result = "\n\nInitializing Timer\n";
try
// Create Your Timer
if(context!=null)
TimerService ts = context.getTimerService();
result = result+"Instantiating Timer Object\n";
Timer timer = ts.createTimer(new Date(), 5000, "TestTimer");
result = result+"About to grab TimerHandle";
TimerHandle timerHandle = timer.getHandle();
else
result = result+"\nContext Object is null\n";
catch (Exception e)
result = result+"\nError:\n"+e.toString();
return result;
public String writerTest()
String result = "about to write";
try
result = result+"\nOpening the file";
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\timerTest.txt"));
result = result+"\nWriter Test Passed";
writer.write("Writer Works");
writer.newLine();
result = result+"\nFlushing writer";
writer.flush();
result = result+"\nClosing writer";
writer.close();
catch (Exception e)
result = result+"\n"+e.toString();
return result;
I am calling initializeTimer() from a jsp page with a simple <jsp:useBean tag>.
The program keeps returning that the context variable is not set(this is from the context!=null conditional in initializeTimer()). I am very confused, I thought that setContext(...) was called by the container upon instantiation (and thus should happen completely without any action from me).
How am I able to call a session bean that has not had the context set?
Any information is appreciated,
Thanks,
Scottthank you for your reply, rajeevm007.
it seems that the question is really a problem now.
i think i should update weblogic to the lastest version and confirm this question. if it still in there, it seems that we have to reset the global variables all manually. so, now, we are discussing that should we modify all the ejbs, or wait the next version of weblogic. :) of cause the second choice is a joke.
no other good choice?
maybe in the march of the next year....
cheers
thank you again. -
StreamCorruptedException from Stateless Session bean to java class
Hi all,
We have 2 servers, a ColdFusion App server which contains suns jdk 1.4.2 and websphere appserver using Ibm jdk, 1.4.2. On Server 1, we have a standalone java class which does a stateless session bean lookup and requests a service from it. On server 2(websphere), we have a stateless session bean deployed which connects to a database using a jndi lookup, executes a query and returns back a CachedRowSet object (which populates the ResultSet from the above query.) In some cases, session bean returns back an array of objects or String objects or just plain int values.
When the java class on server 1 invokes the methods returning CachedRowSet, we are getting a StreamCorruptedException, whereas on the server side, there is no exception. everything gets executed fine on websphere. This is the case only for CachedRowSet and not for other return types(as mentioned earlier the session bean returns an array of object in some cases which the java class on server 1 is successfully able to use).
This is what the piece of code look like on server 1:
// First gets a StatelessSessionBean using suns InitialContextFactory
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory");
env.put(Context.PROVIDER_URL,"iiop://localhost:2809");
System.out.println("Creating initial context");
Context ctx = new InitialContext(env);
System.out.println("Initial context created.");
Object homeObj = ctx.lookup("cell/nodes/localhost/servers/server1/ejb/SSBHome");
SSBHome eHome = (SSBHome)PortableRemoteObject.narrow(homeObj,SSBHome.class);
System.out.println("Got Home");
SSB eBean = eHome.create();
CachedRowSet crs = eBean.getAccts(param1, param2);
//This is the line of code which throws the exception.
The stacktrace shoows as follows:
Got Home
java.io.StreamCorruptedException
at com.sun.corba.se.internal.io.IIOPInputStream.inputRemoteMembersForReadFields(IIOPInputStream.java:1675)
at com.sun.corba.se.internal.io.IIOPInputStream.readFields(IIOPInputStream.java:1595)
at com.sun.corba.se.internal.io.InputStreamHook.readFields(InputStreamHook.java:177)
at java.math.BigInteger.readObject(BigInteger.java:3034)
at com.sun.corba.se.internal.io.IIOPInputStream.readObject(Native Method)
at com.sun.corba.se.internal.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1298)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:908)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1484)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1893)
at com.sun.corba.se.internal.io.IIOPInputStream.defaultReadObjectDelegate(IIOPInputStream.java:424)
at com.sun.corba.se.internal.io.InputStreamHook.defaultReadObject(InputStreamHook.java:163)
at java.math.BigDecimal.readObject(BigDecimal.java:1084)
at com.sun.corba.se.internal.io.IIOPInputStream.readObject(Native Method)
at com.sun.corba.se.internal.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1298)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectUsingFVD(IIOPInputStream.java:1182)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:259)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:948)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:289)
at com.sun.corba.se.internal.corba.TCUtility.unmarshalIn(TCUtility.java:266)
at com.sun.corba.se.internal.corba.AnyImpl.read_value(AnyImpl.java:561)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_any(CDRInputStream_1_0.java:635)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_any(CDRInputStream.java:260)
at com.sun.corba.se.internal.javax.rmi.CORBA.Util.readAny(Util.java:100)
at javax.rmi.CORBA.Util.readAny(Util.java:90)
at com.sun.corba.se.internal.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:586)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:244)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:948)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:289)
at com.sun.corba.se.internal.corba.TCUtility.unmarshalIn(TCUtility.java:266)
at com.sun.corba.se.internal.corba.AnyImpl.read_value(AnyImpl.java:561)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_any(CDRInputStream_1_0.java:635)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_any(CDRInputStream.java:260)
at com.sun.corba.se.internal.javax.rmi.CORBA.Util.readAny(Util.java:100)
at javax.rmi.CORBA.Util.readAny(Util.java:90)
at com.sun.corba.se.internal.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:586)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:244)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.EJBProj._SSB_Stub.getAccts(_SSB_Stub.java:240)
at com.test.Test1.getAccts(Test1.java:101)
at com.test.Test1.<init>(Test1.java:65)
at com.test.Test1.main(Test1.java:81)
java.io.IOException: Unable to read value from underlying bridge : Serializable readObject method failed internally
at com.sun.corba.se.internal.io.IIOPInputStream.throwExceptionType(Native Method)
at com.sun.corba.se.internal.io.IIOPInputStream.defaultReadObjectDelegate(IIOPInputStream.java:446)
at com.sun.corba.se.internal.io.InputStreamHook.defaultReadObject(InputStreamHook.java:163)
at java.math.BigDecimal.readObject(BigDecimal.java:1084)
at com.sun.corba.se.internal.io.IIOPInputStream.readObject(Native Method)
at com.sun.corba.se.internal.io.IIOPInputStream.invokeObjectReader(IIOPInputStream.java:1298)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectUsingFVD(IIOPInputStream.java:1182)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:259)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:948)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:289)
at com.sun.corba.se.internal.corba.TCUtility.unmarshalIn(TCUtility.java:266)
at com.sun.corba.se.internal.corba.AnyImpl.read_value(AnyImpl.java:561)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_any(CDRInputStream_1_0.java:635)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_any(CDRInputStream.java:260)
at com.sun.corba.se.internal.javax.rmi.CORBA.Util.readAny(Util.java:100)
at javax.rmi.CORBA.Util.readAny(Util.java:90)
at com.sun.corba.se.internal.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:586)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:244)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:948)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:289)
at com.sun.corba.se.internal.corba.TCUtility.unmarshalIn(TCUtility.java:266)
at com.sun.corba.se.internal.corba.AnyImpl.read_value(AnyImpl.java:561)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_any(CDRInputStream_1_0.java:635)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_any(CDRInputStream.java:260)
at com.sun.corba.se.internal.javax.rmi.CORBA.Util.readAny(Util.java:100)
at javax.rmi.CORBA.Util.readAny(Util.java:90)
at com.sun.corba.se.internal.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:586)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:244)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1577)
at com.sun.corba.se.internal.io.IIOPInputStream.inputClassFields(IIOPInputStream.java:1796)
at com.sun.corba.se.internal.io.IIOPInputStream.inputObject(IIOPInputStream.java:913)
at com.sun.corba.se.internal.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:261)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:247)
at com.sun.corba.se.internal.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:209)
at com.sun.corba.se.internal.iiop.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1084)
at com.sun.corba.se.internal.iiop.CDRInputStream.read_value(CDRInputStream.java:293)
at com.EJBProj._SSB_Stub.getAccts(_SSB_Stub.java:240)
at com.test.Test1.getAccts(Test1.java:101)
at com.test.Test1.<init>(Test1.java:65)
at com.test.Test1.main(Test1.java:81)
Again, everything seems to work fine on websphere server.
Any Clue of why this is happening?
All suggestions are greatly appreciated.
Thanks
Neorav
Message was edited by:
NeoravBSorry for the confusion!
The solution mentioned above is not the right solution.
The above given code works fine irrespective of having corbaloc in the url, if you are working in the IBMs jvm.
It fails if you are working in suns jvm.
Anyone with any idea whats missing here.
Thanks a lot for any suggestion/ideas
Neorav -
Not be able to obtain a transacted session within stateless session bean
I need some assistance on creating a transacted session. For some reason while within a stateless session bean, I am unable to create a transacted session even though I'm specifying to create the transacted queue session. Can anyone provide any assistance to me on this? It would be much appreciated.
Here is the code snippets involved with the problem:
Code snipet from ejb-jar.xml:
<session>
<display-name>Initial Request</display-name>
<ejb-name>InitialRequestBean</ejb-name>
<ejb-class>com.raytheon.rds.jms.InitialRequestBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
Code from stateless session bean:
static Logger logger;
private QueueConnectionFactory connectionFactory;
private SessionContext sc;
private Queue requestQueue;
public String processRequest(String msgBody)
logger.log(Level.INFO, "In processRequest(String).", msgBody);
QueueConnection con = null;
QueueSession session = null;
QueueSender sender = null;
TextMessage message = null;
String messageID = null;
QueueReceiver receiver = null;
TemporaryQueue replyQueue = null;
boolean transacted = false;
try
//Create the infrastructure (ie. The connection & the session)
logger.log(Level.FINE, "Creating connection");
con = connectionFactory.createQueueConnection();
logger.log(Level.FINE, "Creating session");
session = con.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
//Note: This line above was changed in all possible permutation and still didn't work such as using Session.SESSION_TRANSACTED
transacted = session.getTransacted();
logger.log(Level.FINE, "Is session transacted? : " + transacted);
//Note: This line above is constantly saying false
//Now first, setup the temporary reply queue and its listener
replyQueue = session.createTemporaryQueue();
logger.log(Level.FINE, "Creating receiver/consumer");
receiver = session.createReceiver(replyQueue);
con.start();
//Now create the requestor that will make the request message and put it on the request queue
logger.log(Level.FINE, "Creating Requestor/Producer");
sender = session.createSender(requestQueue);
//Now create the message and make sure that you put the "JMSReplyTo" property to the temporary response queue we just created
message = session.createTextMessage();
message.setJMSReplyTo(replyQueue);
logger.log(Level.FINE, "Created message: " + message.getJMSMessageID());
//Now add the actual info you want to send
message.setText(msgBody);
//Now send the message
logger.log(Level.INFO, "Sending message: " + message.getText());
sender.send(message);
//Now wait until we get a response
logger.log(Level.FINE, "Waiting for the response message");
Message responseMsg = receiver.receive(20000); //Toggle the "0" to specify timeout in millisectionds
//Process the message
logger.log(Level.FINE, "Processing the response message");
if(null != responseMsg)
logger.log(Level.FINE, "responseMsg is : " + responseMsg.toString());
messageID = processMessage(responseMsg);
logger.log(Level.FINE, "Response is : " + messageID);
//close the connection
logger.log(Level.FINE, "Stopping the connection");
con.stop();
catch (Throwable t)
// JMSException could be thrown
logger.log(Level.SEVERE, "Exception Thrown in sendRequest: ", t);
sc.setRollbackOnly();
finally
//Close the sender
if (sender != null)
try
logger.log(Level.FINE, "Closing the sender");
sender.close();
catch (JMSException e)
logger.log(Level.WARNING, "JMSException Thrown when trying to close the sender to the request queue: ", e);
else
logger.log(Level.FINE, "Sender is already closed.");
//Close the receiver
if (receiver != null)
try
logger.log(Level.FINE, "Closing the receiver");
receiver.close();
catch (JMSException e)
logger.log(Level.WARNING, "JMSException Thrown when trying to close the receiver to the request queue: ", e);
else
logger.log(Level.FINE, "Receiver is already closed.");
//Close the session
if (session != null)
try
logger.log(Level.FINE, "Closing the session");
session.close();
catch (JMSException e)
logger.log(Level.WARNING, "JMSException Thrown when trying to close the session to the request queue: ", e);
else
logger.log(Level.FINE, "Session is already closed.");
//Close the connection
if (con != null)
try
logger.log(Level.FINE, "Closing the connection");
con.close();
catch (JMSException e)
logger.log(Level.WARNING, "JMSException Thrown when trying to close the connection to the reply queue: ", e);
else
logger.log(Level.FINE, "Connection is already closed.");
return messageID;
}I found the answer through lots of painful searching.
http://blogs.sun.com/fkieviet/entry/request_reply_from_an_ejb
This weblog from Frank Kieviet from a sun blog explains what's happening behind the scenes.
Then I proceeded to create a Bean-Managed Transaction out of my EJB, which is using EJB 3.0. This requires the tag:
@TransactionManagement(value= TransactionManagementType.BEAN)
Note: I got this information from http://download.oracle.com/docs/cd/B31017_01/web.1013/b28221/servtran001.htm#BAJIBAFF
Then I just added the code specified in Frank's blog and everything is working now. The main portion of the code looks like this now:
//begin the user transaction
ctx.getUserTransaction().begin();
//Create the infrastructure (ie. The connection & the session)
logger.log(Level.FINE, "Creating connection");
con = connectionFactory.createQueueConnection();
//Create the session
logger.log(Level.FINE, "Creating session");
session = con.createQueueSession(false, Session.SESSION_TRANSACTED);
transacted = session.getTransacted();
logger.log(Level.FINE, "Is session transacted? : " + transacted);
//Now create the sender that will make the request message and put it on the request queue
logger.log(Level.FINE, "Creating Sender");
sender = session.createSender(requestQueue);
//Now create the message
message = session.createTextMessage();
//Now add the actual info you want to send
message.setText(msgBody);
logger.log(Level.FINE, "Created message: " + message.getJMSMessageID());
//Now first, setup the temporary reply queue and its listener
replyQueue = session.createTemporaryQueue();
if(null != replyQueue)
logger.log(Level.FINE, "Created temporary queue: " + replyQueue.getQueueName());
else
logger.log(Level.FINE, "Temporary Queue could not be created.");
//make sure that you put the "JMSReplyTo" property to the temporary response queue we just created
message.setJMSReplyTo(replyQueue);
//Now send the message
logger.log(Level.INFO, "Sending message: " + message.getText());
sender.send(message);
//Now start the connection
logger.log(Level.FINE, "Starting the connection");
con.start();
//commit the changes
ctx.getUserTransaction().commit();
ctx.getUserTransaction().begin();
//Create the receiver
logger.log(Level.FINE, "Creating Receiver");
receiver = session.createReceiver(replyQueue);
//Now wait until we get a response
logger.log(Level.FINE, "Waiting for the response message");
Message responseMsg = receiver.receive(20000); //Toggle the "0" to specify timeout in millisectionds
//Process the message
logger.log(Level.FINE, "Processing the response message");
if(null != responseMsg)
logger.log(Level.FINE, "responseMsg is : " + responseMsg.toString());
else
logger.log(Level.FINE, "No response came back.");
messageID = processMessage(responseMsg);
logger.log(Level.FINE, "Response is : " + messageID);
logger.log(Level.FINE, "Transaction is complete");
//commit the changes
ctx.getUserTransaction().commit(); -
Help Connecting A Stateless Session Bean To MySQL Database
Hi, I'm trying to connect a simple stateless session bean that has been
deployed using the admin console to a MySQL database that has been
set up and pinged using the JDBC Resources/Connection Pools part of the
admin console.
When I attempt to connect to the database using the session bean I get the
following error message:
Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.RemoteException: ; nested exception is:
java.sql.SQLException: No database selected
at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:161)
at javax.rmi.CORBA.Util.mapSystemException(Unknown Source)
at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:142)
at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(Unknown Source)
at DBDynamicStub.testDatabase(_DB_DynamicStub.java)
at DBClient.main(DBClient.java:9)
Caused by: java.rmi.RemoteException: ; nested exception is:
java.sql.SQLException: No database selected
at com.sun.ejb.containers.InvocationHandlerUtil.throwRemoteException(InvocationHandlerUtil.java:96)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:141)
at $Proxy26.testDatabase(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:123)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:648)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:192)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1709)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1569)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:951)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:181)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:721)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.dispatch(SocketOrChannelConnectionImpl.java:469)
at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.doWork(SocketOrChannelConnectionImpl.java:1258)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:409)
Caused by: java.sql.SQLException: No database selected
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2851)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1531)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1622)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2379)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2306)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1192)
at DBBean.testDatabase(DBBean.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.enterprise.security.SecurityUtil$2.run(SecurityUtil.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.enterprise.security.application.EJBSecurityManager.doAsPrivileged(EJBSecurityManager.java:950)
at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:158)
Obviously this means that the bean can't connect to the database but I am
unsure why this is. When I set up the database using the admin console
I set the the jndi name to jdbc/test and I've tried using the following look up
code to find the database that is referenced by the JNDI name:
Context context = new javax.naming.InitialContext();
DataSource ds = (DataSource) context.lookup("jdbc/test");
and also
Context context = new javax.naming.InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/test");
Neither of these methods work.
When I look at the JNDI Tree Browsing window which is available from the
admin console there is no mention of the database at all, there are four
items in the three, they are:
UserTransaction
->jdbc
->ejb
DBBean
Do I need to add a JNDI reference somewhere in order for the bean to locate
the database? I thought that when I created the database in the admin
console and specified a JNDI name this would be all that's required in order
for beans to locate the database, obviously not.
If anyone can offer any advice at all I would be very very grateful.
Ianstmt.execute("use YOUR_DATABASE_NAME");
// then your db queries.This approach works for me.
It also works to specify the database in the query like this:
InitialContext initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/myDB");
Connection conn = ds.getConnection();
try {
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("select * from myDB.news");
...As you can see I added myDB. to the query.
But why is this necessary?
If I use DriverManager instead, this is NOT necessary. Like this:
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB", "username", "password");
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("select * from news");
...Why do I not have to run the query statement.execute("use YOUR_DATABASE_NAME"); or specify the database name in the query statement.executeQuery("select * from myDB.news"); when I use DriverManager to obtain a Connection when I have to do that when using a DataSource?
It don't seem very efficient to have to run the extra query ( use db-name ) before I run any other query in my application. -
JNDI lookup of a Stateless Session bean from another stateless session bean
Hi,
I am working on SAP Netweaver. We have created a stateless session bean which is finally deployed as a webservice. From this stateless session bean we need to call another stateless session bean as a local reference.
I have done the following.
1. Added JNDI-Name to the ejb-j2ee-engine.xml.
2. My lookup code is as follows
Context context = null;
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sap.engine.services.jndi.InitialContextFactoryImpl");
context = new InitialContext(env);
Object ejbObj = context.lookup("MyBean");
But i get the NamingException .Here MyBean is the jndi-name provided in the ejb-j2ee-engine.xml.
Can somebody tell me what i am doing wrong.
Thanks
PriyaHi,
Thanks for your replies.I did as you had suggested.I added ejb-local-ref to the ejb-jar.xml and i provided ejb-ref as MyBean.
My lookup code uses the string
ctxt.lookup("localejbs\MyBean");
But still i get Naming Exception.
I tried something different yesterday.
I changed the code to use
InitialContext ctxt = new InitialContext();
ctxt.lookup("localejbs/"+ pathfromJNDIRegistry);
and this time i did not get Naming exception but i got RemoteException saying there was error loading the class.
Is there something i need to add somewhere for the classloader to be able to find and load this class in the second scenario.
Please suggest me which method to go for amongst the two and what is the missing information i need to add.
Thanks
Priya -
Transaction is not Rolling Back in Stateless Session Bean
Hi,
I am using UserTransaction in Stateless Session bean .
Transaction is not rolling back.
The following code is writen in stateless session bean. In UserTransaction i am
calling Two methods of another stateless session bean.
The problem is if doJob2() method fails, doJob1() method is rolling back. These
two methods consist of SQL statement with different Connection Object from TXDataSource.And
session bean(TestSession) is set to CMT, attribute as "Required".
try{
Context ictx=new InitialContext();
TestHome home=(TestHome)ictx.lookup("TestSession");
utx = sessionCtx.getUserTransaction();
utx.begin();
TestRemote remote=home.create();
remote.doJob1();
remote.doJob2();
utx.commit();
}catch(Exception e)
try{
utx.rollback();
}catch(Exception ex)
System.out.println("unable to rollback"+ex);
if any SQL Exception as occured in doJob2(), its calling method utx.rollback()
in catch block. but SQL statements executed thru. doJob1() are not rolling back.
what might be the reason?
thanks
Ranganath
Thanx Priscilla ,
Transaction is working.
ranganath
"Priscilla Fung" <[email protected]> wrote:
>
>In your ejb-jar.xml, you should specify <transaction-type> element to
>be "Container"
>for container-managed transaction. If you specified it to be "Bean" for
>bean-managed
>transaction, EJB ontainer will suspend the caller's transaction before
>starting
>a new transaction for your doJobX() methods. Thus, doJob1()nd doJob2()
>will be
>executing in different transactions, and thus rolling back doJob2()'s
>transaction
>will have no effect on work done and committed in doJob1()'s transaction.
>
>Regards,
>
>Priscilla
>
>
>"Ranganath" <[email protected]> wrote:
>>
>>
>>
>>I am sending config.xml,deployment descriptors, code snippet for TestSession.
>>i
>>am using weblogic6.0sp2.
>>if you need any aditional info. please let me know.
>>
>>thanks
>>ranganath
>>
>>EJB-JAR.xml
>>
>><?xml version="1.0"?>
>>
>><!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise
>JavaBeans
>>1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>
>>
>><ejb-jar>
>> <enterprise-beans>
>> <session>
>> <ejb-name>TestSession</ejb-name>
>> <home>com.apar.sslbridge.test.TestHome</home>
>> <remote>com.apar.sslbridge.test.TestRemote</remote>
>> <ejb-class>com.apar.sslbridge.test.TestBean</ejb-class>
>> <session-type>Stateless</session-type>
>> <transaction-type>Bean</transaction-type>
>> <resource-ref>
>> <res-ref-name>jdbc/oraclePool</res-ref-name>
>> <res-type>javax.sql.DataSource</res-type>
>> <res-auth>Container</res-auth>
>> </resource-ref>
>> </session>
>> </enterprise-beans>
>> <assembly-descriptor>
>> <container-transaction>
>> <method>
>> <ejb-name>TestSession</ejb-name>
>> <method-intf>Remote</method-intf>
>> <method-name>*</method-name>
>> </method>
>> <trans-attribute>Required</trans-attribute>
>> </container-transaction>
>> </assembly-descriptor>
>></ejb-jar>
>>
>>
>>TestSession CODE:
>>
>>
>> public void doJob1() throws RemoteException
>> {
>> Statement st = null;
>> String query=null;
>> try{
>> con=getConnection();
>> st=con.createStatement();
>> query="insert into x values("+x+++")";
>> System.out.println(query);
>> int rec=st.executeUpdate(query);
>> }catch(SQLException sqle)
>> {
>> System.out.println("SQL Exception "+sqle);
>> throw new RemoteException("RemoteException*****SQLError");
>> } catch (Exception e) {
>> System.out.println("Exception "+e);
>> throw new RemoteException("RemoteException*****GenralError");
>> }
>>}
>>
>>
>> public void doJob2()throws RemoteException
>> {
>> Connection con=null;
>> Statement st = null;
>> String query=null;
>> try{
>> con=getConnection();
>> st=con.createStatement();
>> query="insert into y values("+x+++")";
>> System.out.println(query);
>> int rec=st.executeUpdate(query);
>> }catch(SQLException sqle)
>> {
>> System.out.println("SQL Exception "+sqle);
>> throw new RemoteException("RemoteException*****SQLError");
>> } catch (Exception e) {
>> System.out.println("Exception "+e);
>> throw new RemoteException("RemoteException*****GenralError");
>>}
>>}
>>private Connection getConnection(){
>>try {
>>Connection con = StaticParams.POOL_DATASOURCE.getConnection();
>>return con;
>> } catch(Exception e) {
>> System.out.println("TestBean.getConnection() Unable to get get pool
>>connection
>>" + e);
>> }
>>}
>>
>>
>>
>>
>>"Priscilla Fung" <[email protected]> wrote:
>>>
>>>It should work if you are using TxDataSource. Could you post your
>config.xml,
>>>deployment descriptors, code snippet for TestSession?
>>>
>>>Regards,
>>>
>>>Priscilla
>>>
>>>"Ranganath" <[email protected]> wrote:
>>>>
>>>>Hi,
>>>>
>>>> I am using UserTransaction in Stateless Session bean .
>>>> Transaction is not rolling back.
>>>>
>>>>The following code is writen in stateless session bean. In UserTransaction
>>>>i am
>>>>calling Two methods of another stateless session bean.
>>>> The problem is if doJob2() method fails, doJob1() method is rolling
>>>> back. These
>>>>two methods consist of SQL statement with different Connection Object
>>>>from TXDataSource.And
>>>>session bean(TestSession) is set to CMT, attribute as "Required".
>>>>
>>>> try{
>>>> Context ictx=new InitialContext();
>>>> TestHome home=(TestHome)ictx.lookup("TestSession");
>>>> utx = sessionCtx.getUserTransaction();
>>>> utx.begin();
>>>> TestRemote remote=home.create();
>>>> remote.doJob1();
>>>> remote.doJob2();
>>>> utx.commit();
>>>> }catch(Exception e)
>>>> {
>>>> try{
>>>> utx.rollback();
>>>> }catch(Exception ex)
>>>> {
>>>> System.out.println("unable to rollback"+ex);
>>>> }
>>>> }
>>>>if any SQL Exception as occured in doJob2(), its calling method utx.rollback()
>>>>in catch block. but SQL statements executed thru. doJob1() are not
>>rolling
>>>>back.
>>>>what might be the reason?
>>>>
>>>>thanks
>>>>Ranganath
>>>
>>
>
Maybe you are looking for
-
Need More details on ACE Job Summary Report (.ajs)
We are running ACE 8.00c.05. I have questions regarding the DPV Summary section of the .ajs report. My predecessor was using the data values to report out an overall DPV rate of our mailing. I would to make sure that we are working on the correct
-
After downloading Music (-50) error
I have the current itunes 7.0. Just updated. Ever since, I have been unable to download music. I get a -50 error and it tells me to check the connection. The connections are good. My DNS is good. I did not switch ISPs. I checked permissions. Permissi
-
Fetching large results into excel
I would like to fetch 50,000 records from an oracle database and store it as an ascii file so that it can be viewed through an excel. The request will be initiated from a client�s computer through J2ee web application. 1. What is the best way to fetc
-
RMI apps will not exit for 60 seconds.
Yes, I'm sure this has been asked more times than you can fit in a 32 bit int, but how can I get my RMI programs to exit when main() exits. Even seemingly innocent programs like this: import java.rmi.*; import java.rmi.server.*; public class Stuff {
-
I have already downloaded OS X Mavericks and in purchases, its there again and I hit download by mistake. why is it downloading again??