2017-04-17 7 views
7

मैं वसंत बूट और JMS उदाहरण का अध्ययन कर रहा हूँ और हाँ, मैं नहीं बल्कि इसActiveMQ से ओरेकल उन्नत पंक्तिबद्ध करने के लिए स्प्रिंग बूट JMS माइग्रेट कैसे

जब से हम Oracle के साथ काम पर नया हूँ, मैं माइग्रेट करना चाहते हैं स्प्रिंग बूट & सक्रिय एमक्यू से ओरेकल उन्नत क्विकिंग तक जेएमएस उदाहरण। हालांकि मुझे वास्तव में उस पर बहुत कम जानकारी मिलती है।

जहाँ तक मुझे लगता है कि मुझे ओरेकल संस्करण के लिए नीचे दिए गए कोड को प्रतिस्थापित करने की आवश्यकता है, फिर भी मुझे यह पता नहीं चला कि कैसे।

@Bean 
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, 
               DefaultJmsListenerContainerFactoryConfigurer configurer) { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    // This provides all boot's default to this factory, including the message converter 
    configurer.configure(factory, connectionFactory); 
    // You could still override some of Boot's default if necessary. 
    return factory; 

}

मूल कोड Github

सहायता में पाया जा सकता बहुत सराहना की जाएगी!

+0

IMHO यह जानबूझकर है की तरह काम करता है। यदि आपका कोड वेबलॉगिक (जो ओरेकल उत्पाद भी है) पर चलता है तो सेटअप काफी आसान है (देखें http://danielveselka.blogspot.cz/2009/07/mdb-3-0-on-weblogic-103-using-oracle -aq.html)। मुझे डर है कि अन्य एप्लिकेशन सर्वर एक्यू कनेक्टर (संसाधन एडाप्टर) को जेएमएस की पेशकश नहीं करते हैं। – ibre5041

+0

नहीं, मैं वेबलॉगिक से कनेक्ट नहीं करना चाहता, लेकिन सीधे ओरेकल एडवांस्ड क्व्यूइंग (एक्यू) में। स्प्रिंग बूट के बिना मेरे प्रोग्राम में मैं उपयोग करता हूं: '\t \t \t qconFactory = AQjmsFactory.getQueueConnectionFactory (होस्टनाम, सेवा नाम, पोर्ट," पतला "); \t \t \t qcon = qconFactory.createQueueConnection (उपयोगकर्ता नाम, पासवर्ड); \t \t \t qsession = qcon.createQueue सत्र (झूठी, सत्र .AUTO_ACKNOWLEDGE); \t \t \t queueTable = ((AQjmsSession) qsession) .getQueueTable (userName, queueTableName); \t \t \t queue = ((AQjmsSession) qsession) .getQueue (userName, queueName); ' – dhmc

+0

जैसा कि व्याख्या करने की कोशिश कर रहा था। ओरेकल एक्यू मानक जावा ईई जेएमएस प्रदाता के रूप में कार्य कर सकता है। जो ActiveMQ से आपका संक्रमण अधिक आसान बना सकता है। (वास्तव में स्रोत कोड में कोई बदलाव नहीं होगा)। लेकिन यह केवल कुछ परिस्थितियों में काम कर सकता है। – ibre5041

उत्तर

1

नीचे दी गई कॉन्फ़िगरेशन आपके प्रश्नों को हल करेगी।

1 - कॉन्फ़िगरेशन बनाएँ। इस उत्तर के लिए, मैंने एप्लिकेशन फ़ाइल में सभी कॉन्फ़िगरेशन फ़ाइलों को कॉम्पैक्ट रखा है। आप अलग-अलग वर्गों में इस तरह अलग चिंताओं को डाल सकते हैं।

@SpringBootApplication 
@EnableJms 
public class Application { 
    private static Random rand = new Random(); 

    @Bean 
    DataSource dataSource() throws SQLException { 
     OracleDataSource dataSource = new OracleDataSource(); 
     dataSource.setUser("yourusername"); 
     dataSource.setPassword("yourpassword"); 
     dataSource.setURL("jdbc:oracle:thin:@yourserver:1521:xe"); 
     dataSource.setImplicitCachingEnabled(true); 
     dataSource.setFastConnectionFailoverEnabled(true); 
     return dataSource; 
    }  

    @Bean 
    public QueueConnectionFactory connectionFactory() throws Exception { 
     return AQjmsFactory.getQueueConnectionFactory(dataSource()); 
    } 

    @Bean 
    public JmsTemplate jmsTemplate() throws Exception { 
     JmsTemplate jmsTemplate = new JmsTemplate(); 
     jmsTemplate.setConnectionFactory(connectionFactory()); 
     jmsTemplate.setMessageConverter(jacksonJmsMessageConverter()); 
     return jmsTemplate; 
    } 

    @Bean 
    public JmsListenerContainerFactory<?> myJMSListenerFactory(QueueConnectionFactory connectionFactory,              DefaultJmsListenerContainerFactoryConfigurer configurer) { 
     DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
     // factory.setConcurrency("15-20"); 
     factory.setMessageConverter(jacksonJmsMessageConverter()); 
     configurer.configure(factory, connectionFactory); 
     return factory; 
    } 

    @Bean 
    public MessageConverter jacksonJmsMessageConverter() { 
     MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
     converter.setTargetType(MessageType.TEXT); 
     converter.setTypeIdPropertyName("_type"); 
     return converter; 
    } 

    public static void main(String[] args) { 
     ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); 
     JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); 
     for (int i = 0; i < 10; i++) { 
      int waitSecs = rand.nextInt(3); 
      jmsTemplate.convertAndSend("YourQueueName", new Email("[email protected]", "Hello " + i, waitSecs)); 
     } 
    } 
} 

