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