/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.multinode.remotecall.scoped.context; import org.jboss.ejb3.annotation.Cache; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.ejb.CreateException; import javax.ejb.LocalBean; import javax.ejb.PostActivate; import javax.ejb.PrePassivate; import javax.ejb.Remote; import javax.ejb.Stateful; import javax.naming.Context; import javax.naming.InitialContext; import java.util.Properties; import java.util.concurrent.CountDownLatch; /** * @author Jaikiran Pai */ @Stateful @Remote(LocalServerStatefulRemote.class) @LocalBean @Cache("passivating") // reference to the passivating cache configuration which comes shipped in EJB3 subsystem public class StatefulBeanA implements LocalServerStatefulRemote { @Resource(name = "other-server-remoting-port") private String otherServerRemotingPort; @Resource(name = "other-server-host-address") private String otherServerHostAddress; @Resource(name = "other-server-auth-user-name") private String otherServerAuthUserName; @Resource(name = "other-server-auth-password") private String otherServerAuthPassword; private StatefulRemoteOnOtherServer statefulBeanOnOtherServer; private StatelessRemoteOnOtherServer statelessRemoteOnOtherServer; private StatefulRemoteHomeForBeanOnOtherServer statefulRemoteHomeForBeanOnOtherServer; private transient CountDownLatch passivationNotificationLatch; private boolean postActivateInvoked; @PostConstruct void onConstruct() throws Exception { final Properties jndiProps = this.getInitialContextProperties(); final Context context = new InitialContext(jndiProps); // lookup and set the SFSB from remote server this.statefulBeanOnOtherServer = (StatefulRemoteOnOtherServer) context.lookup("ejb:/deployment-on-other-server//StatefulBeanOnOtherServer!" + StatefulRemoteOnOtherServer.class.getName() + "?stateful"); // lookup and set the SLSB from remote server this.statelessRemoteOnOtherServer = (StatelessRemoteOnOtherServer) context.lookup("ejb:/deployment-on-other-server//StatelessBeanOnOtherServer!" + StatelessRemoteOnOtherServer.class.getName()); // EJB 2.x remote home view of bean on other server this.statefulRemoteHomeForBeanOnOtherServer = (StatefulRemoteHomeForBeanOnOtherServer) context.lookup("ejb:/deployment-on-other-server//StatefulBeanOnOtherServer!" + StatefulRemoteHomeForBeanOnOtherServer.class.getName()); } @Override public int getCountByInvokingOnRemoteServerBean() { // invoke the SFSB which resides on a remote server and was looked up via JNDI // using the scoped EJB client context feature return this.statefulBeanOnOtherServer.getCount(); } @Override public int incrementCountByInvokingOnRemoteServerBean() { // invoke the SFSB which resides on a remote server and was looked up via JNDI // using the scoped EJB client context feature return this.statefulBeanOnOtherServer.incrementCount(); } @Override public String getEchoByInvokingOnRemoteServerBean(final String msg) { // invoke the SLSB which resides on a remote server and was looked up via JNDI // using the scoped EJB client context feature return this.statelessRemoteOnOtherServer.echo(msg); } public int getStatefulBeanCountUsingEJB2xHomeView() { final StatefulRemoteOnOtherServer bean; try { bean = this.statefulRemoteHomeForBeanOnOtherServer.create(); } catch (CreateException e) { throw new RuntimeException(e); } return bean.getCount(); } public int getStatefulBeanCountUsingEJB2xHomeViewDifferentWay() { final StatefulRemoteOnOtherServer bean; try { bean = this.statefulRemoteHomeForBeanOnOtherServer.createDifferentWay(); } catch (CreateException e) { throw new RuntimeException(e); } return bean.getCount(); } public int getStatefulBeanCountUsingEJB2xHomeViewYetAnotherWay(int initialCount) { final StatefulRemoteOnOtherServer bean; try { bean = this.statefulRemoteHomeForBeanOnOtherServer.createYetAnotherWay(initialCount); } catch (CreateException e) { throw new RuntimeException(e); } return bean.getCount(); } @Override public void registerPassivationNotificationLatch(final CountDownLatch latch) { this.passivationNotificationLatch = latch; } @Override public boolean wasPostActivateInvoked() { return this.postActivateInvoked; } @Override public StatefulRemoteOnOtherServer getSFSBCreatedWithScopedEJBClientContext() { return this.statefulBeanOnOtherServer; } @Override public StatelessRemoteOnOtherServer getSLSBCreatedWithScopedEJBClientContext() { return this.statelessRemoteOnOtherServer; } @PrePassivate private void prePassivate() { this.postActivateInvoked = false; if (this.passivationNotificationLatch != null) { this.passivationNotificationLatch.countDown(); } } @PostActivate private void postActivate() { this.postActivateInvoked = true; } private Properties getInitialContextProperties() { final Properties jndiProps = new Properties(); // Property to enable scoped EJB client context which will be tied to the JNDI context jndiProps.put("org.jboss.ejb.client.scoped.context", true); // Property which will handle the ejb: namespace during JNDI lookup jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final String connectionName = "foo-bar-connection"; jndiProps.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); // add a property which lists the connections that we are configuring. In // this example, we are just configuring a single connection named "foo-bar-connection" jndiProps.put("remote.connections", connectionName); // add a property which points to the host server of the "foo-bar-connection" jndiProps.put("remote.connection." + connectionName + ".host", this.otherServerHostAddress); // add a property which points to the port on which the server is listening for EJB invocations jndiProps.put("remote.connection." + connectionName + ".port", this.otherServerRemotingPort); // add the username and password properties which will be used to establish this connection jndiProps.put("remote.connection." + connectionName + ".username", this.otherServerAuthUserName); jndiProps.put("remote.connection." + connectionName + ".password", this.otherServerAuthPassword); return jndiProps; } }