【问题标题】:Client application not able to connect to the second tibco server when the first tibco server is down当第一个 tibco 服务器关闭时,客户端应用程序无法连接到第二个 tibco 服务器
【发布时间】:2021-01-06 18:06:09
【问题描述】:

我有一个应用程序充当已配置 tibco 服务器的侦听器。 我的要求是我应该在我的应用程序中定义 2 个 tibco 服务器,如果其中一个服务器出现故障,应用程序应该将自己连接到第二个配置的服务器。 同样,我做了如下所述的更改:

<prop key="java.naming.provider.url">tibjmsnaming://${HOST}:${PORT},tibjmsnaming://${FAILOVER_HOST}:${FAILOVER_PORT}</prop>

HOST、PORT、FAILOVER_HOST 和 FAILOVER_PORT 的值来自属性文件。

下面提到的一段代码用于创建连接:

    public void init() throws JMSException { 
ConnectionFactory connectionFactory = (QueueConnectionFactory)initConnectionFactory(connectionParameters);
    
            session = connection.createSession(TRANSACTIONS_ENABLED, Session.AUTO_ACKNOWLEDGE);
            DestinationResolver destinationResolver = new DynamicDestinationResolver();
            Destination destination = destinationResolver.resolveDestinationName(session, connectionParameters.destination, false);
            messageProducer = session.createProducer(destination);
        }
    

我发现我们可以使用 mule 实现相同的目标。但是我的应用程序不应该使用 mule。

【问题讨论】:

    标签: jms tibco


    【解决方案1】:

    我不确定问题出在哪里,因为您的问题并没有具体说明,但为了连接到 TIBCO EMS,您通常可以采取两个步骤

    1) 执行 JNDI 查找以获取您要连接的服务器地址(如果您已经知道确切的地址,这是可选的) 2) 连接服务器并开始发送消息

    对于第 1 步,TIBCO EMS documentation(第 401 到 403 页)很好地概述了如何在 Java 中执行此操作:

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
    env.put(Context.PROVIDER_URL, "tibjmsnaming://jmshost:7222,
    tibjmsnaming://backuphost:7222");
    env.put(Context.URL_PKG_PREFIXES, "com.tibco.tibjms.naming")
    env.put(TibjmsContext.SECURITY_PROTOCOL, "ssl");
    env.put(TibjmsContext.SSL_ENABLE_VERIFY_HOST,
    new Boolean("false"));
    Context context = new InitialContext(env);
    

    您可以从该上下文对象开始发送消息,这就是您在问题中的 URL 需要的地方(以 tibjmsnaming 开头)。

    对于第 2 步,或者如果您已经拥有解析到要向其发送消息的 JMS 服务器的 URL,您将需要类似以下内容:

        String serverURL = "tcp://server1,tcp://server2"
        ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(serverUrl);
        connection = factory.createConnection(userName, password);
        session = connection.createSession(javax.jms.Session.AUTO_ACKNOWLEDGE);
        destination = session.createTopic(topicName);
        msgProducer = session.createProducer(null);
        msg = session.createTextMessage();
        msg.setText(messageStr);
        msgProducer.send(destination, msg);
    

    如果我没记错的话,TIBCO EMS 安装附带了一堆非常好的 Java 示例,涵盖了容错对和单实例服务器的发送和接收消息。

    【讨论】:

    • 要求是有两台tibco服务器没有配置容错(它们不共享状态,也不知道彼此的存在)。我的应用程序在属性“java.naming.provider.url”下列出了这两个服务器,如上所示。当其中一台服务器出现故障时,应用程序应尝试连接到第二台服务器。
    • 在这种情况下,您可能需要查看“为非共享状态故障转移连接配置客户端”,它似乎涵盖了您的要求(第 532 页和 EMS 文档中的内容)。
    猜你喜欢
    • 2019-09-11
    • 2020-12-23
    • 2010-12-21
    • 2020-07-21
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多