gpt4 book ai didi

spring - 使用 Spring 在 WebSphere 中使用 Grails 跨集群访问 EJB

转载 作者:行者123 更新时间:2023-12-02 14:09:42 24 4
gpt4 key购买 nike

最近几天,我一直在尝试将 Grails(版本 1.3.2)应用程序与部署在 WebSphere 6.1 上的 EJB 2.1 应用程序集成。一旦我们的 Grails 应用程序投入生产,它们也将部署到 WebSphere。 EJB 2.1 应用程序在我们公司广泛使用,并且在本地开发环境之外的任何地方都被部署到自己的集群中。我们在现有的 Java EE 应用程序(所有这些应用程序都是非 Spring、非 Grails)中处理这个问题的方式是在我们的每个其他集群中绑定(bind)一个 CORBA CosNaming 命名上下文,然后可以使用它来获取对我们共享 EJB 的引用2.1 应用。因此,到目前为止,如果我们的某个应用程序需要与该应用程序交互,他们将使用如下方法进行交互:

String cosNameBinding = "ejbApp.HighAvail.cluster";
InitialContext initial = new InitialContext();
Context fedContext = (javax.naming.Context) initialCtx.lookup(cosNameBinding);

然后使用 federated/CosNaming 上下文执行正常的 EJB 样式查找/缩小/调用:
Object ejbHomeAsObject = fedContext.lookup(jndiNameOfService);        
EJBHome home = (EJBHome) PortableRemoteObject.narrow(ejbHomeAsObject, homeClass);
Object service = invokeMethod(homeClass, home, "create");

如您所见,这里发生了一个间接级别,以便从 InitialContext 转到可用于与共享 EJB 应用程序交互的联合命名上下文。

在本地运行时,我将 Grails 应用程序和 EJB 应用程序都部署到了同一台服务器(非网络部署 WAS,相同的配置文件和节点)。我的 Spring 配置如下:
beans = {
ejbJndi(org.springframework.jndi.JndiTemplate) {
environment = ["java.naming.factory.initial" :
"com.ibm.websphere.naming.WsnInitialContextFactory"]
}
crewMemberService(org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean) {
jndiName="hotelService/ejb/HotelService"
businessInterface="com.company.appName.hotel.HotelService"
lookupHomeOnStartup="false"
cacheHome="false"
refreshHomeOnConnectFailure="true"
jndiTemplate = ref("ejbJndi")
}
}

我可以成功地将 ejb 引用注入(inject)我的 Grails Controller 并调用它们。但是,WebSphere 只能解析 JNDI 查找,因为它们都部署在同一台服务器上。当我们将它移动到我们的开发环境之一时,我们需要为这些服务查找 jndi 以对抗联合命名上下文。

所以我的问题是:
  • 有没有办法用 Spring 中提供的类来做到这一点,如果是这样,你能给我一个想法,我需要如何修改我的 Spring 配置来做到这一点?
  • 鉴于我们如何部署其他应用程序或获取对其服务的引用没有灵 active (我们必须使用联合上下文),我是否应该考虑扩展 JndiTemplate 并自己进行必要的接线?

  • 如果有人遇到过这种情况,我将非常感谢您提供的任何见解。

    最佳答案

    万一有人在路上遇到同样的问题,我最终实现了对 Spring 的 JndiTemplate 的扩展并使用它。这是代码:

    public class FederatedJndiTemplate extends org.springframework.jndi.JndiTemplate
    {
    protected static final String JNDI_CONTEXT_BINDING_NAME = "fed.context.jndiName";

    /**
    * Obtain a JNDI naming context for the specified federated naming context.
    *
    * @throws NamingException if no "fed.context.jndiName" has been specified in
    * the environment properties for the jndiTemplate or the container throws a naming
    * exception.
    */
    @Override
    protected Context createInitialContext() throws NamingException {
    Properties props = super.getEnvironment();

    if(!props.containsKey(JNDI_CONTEXT_BINDING_NAME)) {
    throw new NamingException("You must specify the federated naming context JNDI binding name");
    }

    String jndiBinding = props.getProperty(JNDI_CONTEXT_BINDING_NAME);
    InitialContext initCtx = new InitialContext();
    Context fedCtx = (Context) initCtx.lookup(jndiBinding);
    return fedCtx;
    }
    }

    然后在我的 resources.groovy 中,我只使用了这个 JndiTemplate:
                ejbJndi(com.myCompany.spring.jndi.FederatedJndiTemplate) {
    environment = [
    "fed.context.jndiName":"myServices.HighAvail.Cluster"]
    }
    hotelService(org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean) {
    jndiName="hotelService/ejb/HotelService"
    businessInterface="com.mycompany.appName.hotel.HotelService"
    homeInterface="com.mycompany.appName.hotel.HotelServiceHome"
    lookupHomeOnStartup="false"
    jndiTemplate = ref("ejbJndi")
    }

    关于spring - 使用 Spring 在 WebSphere 中使用 Grails 跨集群访问 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3207694/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com