首页 > 解决方案 > EMS 连接适用于“tcp”,但不适用于“tibjmsnaming”

问题描述

我得到了一个 Tibco EMS 连接 URL“tibjmsnaming://xx.xx.xx.xxx:7551,tibjmsnaming://xx.xx.xx.xxx:7551”(此处屏蔽了 IP 地址)。当我尝试像这样使用 JMS 进行连接时:

ConnectionFactory factory = new TibjmsConnectionFactory("tibjmsnaming://xx.xx.xx.xxx:7551,tibjmsnaming://xx.xx.xx.xxx:7551");
Connection connection = factory.createConnection("test", "abcd");

我得到了例外:

javax.jms.JMSException: Protocol not supported

但是,如果我将“tibjmsnaming”更改为“tcp”,如下所示,连接将成功。

ConnectionFactory factory = new TibjmsConnectionFactory("tcp://xx.xx.xx.xxx:7551,tcp://xx.xx.xx.xxx:7551");
Connection connection = factory.createConnection("test", "abcd");

因为我可以连接“tcp”,所以我可能会这样。但是我想知道从“tibjmsnaming”更改为“tcp”时是否遗漏了一些东西(例如,在牺牲安全性方面)。

标签: jmstibco-ems

解决方案


“tcp://”或“ssl://”前缀是连接到 TIBCO EMS 服务器的 JMS 功能的正确方法。所以如果你使用 TibjmsConnectionFactory,那就对了。

然而,JMS 中的另一种方法是通过 JNDI 实现的名称使用 JMS ConnectionFactory。要访问 TIBCO EMS 的 JNDI 存储库,请使用“tibjmsnaming://”前缀。下面是一个加载名为“ConnectionFactory”的工厂的示例。这段代码的优点是它独立于实现。

        // provider-specific code
        String providerContextFactory = "com.tibco.tibjms.naming.TibjmsInitialContextFactory";
        String providerUrl = "tibjmsnaming://localhost:51515";
        String cfName = "ConnectionFactory";

        // JMS generic code
        Hashtable<String,String> env = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, providerContextFactory);
        env.put(Context.PROVIDER_URL, providerUrl);

        if (userName != null) {
           env.put(Context.SECURITY_PRINCIPAL, userName);
           if (password != null)
              env.put(Context.SECURITY_CREDENTIALS, password);
        }

        InitialContext jndiContext = new InitialContext(env);

        ConnectionFactory factory = (ConnectionFactory)jndiContext.lookup(cfName);

推荐阅读