स्प्रिंग स्प्रिंग इंटीग्रेशन . नामक एक्सटेंशन का उपयोग करके एंटरप्राइज़ फ्रेमवर्क में एप्लिकेशन एकीकरण के लिए समर्थन प्रदान करता है . प्राथमिक लक्ष्य विविध व्यावसायिक डोमेन वाले अनुप्रयोगों को सुविधाजनक बनाना है; प्रौद्योगिकियां पूरे उद्यम में क्षैतिज अंतःक्रियाशीलता की दिशा में काम करती हैं। यह एक एडेप्टर ढांचे का उपयोग करके बाहरी सिस्टम और सेवाओं के साथ हल्के संदेश और एकीकरण जोड़ता है। इस लेख का उद्देश्य स्प्रिंग इंटीग्रेशन की एक बुनियादी समझ प्रदान करना है और यह स्प्रिंग प्रोग्रामिंग मॉडल पर कैसे फैलता है।
अवलोकन
व्यावसायिक अनुप्रयोग और कुछ नहीं बल्कि व्यावसायिक इकाइयों द्वारा उत्पन्न समस्याओं का समाधान है। समस्याओं का परिमाण और जटिलता यह निर्धारित करती है कि समाधान उद्यम पैमाने का है या कोड की कुछ पंक्तियाँ। एंटरप्राइज़ एप्लिकेशन के साथ समस्या यह है कि, कभी-कभी, पुरानी तकनीकों का उपयोग करके समाधान का एक हिस्सा पहले से ही उपलब्ध होता है, जो नई तकनीकों से मेल खाने के लिए खरोंच से पुनर्निर्माण के लिए लागत प्रभावी नहीं हो सकता है, चाहे वह नया हार्डवेयर हो या सॉफ्टवेयर। यह विरासती अनुप्रयोगों के साथ एक विशिष्ट समस्या है। इसलिए, हम जो कर सकते हैं वह नए घटकों का निर्माण करना है जो मौजूदा सिस्टम के साथ इंटर-ऑपरेट करते हैं। यह एप्लिकेशन एकीकरण है . हालाँकि, समस्या वहाँ समाप्त नहीं होती है। एक दूसरे की दक्षता पर अनावश्यक प्रतिबंध लगाए बिना मौजूदा घटकों के साथ निर्बाध रूप से काम करने वाले घटकों का निर्माण करना बहुत आसान नहीं है। एक गंभीर विचार है जिसे कई घटकों के निर्बाध एकीकरण के लिए संबोधित किया जाना चाहिए। स्प्रिंग इंटीग्रेशन इन मुद्दों पर विचार करता है और डेवलपर्स को आसान एकीकरण के लिए कोड करने के लिए एक वातावरण प्रदान करता है। स्प्रिंग इसमें शामिल सामान्य पैटर्न की पहचान करता है और डेवलपर्स के थोड़े से हस्तक्षेप के साथ काम करता है।
ढीला युग्मन
चूंकि समाधान में कई भागों का उपयोग होना चाहिए, इसलिए प्रत्येक भाग में यथासंभव शिथिल युग्मित तरीके से अलग-अलग सरोकार होने चाहिए। एक घटक के विकास से दूसरे पर गंभीर डिजाइन और रखरखाव प्रभाव नहीं पड़ना चाहिए। एक पूरी तरह से विघटित स्थिति एकीकरण के लिए उपयुक्त नहीं है, न ही एक तंग युग्मन स्वीकार्य है। इसलिए, खेल घटक को यथासंभव शिथिल युग्मित तरीके से डिजाइन करना है। स्प्रिंग एप्लिकेशन में युग्मन को कम करने के कुछ तरीके हैं:निर्भरता इंजेक्शन या ईवेंट-संचालित आर्किटेक्चर . इवेंट-संचालित आर्किटेक्चर एक व्यापक शब्द है और इसमें संदेश-संचालित आर्किटेक्चर, या MOM के बीच बहुत महीन-लाइन अंतर है। यद्यपि वे तकनीकी रूप से समान नहीं हैं, इस उद्देश्य के लिए, हम यहां शब्दों का परस्पर उपयोग कर सकते हैं। केवल शुद्धतावादी के लिए, घटना-संचालित और संदेश-संचालित के बीच मूल अंतर यह है कि संदेशों ने प्राप्तकर्ताओं को निर्देशित किया है जबकि घटनाएं अप्रत्यक्ष हैं; अन्यथा, उनके कार्यान्वयन का शायद ही कोई स्पष्ट सीमांकन हो। चलो यहाँ नहीं आते हैं; इसके बजाय, आइए इस पर ध्यान दें कि स्प्रिंग इंटीग्रेशन के साथ ईवेंट-संचालित आर्किटेक्चर का उपयोग कैसे किया जाता है।
इवेंट-संचालित स्प्रिंग इंटीग्रेशन
घटना-संचालित वास्तुकला में, एक जटिल अनुप्रयोग कई सेवा घटकों में टूट जाता है। ये घटक अन्य घटकों द्वारा उत्पन्न घटनाओं के माध्यम से परस्पर क्रिया करते हैं, जिन्हें प्रकाशक . कहा जाता है घटनाओं की। उस विशेष घटना में रुचि रखने वाले अन्य घटक इसकी सदस्यता लेते हैं और प्रतिक्रिया में उचित कार्रवाई करते हैं। यह, संक्षेप में, घटनाओं पर काम करने का प्रकाशक-ग्राहक मॉडल है।
राज्य में एक विशिष्ट परिवर्तन एक घटना है। जैसा बताया गया है, एक ईवेंट इच्छुक पार्टियों को भेजा जाता है और ईवेंट सब्सक्राइबर एक व्यवसाय प्रक्रिया निष्पादित करने, किसी अन्य ईवेंट को प्रकाशित करने या शायद इसे पूरी तरह से अनदेखा करने जैसी सेवा प्रदान करके प्रतिक्रिया देना चुन सकते हैं। इसका मतलब है कि एक बार प्रकाशित होने वाली घटनाओं की ग्राहकों की प्रतिक्रिया पर कोई जिम्मेदारी नहीं होती है। यह एक अलग परिदृश्य है और घटना-संचालित वास्तुकला ऐसे ढीले युग्मन परिदृश्यों का लाभ उठाती है। स्प्रिंग इंटीग्रेशन के लिए आवश्यक रीयल-टाइम कार्य प्रवाह करने के लिए लूज़ कपलिंग विशेष रूप से उपयुक्त है।
स्प्रिंग इंटीग्रेशन कंपोनेंट्स
स्प्रिंग फ्रेमवर्क के विस्तार के रूप में, स्प्रिंग इंटीग्रेशन मूल रूप से तीन घटक जोड़ता है:संदेश, संदेश चैनल और समापन बिंदु। स्प्रिंग इंटीग्रेशन डेवलपर्स ने उद्यम क्षेत्र में विभिन्न वास्तुकला, डोमेन और प्रौद्योगिकियों के बीच अंतर-संचालन के लिए समानताओं के सामान्य पैटर्न को मान्यता दी। इसलिए, पाइप और फिल्टर का उपयोग करके घटक के माध्यम से संदेश भेजने की शुरुआत करके, यह मॉडल अनुप्रयोग एकीकरण का आधार बन गया। फ़िल्टर घटक संदेशों का उपभोग या उत्पादन करते हैं जबकि पाइप, जिन्हें चैनल . कहा जाता है स्प्रिंग इंटीग्रेशन में, फिल्टर के बीच संदेश प्रवाह का वर्णन करता है।
इसमें कई पेचीदगियां शामिल हैं। अधिक विवरण के लिए संदर्भ अनुभाग में लिंक देखें। इसके बजाय, आइए इसके बजाय DirectChannel . के साथ एक सरल कार्यान्वयन पर ध्यान दें ।
एक त्वरित उदाहरण
लिस्टिंग 1 में उदाहरण एक स्प्रिंग बूट एप्लिकेशन है जो DirectChannel के साथ स्प्रिंग इंटीग्रेशन को लागू करता है . यहां, संदेश चैनल का उपयोग प्रकाशक और ग्राहक समापन बिंदुओं को अलग करने के लिए किया जाता है। संदेश चैनल का उपयोग फिल्टर और एडेप्टर घटकों के साथ संबंध स्थापित करने के लिए किया जाता है। उदाहरण बहुत सीधा है और DirectChannel . का उपयोग करता है प्रकाशक-ग्राहक और पॉइंट-टू-पॉइंट संचार मॉडल के साथ। ध्यान दें कि कोड अल्पविकसित है और स्प्रिंग इंटीग्रेशन के विचार को स्पष्ट करने के लिए एक सरल कार्यान्वयन है।
<?xml version="1.0" encoding="UTF-8"?> <project xmlns_xsi="http://www.w3.org/2001/XMLSchema-instance" xsi_schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mano.example</groupId> <artifactId>spring-integration</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>spring-integration</name> <description>Demo project for Spring BOOT</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- look up parent from repository --> </parent> <properties> <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 </project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-integration </artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-test </artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-maven-plugin </artifactId> </plugin> </plugins> </build> </project>
लिस्टिंग 1: pom.xml, स्प्रिंग एकीकरण समाधान के लिए स्प्रिंग बूट निर्भरता
package com.mano.example.springintegration.model; import java.util.Date; public class Tweet { private long tid; private String text; private Date time; private String hashTag; @Override public String toString() { return "Tweet{" + "tid=" + tid + ", text='" + text + ''' + ", time=" + time + ", hashTag='" + hashTag + ''' + '}'; } public long getTid() { return tid; } public void setTid(long tid) { this.tid = tid; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public String getUser() { return hashTag; } public void setUser(String hashTag) { this.hashTag = hashTag; } }
लिस्टिंग 2: Tweet.java, मॉडल वर्ग
package com.mano.example.springintegration.repo; import com.mano.example.springintegration.model.Tweet; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; @Component public class TweetPublisher { private static long id; public List<Tweet> getTweets(){ List<Tweet> tweets = new ArrayList<>(); tweets.add(createTweet("Storms in Pacific","#weather")); tweets.add(createTweet("what's up developers?","#dev")); tweets.add(createTweet("Chinese delicacy in Amazon", "#traveller")); tweets.add(createTweet("inflation down by 2%","#stock")); tweets.add(createTweet("save river","#environment")); tweets.add(createTweet("New star found","#astronaut")); tweets.add(createTweet("Learn math quickly","#tutor")); tweets.add(createTweet("Save animals","#bovine")); tweets.add(createTweet("stars are favorable now", "#astro")); tweets.add(createTweet("social unrest in the world", "#concern")); return tweets; } Tweet createTweet(String text, String hashTag){ Tweet tweet = new Tweet(); tweet.setTid(id++); tweet.setUser(hashTag); tweet.setText(text); tweet.setTime(new Date()); return tweet; } }
लिस्टिंग 3: TweetPublisher.java, ट्वीट डेटा भरता है
package com.mano.example.springintegration.pub; import com.mano.example.springintegration.model.Tweet; import org.springframework.beans.factory.annotation.Value; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.support .MessageBuilder; import org.springframework.stereotype.Component; @Component public class Tweeter { private DirectChannel channel; @Value("#{tweetChannel}") public void setChannel(DirectChannel channel) { this.channel = channel; } public void sendTweetReaders(Tweet tweet) { System.out.println("New Tweet - " + tweet.toString()); channel.send(MessageBuilder.withPayload(tweet) .build()); } }
लिस्टिंग 4: ट्वीटर.जावा, प्रकाशक वर्ग
package com.mano.example.springintegration.sub; import com.mano.example.springintegration.model.Tweet; import org.springframework.integration .MessageRejectedException; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; import org.springframework.stereotype.Component; @Component public class TweetReader implements MessageHandler { @Override public void handleMessage(Message<?> message) throws MessagingException { Object payload = message.getPayload(); if (payload instanceof Tweet) { receiveAndAcknowledge((Tweet) payload); } else { throw new MessageRejectedException(message, "Unknown data type has been received."); } } void receiveAndAcknowledge(Tweet tweet) { System.out.println("Hi Tweeter, this is Reader #" + System.identityHashCode(this) + "." + "Received tweet - " + tweet.toString() + "n"); } }
लिस्टिंग 5: TweetReader.java, ग्राहक वर्ग
package com.mano.example.springintegration; import com.mano.example.springintegration.incoming .TweetPublisher; import com.mano.example.springintegration.model.Tweet; import com.mano.example.springintegration.pub.Tweeter; import com.mano.example.springintegration.sub.TweetReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure .SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.integration.channel.DirectChannel; import org.springframework.messaging.MessageChannel; import java.util.List; @SpringBootApplication @ComponentScan(basePackages = "com.mano.example.springintegration") public class SpringIntegrationApplication { @Autowired private TweetPublisher tweetPublisher; @Autowired private Tweeter tweeter; @Autowired private DirectChannel channel; @Bean public MessageChannel tweetChannel(){ return new DirectChannel(); } @Bean public CommandLineRunner commandLineRunner (ApplicationContext context){ return args -> { channel.subscribe(new TweetReader()); channel.subscribe(new TweetReader()); channel.subscribe(new TweetReader()); List<Tweet> tweets = tweetPublisher.getTweets(); for (Tweet tweet: tweets){ tweeter.sendTweetReaders(tweet); } }; } public static void main(String[] args) { SpringApplication.run(SpringIntegrationApplication .class, args); } }
लिस्टिंग 6: SpringIntegrationApplication.java, मुख्य अनुप्रयोग वर्ग
निष्कर्ष
ध्यान दें कि यहाँ सचित्र की तुलना में स्प्रिंग इंटीग्रेशन के साथ बहुत कुछ है। यह सिर्फ हिमशैल का सिरा है। महत्वपूर्ण विवरण छोड़े गए हैं। इसके बारे में अधिक जानकारी के लिए स्प्रिंग दस्तावेज़ देखें; लिंक नीचे दिए गए हैं। स्प्रिंग इंटीग्रेशन के फायदे हैं, जैसे इनवर्सन ऑफ कंट्रोल (IoC), क्रॉस-कटिंग चिंता को दूर करने के लिए पहलू-उन्मुख प्रोग्रामिंग, और इसके निपटान में स्प्रिंग फ्रेमवर्क के अन्य मुख्य लाभ। स्प्रिंग इंटीग्रेशन इसे और आगे ले जाता है। स्प्रिंग इंटीग्रेशन के डेवलपर्स को डेटा के कैसे, कब और कहां के बारे में जानने की जरूरत नहीं है। फ्रेमवर्क यह संभालता है कि कैसे उचित घटकों के माध्यम से संदेश को संचालित करके व्यावसायिक तर्क को निष्पादित किया जाना है। नियमित एक्सएमएल कॉन्फ़िगरेशन योजना के अलावा, स्प्रिंग बूट स्टार्टर्स निर्भरता के बारे में थोड़ी चिंता के साथ कोड हेड ऑन शुरू करने के लिए आवश्यक निर्भरताओं की आपूर्ति करता है।
संदर्भ
- वसंत एकीकरण अवलोकन
- वसंत एकीकरण