2012-03-20 4 views
2

Я написал код для создания тему соединения от Tibco EMSНастройка JNDI для Tibco EMS в Tomcat

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 (что-то, о чем я очень не осведомлен), что мне нужно делать?

Update

из сборного поиска я думал положить это в 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"); 

возвращает нулевой результат

ответ

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"); 
+3

Я не собираюсь принять для себя это, так как я считаю, что есть лучший ответ –

+0

Согласен. Для этого это должен быть стандартный ответ. У меня похожая проблема. –

Смежные вопросы