将默认应用程序上下文匿名传递给远程EJB

我有一个复杂的场景,我不知道如何去做:

我让我的ejbs在远程服务器上运行。

我的Web应用程序在不同的服务器上运行。

我有一个ApplicationContext,它将根据域,语言,国家等而有所不同。

我希望将此应用程序上下文匿名传递给远程EJB,这样开发人员就不必使用ApplicationContext作为参数调用所有后端请求。

这是scenarion,让我说我有一个远程无状态EJB:

@Stateless public class MyStateless implements MyStatelessRemote{ //The application context that needs to be supplied form the front-end @Inject //probably define a producer method to always supply a new one. private ApplicationContext applicationContext; public void doCheckSomething(final MySomethingData data){} } 

在前端:

 @SessionScoped @Named public class MyController implements Serializable{ @EJB private MyStatelessRemote statelessRemote //The current application/session context to be passed to the Stateless ejb on every invocation. @Inject private ApplicationContext executionContext; public void doSomeOrderOrSomethingSimilar(){ //At this point, the current application context needs to be supplied to the remote EJB //Which it may use to check on order validity based on configurations such as country //language etc. statelessRemote.doCheckSomething(mySomething); } } 

有超过20个EJBS,每个有平均8到10个方法,并考虑到几乎每个ejb可能需要知道调用者的执行上下文的可能性,是否有可能通过配置或其他方式解析当前执行上下文ejb在调用任何方法时?

  1. 我使用Wildfly8与远程ejb3.1,CDI1.1,JSF2.2
  2. 例如,当用户改变他/她的语言时,应用程序上下文可能会改变

编辑:

我正在寻找类似于Web Service入站和出站拦截器的东西。

在没有将参数传递给远程EJB的情况下,使用CDI / EJB无法实现所描述的内容。

在jboss / wildfly服务器上工作几个月之后,我终于找到了一个实现这个function:

客户端代码:(基于jboss ejbclient)

 package com.mycompany.view.service.wildfly.invocationcontext; import com.mycompany.ejb.internal.MyCompanyAccount; import com.mycompany.view.service.account.LoggedInAccount; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.enterprise.inject.Instance; import javax.inject.Inject; import org.jboss.ejb.client.AttachmentKey; import org.jboss.ejb.client.EJBClientContext; import org.jboss.ejb.client.EJBClientInterceptor; import org.jboss.ejb.client.EJBClientInvocationContext; import static com.mycompany.management.wildfly.invocationcontext.MyCompanyInvocationContextKey.MYCOMPANY_ACCOUNT_NUMBER; /** * Registers itself as a jboss client interceptor. * @author marembo */ @Singleton @Startup public class MyCompanyInvocationContextInterceptor implements EJBClientInterceptor { private static final Logger LOG = Logger.getLogger(MyCompanyInvocationContextInterceptor.class.getName()); private static final AttachmentKey MYCOMPANY_ACCOUNT_NUMBER_KEY = new AttachmentKey<>(); @Inject @LoggedInAccount private Instance loggedInAccount; @PostConstruct void registerSelf() { EJBClientContext.requireCurrent().registerInterceptor(0, this); } @Override public void handleInvocation(final EJBClientInvocationContext ejbcic) throws Exception { LOG.log(Level.INFO, "Intercepting invocation on: {0}", ejbcic.getInvokedMethod()); final EJBClientContext clientContext = ejbcic.getClientContext(); if (!loggedInAccount.isUnsatisfied()) { final MyCompanyAccount mycompanyAccount = loggedInAccount.get(); if (mycompanyAccount != null) { final Long accountNumber = mycompanyAccount.getAccountNumber(); clientContext.putAttachment(MYCOMPANY_ACCOUNT_NUMBER_KEY, accountNumber); } } ejbcic.getContextData().put(MYCOMPANY_ACCOUNT_NUMBER, "348347878483"); ejbcic.sendRequest(); } @Override public Object handleInvocationResult(final EJBClientInvocationContext ejbcic) throws Exception { return ejbcic.getResult(); } } 

在服务器端,我注册了一个全局拦截器:

 package com.mycompany.management.wildfly.extension; import com.mycompany.management.facade.account.MyCompanyAccountFacade; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.EJBContext; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; /** * Default interceptor does not require @Interceptor * @author marembo */ public class MyCompanyInvocationContextReceiver { private static final Logger LOG = Logger.getLogger(MyCompanyInvocationContextReceiver.class.getName()); @Resource private EJBContext ejbContext; @EJB private MyCompanyInvocationContext mycompanyInvocationContext; @EJB private MyCompanyAccountFacade mycompanyAccountFacade; @AroundInvoke public Object setMyCompanyAccount(final InvocationContext invocationContext) throws Exception { final Map contextData = ejbContext.getContextData(); LOG.log(Level.INFO, "EJBContext data: {0}", contextData); LOG.log(Level.INFO, "InvocationContext data: {0}", invocationContext.getContextData()); return invocationContext.proceed(); } } 

和ejb-jar.xml:

     com.mycompany.management.wildfly.extension.MyCompanyInvocationContextReceiver     * com.mycompany.management.wildfly.extension.MyCompanyInvocationContextReceiver    

如服务器端拦截器所示,您可以从InvocationContext或EJBContext获取客户端发送的数据。