【问题标题】:Configure JNDI for Tibco EMS in Tomcat在 Tomcat 中为 Tibco EMS 配置 JNDI
【发布时间】:2012-03-20 10:33:10
【问题描述】:

我已经编写了一些用于从 Tibco EMS 创建主题连接的代码

TopicConnectionFactory factory = new TibjmsTopicConnectionFactory(serverUrl);
TopicConnection connection = factory.createTopicConnection(username, password);
/* if clientID is specified we must set it right here */
if (clientID != null) {
  connection.setClientID(clientID);
}

其中 serverUrl、用户名、密码和 clientId 是从配置文件中读取的。有人告诉我应该使用 JNDI 来执行此操作(我可悲的是不知道),我需要做什么?

更新

从各种搜索中我认为将其放在 context.xml 中可能是合适的

<Resource auth="Container" brokerName="not-tibco-952v" brokerURL="tcp://not-tibco-952v:10905"
          description="JMS Connection Factory" factory="com.tibco.tibjms.naming.TibjmsObjectFactory"
          name="jms/ProvisioningMessageConnectionFactory" type="com.tibco.tibjms.naming.TibjmsConnectionFactoryAttributes"
          factoryClass="com.tibco.tibjms.TibjmsConnectionFactory" jndiName="TopicConnectionFactory" serverUrl="not-tibco-952v:10905"
          username="tibco" password="tibco"/>

但是

final Object obj = initialContext.lookup("java:comp/env/jms/ProvisioningMessageConnectionFactory");

返回一个空结果

【问题讨论】:

    标签: tomcat jndi tibco-ems


    【解决方案1】:

    在没有任何更好的知识的情况下,我创建了自己的 ObjectFactory

    public class ProvisioningConnectionsFactory implements ObjectFactory {
      public Object getObjectInstance(Object obj,
                                      Name namex, Context nameCtx, Hashtable environment)
              throws NamingException {
    
        // Acquire an instance of our specified bean class
        ProvisioningConnection conns = new ProvisioningConnection();
    
        // Customize the bean properties from our attributes
        Reference ref = (Reference) obj;
        Enumeration addrs = ref.getAll();
        while (addrs.hasMoreElements()) {
          RefAddr addr = (RefAddr) addrs.nextElement();
          String name = addr.getType();
          String value = (String) addr.getContent();
          if (name.equals("serverUrl")) {
            conns.setServerUrl(value);
          } else if (name.equals("username")) {
            conns.setUsername(value);
          } else if (name.equals("password")) {
            conns.setPassword(value);
          } else if (name.equals("durableTopicSubscriberName")) {
            conns.setDurableTopicSubscriberName(value);
          } else if (name.equals("topicName")) {
            conns.setTopicName(value);
          }
        }
    
        // Return the customized instance
        return conns;
    
      }
    }
    

    这意味着我可以将以下内容添加到我的 context.xml:

    <Resource name="jms/ProvisioningMessageConnection" auth="Container"
              type="com.foo.mytrialsprovisioning.ProvisioningConnection"
              factory="com.foo.mytrialsprovisioning.ProvisioningConnectionsFactory"
              serverUrl = "tcp://not-tibco-952v:10905"
              username = "tibco"
              password = "tibco"
              durableTopicSubscriberName = "PROVISIONING_SUBSCRIBER"
              topicName = "FOOBAR"
            />
    

    以及 ProvisioningConnection 的一个实例:

    public class ProvisioningConnection {
      private static final Log LOG = LogFactory.getLog(new CurrentClassGetter().getClassName());
      private static final String MESSAGE_SELECTOR = "client_ID='%s'";
      private String serverUrl;
      private String username;
      private String password;
      private String durableTopicSubscriberName;
      private String projectIdentifier;
      private String topicName;
    
      public void setServerUrl(String serverUrl) {
        this.serverUrl = serverUrl;
      }
    
      public void setUsername(String username) {
        this.username = username;
      }
    
      public void setPassword(String password) {
        this.password = password;
      }
    
      public void setDurableTopicSubscriberName(String durableTopicSubscriberName) {
        this.durableTopicSubscriberName = durableTopicSubscriberName;
      }
    
      public void setProjectIdentifier(String projectIdentifier) {
        this.projectIdentifier = projectIdentifier;
      }
    
      public void setTopicName(String topicName) {
        this.topicName = topicName;
      }
    
      public TopicConnection getTopicConnection()
              throws JMSException, NamingException {
        LOG.info("Provisioning against server: " + serverUrl);
        TopicConnectionFactory factory = new TibjmsTopicConnectionFactory(serverUrl);
        TopicConnection connection = factory.createTopicConnection(username, password);
        /* if clientID is specified we must set it right here */
        if (projectIdentifier != null) {
          connection.setClientID(projectIdentifier);
        }
        return connection;
      }
    
      public TopicSubscriber getTopicSubscriber(Session session)
              throws JMSException {
        LOG.info("Provisioning subscription on topic: " + topicName);
        // Use createTopic() to enable subscriptions to dynamic topics.
        Topic topic = session.createTopic(topicName);
        return session.createDurableSubscriber(topic, durableTopicSubscriberName, (
                Tools.isNullOrEmptyString(projectIdentifier) ?
                "" :
                String.format(MESSAGE_SELECTOR, projectIdentifier)
        ), true);
      }
    }
    

    可以使用:

    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    return (ProvisioningConnection)envCtx.lookup("jms/ProvisioningMessageConnection");
    

    【讨论】:

    • 我不会为自己接受这个,因为我相信那里有更好的答案
    • 我同意。这应该是一个标准答案。我也有类似的问题。
    【解决方案2】:

    好的,这是一个非常古老的问题,但我已经为此苦苦挣扎了几个星期,并认为发布答案以防万一其他人需要解决方案是明智的。

    简而言之,通过对 EMS JAR 文件的一些内省,我设法偶然发现了一个实际有效的配置,而没有我认为我需要的自定义对象工厂。关键知识是您需要的 Tibco EMS 对象工厂称为 com.tibco.tibjms.naming.TibjmsAdministeredObjectFactory。

    这是我的 Tomcat server.xml 的摘录,我在其中全局定义了一些对象:

      <!-- TIBCO EMS connection factory - using TIBCO object factory class -->
      <Resource name="jms/XXX_ConnectionFactory" auth="Container" 
          type="com.tibco.tibjms.TibjmsConnectionFactory" description="TIBCO EMS Connection Factory"
          factory="com.tibco.tibjms.naming.TibjmsAdministeredObjectFactory" 
          address="tcp://localhost:7222" 
          clientID="TomcatEBX" />
    
      <!-- TIBCO EMS Queue - using TIBCO object factory class -->
      <Resource name="jms/XXX_Queue_In" auth="Container" 
          type="com.tibco.tibjms.TibjmsQueue" description="TIBCO EMS queue"
          factory="com.tibco.tibjms.naming.TibjmsAdministeredObjectFactory" 
          address="api.queue.default" />
    

    所以在这里我绑定了一个名为“jms/XXX_ConnectionFactory”的连接工厂,以及一个名为“jms/XXX_Queue_In”的队列。您还可以绑定主题(使用 type="com.tibco.tibjms.TibjmsTopic")和各种其他 XA 连接工厂。

    遗憾的是,用户指南中没有提到这些 - 好吧,我找不到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2013-06-10
      • 2016-02-22
      • 1970-01-01
      • 2016-10-21
      • 2010-12-11
      相关资源
      最近更新 更多