Weblogic12c 设置 + Spring JMSTemplate +Tibco EMS

Weblogic12c setup + Spring JMSTemplate +Tibco EMS

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

我可以post使用旧方式和新方式将消息发送到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 模板的新方法。 Spring版本: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 class 并能够将消息发送到 Tibco 队列。在上面的 java 代码中,我想消除所有硬编码值并将它们写入 weblogic12c 服务器配置(例如使用 tibco url 创建一个外部服务器,创建一个 JNDI 和一个队列。

上面代码的问题:

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

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

你能帮我找一篇这方面的文章或者分享一下你的经验吗?请。

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

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

创建模块。

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

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

这是针对 TCP 的。