Passing data between ClientInterceptor and Interceptor
svoenix Sep 11, 2012 10:04 AMHi. I must pass some data between two ears.
I have two Interceptors. ClientSideInterceptor class:
public class ProxyInterceptor implements EJBClientInterceptor{ private static Object testCtx; @Override public void handleInvocation(EJBClientInvocationContext ctx) throws Exception { System.out.println("ProxyInterceptor"); ctx.getContextData().put("one", getSessionContext()); ctx.sendRequest(); } @Override public Object handleInvocationResult(EJBClientInvocationContext ctx) throws Exception { return ctx.getResult(); } private Object getSessionContext() { if (testCtx != null) return testCtx; return "no working"; } public static void setTestSessionContext(Object ctx){ testCtx = ctx; } }
and ContainerInterceptor, which is getting data from ContextData.
public class ContainerInterceptor{ @AroundInvoke public Object invoke(InvocationContext inv) throws Exception { Object ctx = inv.getContextData().get("one"); System.out.println("ContainerInterceptor" + " " + ctx); // put current context return inv.proceed(); } }
I must pass ContextData between two ears. In first ear I have HelloWorldBean in which i lookup ClientBean from another ear. And my problem is that i must pass SessionContext(for simplicity String in this example) between this two ears.
HelloWorldBean:
public class HelloWorldBean implements HelloWorld { public String sayHello() throws NamingException{ System.out.println("[HelloWorldBean hello]"); Properties props = new Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); props.put(Context.PROVIDER_URL, "remote://localhost:11101"); Context context = new InitialContext(props); EJBClientContext.requireCurrent().registerInterceptor(0x99999, new ProxyInterceptor()); ProxyInterceptor.setTestSessionContext("it's working"); Client client = (Client) context.lookup("Interceptor2/Client//ClientBean!client.Client"); System.out.println(client.saySomething()); EJBClientContext.requireCurrent().registerEJBReceiver(receiver) return "HelloWorld"; } }
In ejb-jar i have:
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar 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/ejb-jar_3_0.xsd" version="3.0"> <interceptors> <interceptor> <interceptor-class>interceptor.ContainerInterceptor</interceptor-class> </interceptor> </interceptors> <assembly-descriptor> <interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>interceptor.ContainerInterceptor</interceptor-class> </interceptor-binding> </assembly-descriptor> </ejb-jar>
So, I'm registering ClientSideInterceptor and pass to him my String, then i lookup for ClientBean. The problem is when i run client.saySomething() and ContainerInterceptor is start, there is no String in Object ctx = inv.getContextData().get("one"); Where is the problem?