[jboss-dev-forums] [Design of EJB 3.0] - EJBTHREE-1669 : @Service tutorial on JBoss-5.0 GA
jaikiran
do-not-reply at jboss.com
Sat Jan 10 04:21:18 EST 2009
The "service" tutorial fails against the JBossAS-5.0 GA server.
The @Service is almost on the lines of what we have in our testsuite, except for one difference. The one in the tutorial uses @Depends on a field/method to inject a application specific type object:
@Service(objectName = ServiceThree.OBJECT_NAME)
| @Management(ServiceThreeManagement.class)
| @Depends(
| {ServiceTwo.OBJECT_NAME, ServiceOne.OBJECT_NAME})
| public class ServiceThree implements ServiceThreeManagement
| {
| /**
| * The ObjectName for {@link ServiceThree}
| */
| public static final String OBJECT_NAME = "tutorial:service=ServiceThree";
|
| // This one works - see the way this is handled in the Dependency*Injector
| @Depends(ServiceOne.OBJECT_NAME)
| public ObjectName serviceOneName;
|
|
| private ServiceTwoManagement service2;
|
| // Its this injection which causes problem
| @Depends(ServiceTwo.OBJECT_NAME)
| public void setServiceTwo(ServiceTwoManagement service2)
| {
| this.service2 = service2;
| }
|
| public String serviceOneHello() throws Exception
| {
| Object[] args = new Object[0];
| String[] signature = new String[0];
| System.out.println("ServiceThree - Calling ServiceOne.sayHello() via JMX server");
| MBeanServer server = (MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
| return (String) server.invoke(serviceOneName, "sayHello", args, signature);
| }
|
| public String serviceTwoHello()
| {
| System.out.println("ServiceThree - Calling ServiceTwo.sayHello() via MBean proxy");
| return service2.sayHello();
| }
|
And this is the logs that i see on the console:
14:31:39,435 INFO [JBossASKernel] Created KernelDeployment for: jboss-ejb3-tutorial-service.jar
| 14:31:39,435 INFO [JBossASKernel] installing bean: jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceOne,service=EJB3
| 14:31:39,435 INFO [JBossASKernel] with dependencies:
| 14:31:39,435 INFO [JBossASKernel] and demands:
| 14:31:39,435 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
| 14:31:39,435 INFO [JBossASKernel] and supplies:
| 14:31:39,435 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneManagement
| 14:31:39,435 INFO [JBossASKernel] jndi:ServiceOne/remote
| 14:31:39,435 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneLocal
| 14:31:39,435 INFO [JBossASKernel] jndi:ServiceOne/local-org.jboss.tutorial.service.bean.ServiceOneLocal
| 14:31:39,435 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneRemote
| 14:31:39,435 INFO [JBossASKernel] jndi:ServiceOne/remote-org.jboss.tutorial.service.bean.ServiceOneRemote
| 14:31:39,435 INFO [JBossASKernel] jndi:ServiceOne/local
| 14:31:39,435 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceOne,service=EJB3) to KernelDeployment of: jboss-ejb3-tutorial-service.jar
| 14:31:39,436 INFO [JBossASKernel] installing bean: jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceThree,service=EJB3
| 14:31:39,436 INFO [JBossASKernel] with dependencies:
| 14:31:39,436 INFO [JBossASKernel] and demands:
| 14:31:39,436 INFO [JBossASKernel] tutorial:service=ServiceTwo
| 14:31:39,436 INFO [JBossASKernel] tutorial:service=ServiceOne
| 14:31:39,436 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
| 14:31:39,436 INFO [JBossASKernel] and supplies:
| 14:31:39,436 INFO [JBossASKernel] jndi:ServiceThree/remote
| 14:31:39,436 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceThreeManagement
| 14:31:39,436 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceThree,service=EJB3) to KernelDeployment of: jboss-ejb3-tutorial-service.jar
| 14:31:39,437 INFO [JBossASKernel] installing bean: jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceTwo,service=EJB3
| 14:31:39,437 INFO [JBossASKernel] with dependencies:
| 14:31:39,437 INFO [JBossASKernel] and demands:
| 14:31:39,437 INFO [JBossASKernel] tutorial:service=ServiceOne
| 14:31:39,437 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
| 14:31:39,437 INFO [JBossASKernel] and supplies:
| 14:31:39,437 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceTwoManagement
| 14:31:39,437 INFO [JBossASKernel] jndi:ServiceTwo/remote
| 14:31:39,437 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=jboss-ejb3-tutorial-service.jar,name=ServiceTwo,service=EJB3) to KernelDeployment of: jboss-ejb3-tutorial-service.jar
| 14:31:39,486 INFO [EJBContainer] STARTED EJB: org.jboss.tutorial.service.bean.ServiceOne ejbName: ServiceOne
| 14:31:39,504 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
|
| ServiceOne/remote - EJB3.x Default Remote Business Interface
| ServiceOne/remote-org.jboss.tutorial.service.bean.ServiceOneRemote - EJB3.x Remote Business Interface
| ServiceOne/local - EJB3.x Default Local Business Interface
| ServiceOne/local-org.jboss.tutorial.service.bean.ServiceOneLocal - EJB3.x Local Business Interface
|
| 14:31:39,526 INFO [JBossASKernel] installing bean: tutorial:service=ServiceOne
| 14:31:39,526 INFO [JBossASKernel] with dependencies:
| 14:31:39,527 INFO [JBossASKernel] and demands:
| 14:31:39,527 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
| 14:31:39,527 INFO [JBossASKernel] and supplies:
| 14:31:39,527 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneManagement
| 14:31:39,527 INFO [JBossASKernel] jndi:ServiceOne/remote
| 14:31:39,527 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneLocal
| 14:31:39,527 INFO [JBossASKernel] jndi:ServiceOne/local-org.jboss.tutorial.service.bean.ServiceOneLocal
| 14:31:39,527 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceOneRemote
| 14:31:39,527 INFO [JBossASKernel] jndi:ServiceOne/remote-org.jboss.tutorial.service.bean.ServiceOneRemote
| 14:31:39,527 INFO [JBossASKernel] jndi:ServiceOne/local
| 14:31:39,549 INFO [JBossASKernel] Installing bean(tutorial:service=ServiceOne) into kernel
| 14:31:39,578 INFO [STDOUT] ServiceOne - Creating
| 14:31:39,595 INFO [STDOUT] ServiceOne - Starting
| 14:31:39,667 INFO [EJBContainer] STARTED EJB: org.jboss.tutorial.service.bean.ServiceThree ejbName: ServiceThree
| 14:31:39,667 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
|
|
| 14:31:39,702 ERROR [ServiceContainer] Encountered an error in start of ServiceThree
| java.lang.RuntimeException: Error creating MBeanProxy: tutorial:service=ServiceTwo
| at org.jboss.mx.util.MBeanProxyExt.init(MBeanProxyExt.java:415)
| at org.jboss.mx.util.MBeanProxyExt.<init>(MBeanProxyExt.java:99)
| at org.jboss.mx.util.MBeanProxyExt.create(MBeanProxyExt.java:394)
| at org.jboss.mx.util.MBeanProxyExt.create(MBeanProxyExt.java:349)
| at org.jboss.injection.DependsMethodInjector.inject(DependsMethodInjector.java:67)
| at org.jboss.injection.DependsMethodInjector.inject(DependsMethodInjector.java:52)
| at org.jboss.ejb3.service.ServiceContainer.injectDependencies(ServiceContainer.java:594)
| at org.jboss.ejb3.service.ServiceContainer.lockedStart(ServiceContainer.java:296)
| at org.jboss.ejb3.EJBContainer.start(EJBContainer.java:879)
| 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 org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
| at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:150)
| .....
| at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
| at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
| at java.lang.Thread.run(Thread.java:595)
| Caused by: javax.management.InstanceNotFoundException: tutorial:service=ServiceTwo is not registered.
| at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:529)
| at org.jboss.mx.server.MBeanServerImpl.getMBeanInfo(MBeanServerImpl.java:675)
| at org.jboss.mx.util.MBeanProxyExt.init(MBeanProxyExt.java:407)
| ... 61 more
| ....
| 14:31:39,797 INFO [EJBContainer] STARTED EJB: org.jboss.tutorial.service.bean.ServiceTwo ejbName: ServiceTwo
| 14:31:39,800 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
|
|
| 14:31:39,835 INFO [JBossASKernel] installing bean: tutorial:service=ServiceTwo
| 14:31:39,835 INFO [JBossASKernel] with dependencies:
| 14:31:39,835 INFO [JBossASKernel] and demands:
| 14:31:39,835 INFO [JBossASKernel] tutorial:service=ServiceOne
| 14:31:39,835 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
| 14:31:39,835 INFO [JBossASKernel] and supplies:
| 14:31:39,835 INFO [JBossASKernel] Class:org.jboss.tutorial.service.bean.ServiceTwoManagement
| 14:31:39,835 INFO [JBossASKernel] jndi:ServiceTwo/remote
| 14:31:39,840 INFO [JBossASKernel] Installing bean(tutorial:service=ServiceTwo) into kernel
| 14:31:39,847 INFO [STDOUT] ServiceTwo - Starting
| 14:31:39,875 WARN [HDScanner] Failed to process changes
| org.jboss.deployers.client.spi.IncompleteDeploymentException: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):
|
| *** CONTEXTS IN ERROR: Name -> Error
|
|
It's the DependsMethodInjector (and also the DependsFieldInjector) which has this code:
public void inject(Object instance)
| {
| Class clazz = method.getParameterTypes()[0];
| Object value = null;
|
| if (clazz == ObjectName.class)
| {
| value = on;
| }
| else
| {
| // Fails here since the service with the specified ObjectName has not yet started
| MBeanServer server = MBeanServerLocator.locateJBoss();
| value = MBeanProxyExt.create(clazz, on, server);
| }
|
| try
| {
| method.invoke(instance, value);
| }
|
|
|
As can be seen in the code, the inject method isn't aware that the service isn't yet registered.
Questions:
1) What does @Depends signify at a field/method level? I thought @Depends was more for specifying a dependency. But going by the code in the DependsMethodInjector/DependsFieldInjector, it seems to be doing injection.
2) Is this a valid use of @Depends? If yes, is there a way to make the injector(s) aware of the current state of the MBean, its trying to inject?
P.S: This tutorial is in a compiling state and i can commit it to our trunk (leaving it out from the parent pom to avoid my Hudson runs breaking), if you want to have a look at the complete example.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4200758#4200758
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4200758
More information about the jboss-dev-forums
mailing list