Hi All,
I am attempting to provide an invoker service api which will comes with a MethodInterceptor which is responsible for closing a context. The idea behind the MethodInterceptor is, I want to seamlessly perform some context operations for the invokee without them realising its happening.
Here's what I have;
Intended Usage:
Service Wrapper:Code:JbpmContext jBpmCtx = getCurrentContext(); FooService fooSrv = (FooService) ServiceInvokerUtil.getService("FooService", jBpmCtx); fooSrv.addBars("snafu");
The Interceptor:Code:public class ServiceInvokerUtil { public static Object getService(String serviceName, JbpmContext jbpmContext) throws ServiceInvocationException { ApplicationContext ctx = new FileSystemXmlApplicationContext( "config/invoker.xml"); ctx.getBean("contextManager", new Object[] { jbpmContext }); Object service = ctx.getBean(serviceName); return service; } }
The weaving config:Code:public class ServiceInvokerInterceptor implements MethodInterceptor { private boolean isAsync; private ContextManager context; public Object invoke(MethodInvocation m) throws Throwable { // Close the JBPMContext if this is Asynchronous invocation JbpmContext jBpmContext = getContext().getContext(); JbpmConfiguration config = jBpmContext.getJbpmConfiguration(); if (isAsync()) { System.out.println("Executing Async Before Advice" + jBpmContext); getContext().close(); } else { System.out.println("Executing Before Advice"); } // Invoke the 3rd party system Object rspObj = m.proceed(); // Reload the JBPMContext if (isAsync()) { System.out.println("Executing Async After Advice"); config.createJbpmContext(); } else { System.out.println("Executing After Advice"); } return rspObj; } // Async and Context setters/getters ommitted !
Code:<!-- Bean configuration --> <bean id="proxyTemplate" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true"> </bean> <bean id="syncInterceptor" class="com.mdsuk.bpe.extensions.invoker.ServiceInvokerInterceptor"> <property name="async"><value>false</value></property> <property name="context"><ref local="contextManager"/></property> </bean> <bean id="asyncInterceptor" class="com.mdsuk.bpe.extensions.invoker.ServiceInvokerInterceptor"> <property name="async"><value>true</value></property> <property name="context"><ref local="contextManager"/></property> </bean> <bean id="contextManager" scope="prototype" class="com.mdsuk.bpe.extensions.invoker.ContextBeanFactory" factory-method="createContextBean"> <constructor-arg> <null/> </constructor-arg> </bean> <!-- Bean Classes --> <bean id="fooServiceTarget" class="com.mdsuk.bpe.extensions.invoker.test.FooServiceImpl"> </bean> <bean id="FooService" parent="proxyTemplate"> <property name="proxyInterfaces"> <value>com.mdsuk.bpe.extensions.invoker.test.FooService</value> </property> <property name="target"> <ref local="fooServiceTarget"/> </property> <property name="interceptorNames"> <value>asyncInterceptor</value> </property> </bean>
The problem:
I want to be able to set the context into the method interceptor programatically, as each context is a new instance and specific to the invokee.
I have tried to use a factory prototype bean andto pump in the context passed by the invokee, but no joyCode:ctx.getBean("contextManager", new Object[] { jbpmContext });
Can anyone point out what I'm doing wrong or if this is possible, I'm a Spring newbie so I may have made elementary mistakes here somewhere.
Thanks in advance
-- Pat



Reply With Quote