跳到主要内容

获取连接工厂

可以通过以下方式之一获取连接工厂或 XA 连接工厂:

  • 通过编程方式创建连接工厂。
  • 从 Solace JNDI 存储库中查找连接工厂。
  • 从外部 JNDI 存储库中查找连接工厂。

通过编程方式创建连接工厂

下图展示了通过编程方式创建连接工厂对象新实例的基本过程(创建 XA 连接工厂的过程相同,但方法调用不同)。客户端在编译的应用程序中提供建立与事件代理的数据通道连接所需的连接工厂属性,而不是从 JNDI 存储库中查找现有的连接工厂。

通过编程方式创建连接工厂

img

要通过编程方式创建连接工厂对象的 Solace 专有实现,请调用 SolJmsUtility.createConnectionFactory(...)

可以通过 Host 连接工厂属性设置要建立 JMS 连接的事件代理的 IP 地址和可选端口。此 Host 值将覆盖通过用于 JNDI 连接的 URL 属性隐式设置的值。

以下代码片段展示了如何通过编程方式创建连接工厂。

try {
// 创建连接工厂
SolConnectionFactory cf = SolJmsUtility.createConnectionFactory();
cf.setHost("192.168.1.1");
cf.setUsername("user1");
cf.setPassword("mypassword");
cf.setDirectTransport(false);
if (vpn != null) {
cf.setVPN("myvpn");
}

相关示例

有关如何通过编程方式创建连接工厂对象的完整示例,请参阅 SolJMSProgConsumer.java 示例。

从JNDI存储库中查找连接工厂

下图展示了当用于创建 JMS 连接的连接工厂是从事件代理上的 JNDI 存储库中查找时,JMS 客户端的连接过程。基本步骤如下:

  1. 建立 JNDI 连接(参阅使用 JNDI)。
  2. 通过在事件代理上的 JNDI 存储库中查找,获取 Solace 连接工厂。(要查找 Solace XA 连接工厂,过程基本相同,但方法调用不同。)
  3. 使用获取的 Solace 连接工厂,创建 JMS 连接。

JNDI 连接设置的属性将被随后所需的 JMS 连接继承。客户端可以使用这些相同的 JMS 属性进行 JMS 连接,也可以在建立 JMS 连接时选择用新值覆盖它们。

从 Solace JNDI 存储库中查找连接工厂

img

以下代码片段展示了通过传递属性的哈希表来配置 JNDI 环境;然后创建 InitialContext,并在事件代理上的 JNDI 存储库中查找 SolConnectionFactory

Hashtable<String,Object> environment = new Hashtable<String,Object>();
environment.put(InitialContext.INITIAL_CONTEXT_FACTORY, "com.solacesystems.jndi.SolJNDIInitialContextFactory");
environment.put(InitialContext.PROVIDER_URL, "smf://192.168.1.1:55555");
environment.put(Context.SECURITY_PRINCIPAL, "userName");
environment.put(Context.SECURITY_CREDENTIALS, "userPassword");
environment.put(SupportedProperty.SOLACE_JMS_VPN, "vpnName");
InitialContext initialContext = new InitialContext(environment);
ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("connectionFactoryName");

从外部JNDI存储库中查找连接工厂

JMS 客户端可以查找已添加到远程主机上的外部 JNDI 存储库中的 Solace 连接工厂对象。

下图展示了当用于创建 JMS 连接的连接工厂是从外部 JNDI 服务器上的 JNDI 存储库中查找时,JMS 客户端的连接过程。

步骤如下:

  1. 建立 JNDI 连接(参阅使用 JNDI)。
  2. 通过在配置的外部 JNDI 服务器上的 JNDI 存储库中查找,获取 Solace 连接工厂。(要查找 Solace XA 连接工厂,过程基本相同,但方法调用不同。)
  3. 使用获取的 Solace 连接工厂,创建 JMS 连接。

可以通过 Host 连接工厂属性设置要建立 JMS 连接的事件代理的 IP 地址和可选端口。此 Host 值将覆盖通过用于 JNDI 连接的 URL 属性隐式设置的值。

从外部 JNDI 存储库中查找连接工厂

img

以下代码片段展示了通过传递属性的哈希表来配置 JNDI 环境;然后创建 InitialContext,并在外部存储库中的 JNDI 存储库中查找 SolConnectionFactory

使用类名 com.solacesystems.jms.SolXAConnectionFactoryImplcom.solacesystems.jms.SolConnectionFactoryImpl 分别进行 XA 和非 XA(本地)查找。

尽管可以通过调用 SolConnectionFactory cf = (SolConnectionFactory)ctx.lookup(CF_OBJECT_NAME); 创建非 XA(本地)查找,即使在 JNDI 中设置了 com.solacesystems.jms.SolXAConnectionFactoryImpl 类,但不推荐这样做。为了清晰起见,您应该使用适当且不同的类名。

对于连接工厂,连接工厂类型仅由配置的 javaClassName 决定,可以是 com.solacesystems.jms.SolConnectionFactoryImplcom.solacesystems.jms.SolXAConnectionFactoryImpl,XA 属性值无效。

// 创建初始上下文
// JNDI_PROVIDER_INITIAL_CONTEXT_FACTORY 是提供者的
// 特定 InitialContextFactory 实现的类名
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_PROVIDER_INITIAL_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, providerURL);
env.put(Context.REFERRAL, "throw");
env.put(Context.SECURITY_PRINCIPAL, providerUsername);
env.put(Context.SECURITY_CREDENTIALS, providerPassword);
ctx = new InitialContext(env);// 按名称查找连接工厂
// 假设 CF_OBJECT_NAME 已在提供者 JNDI 中配置
// 非 XA 连接工厂的示例
SolConnectionFactory cf = (SolConnectionFactory)ctx.lookup(CF_OBJECT_NAME);
cf.setHost(routerIP);
cf.setUsername(username);
cf.setPassword(password);
cf.setVPN(vpn);// XA 连接工厂的示例
SolXAConnectionFactory cf = (SolXAConnectionFactory)ctx.lookup(CF_OBJECT_NAME);
cf.setHost(routerIP);
cf.setUsername(username);
cf.setPassword(password);
cf.setVPN(vpn);// 创建到 Solace 路由器的 JMS 连接
Connection connection = cf.createConnection();

相关示例

  • 有关如何将 Solace 实现的 JMS 连接工厂、队列和主题对象绑定到基于 LDAP 的 JNDI 存储库的示例,请参阅 SolJMSLDAPBind.java 示例。
  • 有关如何从基于 LDAP 的 JNDI 存储库中查找 JMS 管理对象的示例,请参阅 SolJMSLDAPLookup.java 示例。