@Override public void run() { final SessionID sessionID; try { try { sessionID = statefulSessionComponent.createSession(); } catch (Throwable t) { SessionOpenRequestHandler.this.writeException( channelAssociation, SessionOpenRequestHandler.this.marshallerFactory, invocationId, t, null); return; } // get the affinity of the component final Affinity hardAffinity = statefulSessionComponent.getCache().getStrictAffinity(); SessionOpenRequestHandler.this.writeSessionId( channelAssociation, invocationId, sessionID, hardAffinity); } catch (IOException ioe) { EjbLogger.ROOT_LOGGER.exceptionGeneratingSessionId( ioe, invocationId, channelAssociation.getChannel()); // close the channel IoUtils.safeClose(this.channelAssociation.getChannel()); return; } }
@Override public Object processInvocation(InterceptorContext context) throws Exception { final Component component = context.getPrivateData(Component.class); // if a session bean is participating in a transaction, it // is an error for a client to invoke the remove method // on the session object's home or component interface. final ComponentView view = context.getPrivateData(ComponentView.class); if (view != null) { Ejb2xViewType viewType = view.getPrivateData(Ejb2xViewType.class); if (viewType != null) { // this means it is an EJB 2.x view // which is not allowed to remove while enrolled in a TX final StatefulTransactionMarker marker = context.getPrivateData(StatefulTransactionMarker.class); if (marker != null && !marker.isFirstInvocation()) { throw EjbLogger.ROOT_LOGGER.cannotRemoveWhileParticipatingInTransaction(); } } } // just log a WARN and throw back the original exception if (component instanceof StatefulSessionComponent == false) { throw EjbLogger.ROOT_LOGGER.unexpectedComponent(component, StatefulSessionComponent.class); } final StatefulSessionComponent statefulComponent = (StatefulSessionComponent) component; Object invocationResult = null; try { // proceed invocationResult = context.proceed(); } catch (Exception e) { // Exception caught during call to @Remove method. Handle it appropriately // If it's an application exception and if the @Remove method has set "retainIfException" to // true // then just throw back the exception and don't remove the session instance. if (this.isApplicationException(statefulComponent, e.getClass(), context.getMethod()) && this.retainIfException) { throw e; } // otherwise, just remove it and throw back the original exception final StatefulSessionComponentInstance statefulComponentInstance = (StatefulSessionComponentInstance) context.getPrivateData(ComponentInstance.class); final SessionID sessionId = statefulComponentInstance.getId(); statefulComponent.removeSession(sessionId); throw e; } final StatefulSessionComponentInstance statefulComponentInstance = (StatefulSessionComponentInstance) context.getPrivateData(ComponentInstance.class); final SessionID sessionId = statefulComponentInstance.getId(); // just remove the session because of a call to @Remove method statefulComponent.removeSession(sessionId); // return the invocation result return invocationResult; }