【问题标题】:Weblogic12c setup + Spring JMSTemplate +Tibco EMSWeblogic12c 设置 + Spring JMSTemplate +Tibco EMS
【发布时间】:2016-02-22 08:36:20
【问题描述】:

我是 JMS/TIBCO EMS 和 weblogic 设置的新手。

我可以使用旧方式和新方式将消息发布到 TIBCO EMS。我想在 Weblogic 12c 中设置配置并删除用户名、密码、服务器 URL 和队列名称(硬编码值)。

以下是旧方式的代码;我能够向队列发送消息。

private void tibcoEMSQueueSender() throws NamingException{
        try {
            ConnectionFactory myConnFactory;
            Queue queue;
            @SuppressWarnings("rawtypes")
            Hashtable env = getEnvProps();
            Context ctx = new InitialContext(env);

            myConnFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
            queue = (javax.jms.Queue) ctx.lookup(Constants.TIBCO_QUEUE_NAME);

            Connection connection = myConnFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(queue);
            TextMessage textMessage = session.createTextMessage();
            textMessage.setText("Hello EMS");
            messageProducer.send(textMessage);
            connection.start();
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
            System.exit(0);
        }
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private Hashtable getEnvProps(){
        Hashtable env = new Hashtable();
        env.put("java.naming.security.credentials", Constants.PASSWORD);
        env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
        env.put("java.naming.security.principal", Constants.USER_NAME);
        env.put("java.naming.provider.url", Constants.SERVER_URL);
        return env;
    } 

使用 Spring JMS 模板的新方法。 春季版:4.1.6 我用最新的 Spring 和 Hibernate 创建了一个免费的 XML 项目。 所以,我使用@EnableJms 进行配置。

在 JMSConfiguration.java 中

@Configuration
@EnableJms
@ComponentScan({ "com.xxx.xxx" })
@PropertySource("classpath:local_application.properties")
public class JMSConfiguration {

    @Bean
    public JndiTemplate jndiTemplate() {
        JndiTemplate jndiTemplate = new JndiTemplate();
        Properties jndiProps = new Properties();

        jndiProps.setProperty("java.naming.factory.initial", "com.tibco.tibjms.naming.TibjmsInitialContextFactory");
        jndiProps.setProperty("java.naming.provider.url",Constants.SERVER_URL); 
        jndiProps.setProperty("java.naming.security.principal",Constants.USER_NAME); 
        jndiProps.setProperty("java.naming.security.credentials",Constants.PASSWORD); 
        jndiTemplate.setEnvironment(jndiProps);
        return jndiTemplate;
    }

    @Bean
    public UserCredentialsConnectionFactoryAdapter authenticate() throws JMSException, NamingException {
        UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter(); 

        userCredentialsConnectionFactoryAdapter.setUsername(Constants.USER_NAME);
        userCredentialsConnectionFactoryAdapter.setPassword(Constants.PASSWORD);
        userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(jmsConnectionFactory());
        return userCredentialsConnectionFactoryAdapter;
    }

    public ConnectionFactory jmsConnectionFactory() throws NamingException, JMSException{
        ConnectionFactory connectionFactory;
         Context ctx = null;
         Hashtable env = new Hashtable();
         env.put("java.naming.security.credentials", Constants.PASSWORD);
         env.put("java.naming.factory.initial","com.tibco.tibjms.naming.TibjmsInitialContextFactory");
         env.put("java.naming.security.principal", Constants.USER_NAME);
         env.put("java.naming.provider.url", Constants.SERVER_URL);
         ctx = new InitialContext(env);

         connectionFactory = (javax.jms.ConnectionFactory) ctx.lookup(Constants.JNDI_CONNECTION_FACTORY);
         connectionFactory.createConnection(Constants.USER_NAME, Constants.PASSWORD);
        return connectionFactory;

    }

    @Bean
    public JndiObjectFactoryBean jmsQueueName() {
        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();

        jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
        jndiObjectFactoryBean.setJndiName(Constants.TIBCO_QUEUE_NAME); 
        return jndiObjectFactoryBean;
    }

    @Bean(name="jmsTemplate")
    public JmsTemplate jmsTemplate() throws JMSException, NamingException {
        JmsTemplate jmsTemplate = new JmsTemplate(authenticate());
        jmsTemplate.setSessionTransacted(false);
        jmsTemplate.setReceiveTimeout(5000);
        jmsTemplate.setDefaultDestination((Destination) jmsQueueName().getObject());

        return jmsTemplate;
    }

    @Bean
    public MessageSender queueMessageSender() {     
        return  new MessageSender();
    }

}

我在控制器中自动装配 MessageSender 类,并能够将消息发送到 Tibco 队列。在上面的 java 代码中,我想消除所有硬编码的值并将它们写入 weblogic12c 服务器配置(例如使用 tibco url 创建一个外部服务器,创建一个 JNDI 和一个队列。

关于上述代码的问题:

  1. 我必须在 jmsConnectionFactory() 中创建一个连接。这是必要的吗?我还应该打开和关闭连接/会话吗?通常,当这个(设置 JNDI、队列和连接工厂)部分移动到 weblogic 配置时,我不需要创建连接;正确吗?
  2. 这是一种标准做法吗?

我在想,如果我使用 tibco tcp:://xxxxxxxxxxx:7222、用户名和密码正确设置了外部服务器,我应该能够与 tibco 服务器建立通信通道并将消息发布到队列中。我猜连接工厂名称应该是匹配的。

你能帮我找到一篇关于这方面的文章或一步一步分享你的经验吗?请。

【问题讨论】:

    标签: weblogic12c spring-jms tibco tibco-ems


    【解决方案1】:

    我创建了一个外部服务器以避免代码中的硬编码密码。

    Here 是我在 WLS 中创建外部服务器的指南。

    创建一个模块。

    设置远程连接工厂。 设置远程队列。 设置初始上下文并传递凭证和主体。

    使用 Spring JMS 模板中的本地名称建立连接并发送消息。

    这是用于 TCP 的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 2010-12-11
      • 2011-04-03
      • 2011-04-03
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多