2 - Maven और Oracle

आप oracle6 या Oracle7 जार अलग से अपने lib पथ के लिए, के रूप में में दिखाया गया है जोड़ सकते हैं -

@Component 
public class Receiver { 
    @JmsListener(destination = "YourQueueName", containerFactory = "myJMSListenerFactory") 
    public void receiveEmail(Email email) { 
     System.out.println("Received <" + email + ">"); 
    } 
} 

3 अपने JMS श्रोता बनाओ this post

शेष मावन फ़ाइल बहुत मानक है।

<properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.2.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-activemq</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

4 - व्यवसाय वस्तुओं। ईमेल जैसे ऑब्जेक्ट्स आपके व्यवसाय डोमेन POJO हैं। मैं उन्हें यहाँ नहीं रखूंगा।

@Testing, इस आकर्षण ;-)

1

मुझे नहीं लगता कि आपको अपनी फैक्ट्री विधि को बदलने की जरूरत है, इसके बजाय आपको कनेक्शन बनाने की आवश्यकता है फैक्ट्री, जो ऑरैकल कतार से जुड़ती है। मेरे पास इसी तरह की विन्यास थी, देव में मैंने अपनी जनीट चलाने के लिए आर्टेमिस का इस्तेमाल किया और प्रोड में मैंने ऑरैकल कतार का इस्तेमाल किया। नीचे वह वर्ग है जिसे मैंने कनेक्शन फैक्टरी बनाने के लिए परिभाषित किया है।

import java.util.HashMap; 
import java.util.Map; 
import java.util.Properties; 

import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.naming.Context; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Primary; 
import org.springframework.jms.annotation.EnableJms; 
import org.springframework.jms.connection.CachingConnectionFactory; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.jndi.JndiObjectFactoryBean; 
import org.springframework.jndi.JndiTemplate; 


/** 
* @author Karthik Prasad 
* @since 1.0.0.0 
*  <p> 
*  Configuration file for weblogic JMS connection 
*/ 
@Configuration 
@EnableJms 
@ConfigurationProperties(prefix = "spring.wls.jms") 
@ConditionalOnProperty(prefix = "spring.wls.jms", name = "url") 
public class WLSJmsConfiguration { 

