java - 使用 Spring 与 Java DSL 配置集成连接到 Weblogic JMS 队列

标签 java spring spring-boot

如何使用 Spring 与 Java Integration DSL 集成创建 JMS 消息驱动适配器以连接到 Oracle weblogic JMS 队列。

最佳答案

您可以使用以下代码通过 Spring 集成与 Java dsl 配置连接到 Weblogic JMS 队列。

  1. 首先,我们需要创建一个连接工厂和 Destination Resolver 对象,该对象必须传递给 Jms messageDrivenChannelAdapter

    下面的代码用于创建一个connectionFactory:

           import 
           org.springframework.jms.listener.AbstractMessageListenerContainer;
          import 
           org.springframework.jms.support.destination.DestinationResolver;
          import 
          org.springframework.jms.support.destination.JndiDestinationResolver;
         import java.util.Properties;
         import javax.jms.ConnectionFactory;
         import javax.jms.Destination;
         import javax.jms.QueueConnectionFactory;
         import javax.naming.Context;
         import javax.naming.InitialContext;
         import javax.naming.NameNotFoundException;
         import javax.naming.NamingException;
         import weblogic.jndi.WLInitialContextFactory;
         @Configuration
        @EnableJms
        public class JMSConfigurer  { 
    
    
        @Value("${spring.jms.url}")
        private String url;
    
        @Value("${spring.jms.username}")
        private String username;
    
        @Value("${spring.jms.password}")
        private String password;
    
        @Value("${spring.jms.connectionFactoryName}")
        private String connectionFactoryName;
    
        @Value("${spring.jms.queue}")
        private String mpiResponseQueue;
    
    
        private Properties getJNDiProperties() {
    
            final Properties jndiProps = new Properties();
            jndiProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
            jndiProps.setProperty(Context.PROVIDER_URL, url);
            if (username != null && !username.isEmpty()) {
                jndiProps.setProperty(Context.SECURITY_PRINCIPAL, username);
            }
            if (password != null && !password.isEmpty()) {
                jndiProps.setProperty(Context.SECURITY_CREDENTIALS, password);
            }
            return jndiProps;
    
        }
    
        /**
         * Create connection factory.
         * 
         * @return
         */
        @Bean
        public ConnectionFactory queueConnectionFactory() {
            // JNDI connection factory name stored in weblogic.
            return lookupByJndiTemplate(connectionFactoryName, QueueConnectionFactory.class);
        }
    
        /**
         * Create InitialContext.
         * 
         * @return
         */
        @Bean
        public JndiTemplate jndiTemplate() {
            JndiTemplate jndiTemplate = new JndiTemplate();
            jndiTemplate.setEnvironment(getJNDiProperties());
            return jndiTemplate;
        }
    
         @Bean
        public Destination mpiResponseQueue() {
              return lookupByJndiTemplate(mpiResponseQueue, Destination.class);
        }
        /**
         * 
         * @param jndiName
         * @param requiredType
         * @return
         */
        @SuppressWarnings("unchecked")
        protected <T> T lookupByJndiTemplate(String jndiName, Class<T> requiredType) {
    
            try {
                Object located = jndiTemplate().lookup(jndiName);
                if (located == null) {
                    throw new NameNotFoundException("JNDI object with [" + jndiName + "] not found");
                }
                return (T) located;
            } catch (NamingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 
         * @param jndiName
         * @param requiredType
         * @return
         */
        @SuppressWarnings("unchecked")
        protected final <T> T lookup(String jndiName, Class<T> requiredType) {
    
            try {
                InitialContext initialContext = new InitialContext(getJNDiProperties());
                Object located = initialContext.lookup(jndiName);
                if (located == null) {
                    throw new NameNotFoundException("JNDI object with [" + jndiName + "] not found");
                }
                return (T) located;
            } catch (NamingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
    <小时/>
  2. 在 Spring Boot 的主类中添加以下代码:

`

@SpringBootApplication
   @IntegrationComponentScan

public class JmsReaderApplication {
@Autowired
private javax.jms.ConnectionFactory queueConnectionFactory; @Autowired
private Destination mpiResponseQueue;

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(JmsReaderApplication.class);
    }
@Bean
public IntegrationFlow jmsReader() {
    return IntegrationFlows
    .from(Jms.messageDrivenChannelAdapter(this.queueConnectionFactory)
        .destination(this.mpiResponseQueue))
    .channel("queureader")
    .get();
}

@ServiceActivator(inputChannel = "queureader")
public void Print(Message<?> msg)  {

    System.out.println(msg.getPayload().toString());
}
}
<小时/>

3.将此属性添加到您的 application.properties

spring.jms.username=用户名 spring.jms.password=密码 spring.jms.queue=队列名称 spring.jms.url=Weblogic服务器url spring.jms.connectionFactoryName= 连接工厂名称 ex jms/TestConnectionFactory

<小时/>
  • 确保在 pom.xml 中添加 wlthint3client.jar oracle jar。
  • 希望这对大家有帮助!!!

    关于java - 使用 Spring 与 Java DSL 配置集成连接到 Weblogic JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51167260/

    相关文章:

    java - 使用 log4j 在一行中获取多个日志

    java - JVM内存使用失控

    java - 如何使用默认模型表更新和检测选中的复选框

    java - Spring Boot bean 以 @ConfigurationProperties 值为条件

    java - Spring:无法加载ApplicationContext

    java - 父类(super class)和传递值

    java - 使用 AmqpAppender for log4j 需要什么依赖项?

    java - 如何在没有任何 .xml 配置的情况下使用 spring 3.X 注释

    spring - Firebase 信任库并设置 Spring 以接受来自 Firebase 的证书

    java - 在 ec2 中部署类似服务的 springboot 问题