2

我已经编写了一些用于从 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");

带回一个空结果

4

2 回答 2

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");
于 2012-03-28T08:49:25.113 回答
0

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

简而言之,通过对 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 连接工厂。 

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

于 2020-04-16T13:53:30.770 回答