EMS连接适用于“ tcp”,但不适用于“ tibjmsnaming”

时间:2018-07-25 06:11:15

标签: jms tibco-ems

为我提供了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”时是否丢失了某些内容(例如,在牺牲安全性方面)。

1 个答案:

答案 0 :(得分:2)

前缀“ 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);