当前位置: 首页 > 知识库问答 >
问题:

配置JBoss JNDI以绑定到不同服务器上的JNDI?

步衡
2023-03-14

我有两台JBoss服务器,JbossA和JbossB。每个都有自己的JNDI。现在,我在JbossA上有一个名为JMS/Client的JMS,在JbossB上有个名为JMS/Server的JMS。

现在,我希望JbossA上的应用程序能够使用自己的JNDI访问jms/服务器。此外,我希望JbossB上的应用程序使用jndi名称jms/Client1访问jms/Client,并使用自己的jndi。

简而言之:

JbossA/
       JNDI/
            jms/Client
            jms/Server  -> JbossB/JNDI/jms/Server


JbossB/
       JNDI/
            jms/Server
            jms/Client1  -> JBossA/JNDI/jms/Client
  • JbossA上的AppA使用JbossA/JNDI访问jms/Client和jms/Server
  • JbossB上的AppB使用JbossB/JNDI访问jms/Server和jms/Client1

两个问题:

    < li >可能吗? < li >如果是,我该如何在JBoss EAP 6.0.1 (Jboss 7.1)中进行配置

共有3个答案

万乐逸
2023-03-14

使用EAP 6.x中包含的外部JNDI联合是可行的。您需要定义一个全局绑定属性。剩下的就交给你去探索了:)

施诗尔

杨建章
2023-03-14

这是可能的。不过,如果您可以升级您的EAP版本,那就更容易了。如果您有EAP订阅,我看不出有理由保留旧版本。此后修复了很多错误。

来自EAP 6.2.0发行说明:

外部JNDI联邦

JBoss EAP 6配置中添加了一个命名子系统配置,使管理员能够将外部命名系统连接到JBoss EAP 6 JNDI。该功能取代了JBoss EAP 5中的ExternalContextMBean。

然而,即使使用EAP 6.0.x,您也可以使用

<subsystem xmlns="urn:jboss:domain:naming:1.2">
    <bindings>
        <object-factory name="java:global/myExtContext" module="my.custom.module" class="my.example.class.ExternalContextObjectFactory"/>
    </bindings>
    <remote-naming/>
</subsystem>

并在my.custom中实现ExternalContextObjectFactory。模块类

public class ExternalContextObjectFactory implements ObjectFactory {
    @Override
    public Object getObjectInstance(final Object obj, final Name name, final Context nameCtx, final Hashtable<?, ?> environment) throws Exception {
      Hashtable env = new Hashtable();
      if(environment != null)
        env.putAll(environment);
      env.set( /* all the properties you will need for your target context */ );
      return new InitialContext(environment);
    }
} 

因此,您的目标上下文将被绑定到< code > Java:global/myext context 。

邓正真
2023-03-14

首先,我想不出一个很好的理由来解释你为什么要查找MDB,这些应该只由容器调用(准确地说是由JMS实现调用),但是如果你试图查找JMS发布者或连接,那么你的要求完全有道理。

话虽如此,JBoss 7引入了一个很好的新功能,远程命名项目完全可以满足您的需求,问题是,显然,它只能绑定远程EJB,您可以尝试一下。我个人认为,JBoss团队(我非常感谢他们如此出色的工作)在这方面有点落后(也许他们有一个很好的理由?),其他JEE容器已经能够做到这一点很长一段时间了,在Weblogic中它被称为外国JNDI绑定,但无论如何, 如果上述方法不起作用,并且您绝对需要这样做,恐怕剩下的唯一解决方案就是以编程方式进行,在这种情况下,请继续阅读下面的内容。

< code>javax.naming API提供了一种将引用绑定到本地命名上下文之外的对象的方法,只需使用InitialContext.bind(String name,Object obj ),而不是绑定实际的对象,而是绑定javax.naming.Reference的实例。正如您在javadocs中看到的,要创建引用实例,您需要提供javax.naming.RefAddr实现的实例,其中包含定位远程对象所需的信息,以及javax.naming.spi.ObjectFactory的实现,它是底层的对象它看起来像这样:

InitialContext ctx = new InitialContext();
ForeignJNDIObjectRefAddr refAddr = getRemoteObjectJNDIInfo(...;
ctx.bind("jms/Server", new Reference("java.lang.Object",
                refAddr, ForeignJNDIObjectFactory.class.getName(), null));

在这种情况下,您可能已经实现了ForeignJNDIObjectRefAddrForeignjrdiobjectfactory,在进行查找时,您的foreignJndiobject工厂。getObjectInstance方法将以ForeignJndObjectRefAddress实例作为第一个参数调用,这样您就拥有了执行查找并返回远程对象所需的所有信息。祝你好运

 类似资料:
  • 我们来看看如何配置服务器端的 SSH 访问。 本例中,我们将使用 authorized_keys 方法来对用户进行认证。 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 Ubuntu。 首先,创建一个操作系统用户 git,并为其建立一个 .ssh 目录。 $ sudo adduser git $ su git $ cd $ mkdir .ssh && chmod 700 .ssh

  • 因此,在我的微服务中,我必须以configserver的短主机名为目标。 但是,当我在没有docker的IDE中本地运行它们时,短主机名无法解析。 因此,我正在寻找一个解决方案,目标不同的配置服务器根据我的环境。

  • 我们来看看如何配置服务器端的 SSH 访问。 本例中,我们将使用 authorized_keys 方法来对用户进行认证。 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 Ubuntu。 首先,创建一个操作系统用户 git,并为其建立一个 .ssh 目录。 $ sudo adduser git $ su git $ cd $ mkdir .ssh && chmod 700 .ssh

  • 服务器配置 当你需要一台服务器的时候,首先需要向你的leader 提出申请,你的 leader 会利用公司的阿里云账户购买服务器实例,并且会把服务器的公网IP以及账号密码发送给你。 以下章节就叙述了当拿到一台全新的阿里云服务器实例时,我们需要怎样的工具以及我们需要经历哪些步骤对服务器进行配置。

  • 我试图了解Apache ActiveMQ Artemis服务器上是否在同一源服务器和目标服务器之间配置了核心桥接器。我这样做的原因是因为我的发布者将消息写入队列A和队列B,而我的订阅者只监听队列AB。因此,我的意图是将队列A和B桥接到队列AB中。我从Artemis用户手册中读到: 桥接器的功能是使用来自源队列的消息,并将它们转发到目标地址,通常是在不同的Apache ActiveMQ Artemi

  • 我有一个迷你侦听器/守护程序来捕获SNMP陷阱。这将在 tomcat7 上运行主项目(Spring网站)时执行侦听器。但我总是得到错误 java.net.绑定异常: 权限被拒绝 我尝试使用Authbind(http://java-notes.com/),但我的问题没有解决。我也尝试将端口更改为更大的端口,但我收到错误java.net.BindException:无法分配请求的地址 这是我的应用程序