    /** 
    * SJ4J Log instance 
    */ 
    private static final Logger LOG = LoggerFactory.getLogger(WLSJmsConfiguration.class); 

    /** 
    * provider url 
    */ 
    private String url; 
    /** 
    * username of weblogic server using which JNDI connection will be 
    * established 
    */ 
    private String username; 
    /** 
    * password of weblogic server using which JNDI connection will be 
    * established 
    */ 
    private String password; 
    /** 
    * JMS Connection factory name configured in weblogic server 
    */ 
    private String connectionFactoryName; 

    /** 
    * Name of destination queue 
    */ 
    private String targetQueue; 

    /** 
    * The Response Queue 
    */ 
    private String replyQueue; 


    /** 
    * URL to access weblogic Connectionfactory, property is set from properties 
    * file 
    * 
    * @see ConfigurationProperties 
    * @param password 
    *   weblogic url to JNDI 
    */ 
    public void setUrl(final String url) { 
     this.url = url; 
    } 

    /** 
    * username to access weblogic queue, property is set from properties file 
    * 
    * @see ConfigurationProperties 
    * @param username 
    *   weblogic username to access queue 
    */ 
    public void setUsername(final String username) { 
     this.username = username; 
    } 

    /** 
    * Password to access weblogic queue, property is set from properties file 
    * 
    * @see ConfigurationProperties 
    * @param password 
    *   weblogic password to access queue 
    */ 
    public void setPassword(final String password) { 
     this.password = password; 
    } 

    /** 
    * Setter of connection factory name, property is set from properties file 
    * 
    * @see ConfigurationProperties 
    * @param connectionFactoryName 
    *   ConnectionFactory from properties file 
    */ 
    public void setConnectionFactoryName(final String connectionFactoryName) { 
     this.connectionFactoryName = connectionFactoryName; 
    } 

    /** 
    * Setter for {@link #targetQueue} 
    * 
    * @param targetQueue 
    *   the targetQueue to set 
    */ 
    public void setTargetQueue(final String targetQueue) { 
     this.targetQueue = targetQueue; 
    } 

    /** 
    * @param replyQueue 
    *   the replyQueue to set 
    */ 
    public void setReplyQueue(final String replyQueue) { 
     this.replyQueue = replyQueue; 
    } 


