JBoss AS 7.2.0.Alpha : Spring, Gemini Blueprint and WAB association
matiou May 15, 2013 5:49 AMHello guys,
I'm using gemini blueprint in a WAB to discover services exposed by somes bundles deployed on JBoss OSGi container and all works fine, expect the reference-listener on the service consumed.
Here's my use case :
I have the bundle myServiceImpl which expose one service with gemini blueprint :
(file META-INF/spring/app-context.xml)
... <bean id="myServiceBean" class="xxx.yyy.MyServiceImpl" init-method="startService" destroy-method="stopService"/> <osgi:service id="myServiceOsgi" ref="myServiceBean" interface="xxx.yyy.IMyService" /> ...
I have a WAB myWab which consumes the service exposed as below :
(file src/main/webapp/WEB-INF/spring/app-context.xml)
... <bean class="xxx.yyy.ServiceListener" id="myServiceListener" /> <osgi:list id="myServicesOsgi" interface="xxx.yyy.IMyService"> <osgi:reference-listener bind-method="myBind" unbind-method="myUnbind" > <ref bean="myServicesListener"/> </osgi:reference-listener> </osgi:list> ...
(file src/main/java/xxx/yyy/zzz/ServiceListener.java)
public class ServiceListener {
public void myBind(IMyService myService, Map<String, Object> properties) throws Exception {
System.out.println("A binding is normally done");
}
public void myUnbind(Object myService, Map<String, Object> properties) throws Exception {
System.out.println("An unbinding is normally done");
}
}
(file src/main/java/xxx/yyy/controller/FileUploadController.java)
@Controller
public class FileUploadController {
private List<IMyService> myServices;
@Autowired
protected FileUploadController(@Value("#{myServicesOsgi}") List<IMyService> myServices) {
super();
this.myServices = myServices;
}
@RequestMapping(value="/post", method = RequestMethod.POST)
@ResponseBody
public String upload(MultipartFile file) throws IOException, Exception {
SomeClass someClass = new SomeClass(1L, file.getInputStream());
for (Iterator<IMyService> iterator = myServices.iterator(); iterator.hasNext();) {
IMyService service = (IMyService) iterator.next();
service.doSomeStuff(invoice);
}
return file.getOriginalFilename();
}
}
When I upload a file on my IHM, I can see in the logs that the service defined by myServiceImpl is well called (and when others services are exposed by others bundle, these services are called too)
However, If i stop the bundle myServiceImpl, the sentence "An unbinding is normally done" is not printed and so the listener seems not to be called.
So I tried to do this (listening the services publication) outside of the Wab to be sure it wasn't an implementation problem.
I have done a third bundle, named myServiceConsumer with exactly the same classes than the Wab :
The class ServiceListener in a package src/main/java/xxx/yyy/zzz/
The spring/gemini file in src/main/ressources/META-INF/spring
I deployed this bundle on JBoss and when I start/stop myServiceImpl, I'm able to see the output as expected : "A binding is normally done"/"An unbinding is normally done".
Any ideas ?
Thanks in advance
My conf :
JBoss AS 7.2.0.Alpha
org.eclipse.gemini 2.0.0.M02
org.springframework 3.2.2.RELEASE