    /** 
    * Get JNDI properties from properties file 
    * 
    * @return list of Weblogic jndi properties 
    */ 
    private Properties getJNDiProperties() { 

     final Properties jndiProps = new Properties(); 
     LOG.debug("Initializing JndiTemplate"); 
     LOG.debug("Url is {}", url); 
     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 JndiTemplate for target weblogic server from provided JNDI 
    * properties 
    * 
    * @return Bean of Jndi Template 
    */ 
    @Bean 
    public JndiTemplate jndiTemplate() { 
     final JndiTemplate jndiTemplate = new JndiTemplate(); 
     jndiTemplate.setEnvironment(getJNDiProperties()); 
     return jndiTemplate; 
    } 

    /** 
    * Creates instance of Jndi Object Factory bean from Jndi Template 
    * 
    * @param jndiTemplate 
    *   Jndi Template for weblogic server 
    * @return Bean of JndiObject Factory 
    */ 
    @Bean(name = "jmsJndiConnectionFactory") 
    public JndiObjectFactoryBean jndiObjectFactoryBean(final JndiTemplate jndiTemplate) { 

     final JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean(); 
     LOG.debug("Creating Weblogic JMS connection factory"); 
     jndiObjectFactoryBean.setJndiTemplate(jndiTemplate); 
     // connectionFactory name. 
     LOG.debug("ConnectoinFactory Name is {}", connectionFactoryName); 
     jndiObjectFactoryBean.setJndiName(connectionFactoryName); 
     return jndiObjectFactoryBean; 

    } 

    /** 
    * Create Jms Connection factory from Jndi Objectfactory 
    * 
    * @param jndiObjectFactoryBean 
    *   Jndi Object factory bean 
    * @return Returns Jms Connection factory Bean 
    */ 
    @Bean(name = "jmsWlsConnectionFactory") 
    public ConnectionFactory jmsConnectionFactory(final JndiObjectFactoryBean jndiObjectFactoryBean) { 
     final ConnectionFactory connectionFactory = (ConnectionFactory) jndiObjectFactoryBean.getObject(); 
     LOG.debug("ConnectoinFactory is null? {}", connectionFactory == null); 
     return connectionFactory; 
    } 

    /** 
    * Wrap Weblogic Connection Factory around caching factory 
    * 
    * @return 
    */ 
    @Bean(name = "jmsConnectionFactory") 
    @Primary 
    public ConnectionFactory connectionFactoryProxy() { 
     final CachingConnectionFactory jmsConnectionFactory = new CachingConnectionFactory(
       (ConnectionFactory) appContext.getBean("jmsWlsConnectionFactory")); 
     jmsConnectionFactory.setCacheProducers(true); 
     jmsConnectionFactory.setSessionCacheSize(20); 
     return jmsConnectionFactory; 
    } 

    /** 
    * The instance of Target Queue retrieved from JNDI, this bean is created in 
    * dev profile, where one want to run the project in standalone mode but 
    * want to connect to Weblogic Server 
    * 
    * @return Bean of target queue instance 
    */ 
    @Bean 
    public Destination jmsQueueName() { 

     final JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean(); 
     jndiObjectFactoryBean.setJndiTemplate(jndiTemplate()); 
     jndiObjectFactoryBean.setJndiName(targetQueue); // queue name 
     return (Destination) jndiObjectFactoryBean.getObject(); 
    } 

    /** 
    * Create DestinationResolver to resolve QueueName 
    * 
    * @return Instance of JNDI Destination Resolver 
    */ 
    private DestinationResolver destinationResolver() { 
     final JMSDestinationResolver destinationResolver = new JMSDestinationResolver(); 
     final JndiHelper jndiHelper = new JndiHelper(getJNDiProperties()); 
     destinationResolver.setJndiTemplate(jndiHelper); 
     return destinationResolver; 
    } 

} 

application.properties।

spring.wls.jms.url=t3://server01:8001,server02:8003 
spring.wls.jms.username=weblogic 
spring.wls.jms.password=password 
spring.wls.jms.connectionFactoryName=connectionFactory Name 
spring.wls.jms.targetQueue=queue_name 
spring.wls.jms.replyQueue=queue_name 

और आपको अपने क्लासपाथ में wlthint3client जोड़ने की आवश्यकता है। मुझे <weblogic_home>\wlserver\server\lib से जार मिला और जार से मेवेन निर्भरता बनाई और मेरे स्थानीय रेपो में धक्का दिया और जार को निर्भरता के रूप में जोड़ा।

<dependency> 
     <groupId>com.oracle.weblogic</groupId> 
     <artifactId>wlthint3client</artifactId> 
     <version>12.2.1</version> 
     <scope>provided</scope> <!-- comment out this if you are deploying on tomcat or running the application standalone --> 
    </dependency> 
+0

आपके उत्तर के लिए धन्यवाद। WebLogic का उपयोग कर हर किसी के लिए बढ़िया। हालांकि मैं वेबब्लॉग की आवश्यकता के बिना ओरेकल एडवांस्ड क्व्यूइंग (एक्यू) से कैसे जुड़ सकता हूं। तो JMS उदाहरण के साथ प्रारंभ करने में ActiveMQ कोड के समतुल्य स्प्रिंग बूट ओरेकल एक्यू क्या है, देखें [स्प्रिंग बूट जेएमएस शुरू करना] [1] या [गिटूब पर [वसंत-बूट-नमूना-सक्रियएम उदाहरण) [ 2] [1]: https://spring.io/guides/gs/messaging-jms/ [2]: https://github.com/spring-projects/spring-boot/tree/master/spring -boot-नमूने/वसंत-बूट-नमूना-ActiveMQ – dhmc