Spring осигурява поддръжка за интеграция на приложения в корпоративни рамки чрез използване на разширение, наречено Spring Integration . Основната цел е да се улеснят приложенията с различни бизнес домейни; технологиите работят за хоризонтална оперативна съвместимост в цялото предприятие. Той добавя леки съобщения и интеграция с външни системи и услуги, използвайки рамка на адаптер. Тази статия има за цел да предостави основно разбиране на Spring интеграцията и как тя се простира върху модела за програмиране на Spring.
Общ преглед
Комерсиалните приложения не са нищо друго освен решения на проблеми, породени от бизнес звената. Големината и сложността на проблемите определят дали решението е от мащаб на предприятието или само от няколко реда код. Проблемът с корпоративното приложение е, че понякога част от решението вече е налична с помощта на по-стари технологии, които може да не са рентабилни за възстановяване от нулата, за да съответстват на по-новите технологии, било то нов хардуер или софтуер. Това е типичен проблем с наследените приложения. Следователно това, което можем да направим, е да създадем по-нови компоненти, които взаимодействат със съществуващата система. Това е интегриране на приложения . Проблемът обаче не свършва дотук. Не е много лесно да се създават компоненти, които работят безпроблемно със съществуващите компоненти, без да се налагат ненужни ограничения върху ефективността на другия. Има сериозно съображение, което трябва да бъде разгледано за безпроблемно интегриране на множество компоненти. Spring Integration разглежда тези проблеми и предоставя среда за разработчиците да кодират за лесна интеграция. Spring идентифицира общите модели и върши работата с малка намеса на разработчиците.
Разхлабена връзка
Тъй като решението трябва да използва множество части, всяка част трябва да има отделни проблеми по възможно най-слабо свързан начин. Развитието на един компонент не трябва да има сериозни последици за дизайна и поддръжката на друг. Пълна отделена ситуация не е подходяща за интегриране, нито тясното свързване е приемливо. Следователно играта е да се проектира компонентът по възможно най-слабо свързан начин. Има няколко начина за намаляване на свързването в Spring приложение:инжектиране на зависимост или управлявана от събития архитектура . Архитектурата, управлявана от събития, е широк термин и има много фина разлика между управляваната от съобщения архитектура или MOM. Въпреки че технически не са еднакви, за тази цел можем да използваме термините взаимозаменяемо тук. Само в името на пуриста, основната разлика между управлявани от събития и управлявани от съобщения е, че съобщенията са насочвали получатели, докато събитията са ненасочени; в противен случай тяхното изпълнение едва ли има ясно разграничение. Нека не влизаме в това тук; вместо това, нека се съсредоточим върху това как се използва управляваната от събития архитектура с Spring Integration.
Управлявана от събития пролетна интеграция
В архитектурата, управлявана от събития, сложно приложение е разбито на няколко компонента на услугата. Тези компоненти взаимодействат чрез събития, генерирани от други компоненти, които се наричат издател на събитията. Други компоненти, които се интересуват от това конкретно събитие, се абонират за него и предприемат подходящи действия в отговор. Това по същество е моделът издател-абонат за работа по събития.
Конкретна промяна в състоянието е събитие. Както беше посочено, събитие се изпраща на заинтересовани страни и абонатите на събитието могат да изберат да отговорят, като предоставят услуга като изпълнение на бизнес процес, публикуване на друго събитие или, може би, напълно игнорирането му. Това означава, че събитията, веднъж публикувани, не носят никаква отговорност за отговора на абонатите. Това е отделен сценарий и управляваната от събития архитектура използва такива хлабави сценарии за свързване. Разхлабеното свързване е особено подходящо за извършване на работен поток в реално време, който Spring Integration изисква.
Компоненти за пролетна интеграция
Като разширение на рамката на Spring, Spring Integration основно добавя три компонента:съобщения, канали за съобщения и крайни точки. Разработчиците на Spring Integration разпознаха общия модел на прилики за взаимодействие между разнообразна архитектура, домейн и технологии в корпоративната арена. Следователно, чрез въвеждане на съобщения чрез компонент, използващ тръби и филтър, този модел стана основа за интеграция на приложения. Филтърните компоненти консумират или произвеждат съобщенията, докато тръбите, наричани канали в Spring Integration, описва потока на съобщенията между филтрите.
Има много тънкости. Направете справка с връзките в раздела Референции за повече подробности. Тук нека вместо това да се съсредоточим върху проста реализация с DirectChannel .
Бърз пример
Примерът в листинг 1 е приложение Spring BOOT, което реализира Spring интеграция с DirectChannel . Тук каналът за съобщения се използва за разделяне на крайните точки на издателя и абоната. Каналът за съобщения се използва за установяване на връзка с компонентите на филтъра и адаптера. Примерът е доста ясен и използва DirectChannel с комуникационни модели издател-абонат и от точка до точка. Имайте предвид, че кодът е елементарен и е проста реализация, за да илюстрира идеята за Spring Integration.
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.0modelVersion> <groupId>com.mano.examplegroupId> <artifactId>spring-integrationartifactId> <версия>0.0.1-SNAPSHOTверсия> <опаковане>бурканопаковката> <име>spring-integrationname> <описание>Демо проект за Spring BOOTописание> <родител> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <версия>2.0.6.RELEASEверсия> <относителен път /> родител> <свойства> <project.build.sourceEncoding> UTF-8 project.build.sourceEncoding> <project.reporting.outputEncoding> UTF-8 project.reporting.outputEncoding> <java.version>1.8java.версия> свойства> <зависимости> <зависимост> <groupId>org.springframework.bootgroupId> <artifactId> spring-boot-starter-integration artifactId> зависимост> <зависимост> <groupId>org.springframework.bootgroupId> <artifactId> spring-boot-starter-test artifactId> <обхват>тестобхвата> зависимост> зависимости> <изграждане> <приставки> <приставка> <groupId> org.springframework.boot groupId> <artifactId> spring-boot-maven-plugin artifactId> приставка> приставки> изграждане>проект>пред>Обява 1: pom.xml, Spring BOOT зависимости за решение за Spring Integration
пакет com.mano.example.springintegration.model;внос java.util.Date;публичен клас Tweet {частен дълга тия; частен Низтекст; частен Датачас; частен Низ hashTag; @Override обществено String toString() {връщане на „Tweet{“ + "tid=" +тид + ", text='" +текст + '' + ", time=" +време + ", hashTag='" +хештег + '' + '}'; } public long getTid() {return tid; } публична недействителност setTid(дълго tid) {това .тиди =прилива; } обществено Низ getText() {връщане на текст; } публична недействителност setText(Текст на низ) { това .текст =текст; } обществено Дата getTime() {време на връщане; } публична недействителност setTime(Дата и час) { това .време =време; } обществено Низ getUser() {return hashTag; } публична недействителност setUser(String hashTag) { това .hashTag =hashTag; }}Списък 2: Tweet.java, клас модел
пакет com.mano.example.springintegration.repo;импорт com.mano.example.springintegration.model.Tweet;импорт org.springframework.stereotype.Component;импорт java.util.ArrayList;импорт java.util.Date;импорт java.util.List;@Componentpublic class TweetPublisher {private static long идентификатор; обществено ListgetTweets(){ List tweets =new ArrayList<>(); tweets.add(createTweet("Бурите в Тихия океан" ,"#времето" )); tweets.add(createTweet("какво има разработчиците?" ,"#dev" )); tweets.add(createTweet(„Китайски деликатес в Amazon“ , "#пътешественик" )); tweets.add(createTweet("инфлацията спадна с 2%" ,"#сток" )); tweets.add(createTweet("save river" ,"#среда" )); tweets.add(createTweet("Намерена е нова звезда" ,"#астронавт" )); tweets.add(createTweet("Научете математика бързо" ,"#преподавател" )); tweets.add(createTweet("Запазване на животни" ,"#говеждо" )); tweets.add(createTweet("звездите са благоприятни сега" , "#astro" )); tweets.add(createTweet("социални вълнения в света" , "#загриженост" )); връщане туитове; } Tweet createTweet(String text, String hashTag){ Tweet tweet =нов туит(); tweet.setTid(id ++); tweet.setUser(hashTag); tweet.setText(текст); tweet.setTime(нов Дата()); връщане туитвам; }} Списък 3: TweetPublisher.java, попълва данни за туит
пакет com.mano.example.springintegration.pub;импорт com.mano.example.springintegration.model.Tweet;импорт org.springframework.beans.factory.annotation.Value;импорт org.springframework.integration.channel.DirectChannel;импорт org.springframework.integration.support .MessageBuilder;импорт org.springframework.stereotype.Component;@Componentpublic class Високоговорител {частен DirectChannel канал; @Value("#{tweetChannel}" )обществена недействителност setChannel(DirectChannel channel) { това .канала =канал; } публична недействителност sendTweetReaders(Tweet tweet) { System.out .println("Нов туит - " + tweet.toString()); канал .send(MessageBuilder.withPayload). (туит) .build()); }}Списък 4: Tweeter.java, клас на издателя
пакет com.mano.example.springintegration.sub;импорт com.mano.example.springintegration.model.Tweet;импорт org.springframework.integration .MessageRejectedException;импорт org.springframework.messaging.Message;импорт org.springframework.messaging.MessageHandler;импорт org.springframework.messaging.MessagingException;импорт org.springframework.stereotype.Component;@Componentpublic class TweetReader приложения MessageHandler { @Override public void handleMessage(Message> message) хвърля MessagingException { Обектно натоварване =message.getPayload(); ако (полезен товар екземпляр Tweet) { receiveAndAcknowledge((Tweet) полезен товар); } друго {хвърляне на ново MessageRejectedException(съобщение, „Неизвестен тип данни е получен.“ ); } } недействителен receiveAndAcknowledge(Tweet tweet) { System.out .println("Здравей, Tweeter, това е Reader #" + System.identityHashCode (това ) + "." + „Получен туит – „ + tweet.toString() + "n" ); }}Списък 5: TweetReader.java, клас на абонатите
пакет com.mano.example.springintegration;импорт com.mano.example.springintegration.incoming .TweetPublisher;импорт com.mano.example.springintegration.model.Tweet;импорт com.mano.example.springintegration.pub.Tweeter;импорт com.mano.example.springintegration.sub.TweetReader;импорт org.springframework.beans.factory.annotation.Autowired;импорт org.springframework.boot.CommandLineRunner;импорт org.springframework.boot.SpringApplication;импорт org.springframework.boot.autoconfigure .SpringBootApplication;импорт org.springframework.context.ApplicationContext;импорт org.springframework.context.annotation.Bean;импорт org.springframework.context.annotation.ComponentScan;импорт org.springframework.integration.channel.DirectChannel;импорт org.springframework.messaging.MessageChannel;импорт java.util.List;@SpringBootApplication@ComponentScan(basePackages ="com.mano.example.springintegration" )обществена класа SpringIntegrationApplication { @Autowired частен TweetPublisher tweetPublisher; @Autowired частен ВисокоговорителТуитър; @Autowired частен DirectChannel канал; @Bean обществен MessageChannel tweetChannel(){ връщане на нов DirectChannel(); } @Bean обществен CommandLineRunner commandLineRunner (ApplicationContext контекст){ връщане args -> { канал .абонирайте се (нов TweetReader()); канал .абонирайте се (нов TweetReader()); канал .абонирайте се (нов TweetReader()); Listtweets =tweetPublisher .getTweets(); за (Туитър туит:туитове){ туитър .sendTweetReaders(туит); } }; } обществена статична празнота main(String[] args) { SpringApplication.изпълни (SpringIntegrationApplication .клас , аргументи); }} Списък 6: SpringIntegrationApplication.java, основен клас на приложението
Заключение
Имайте предвид, че има много повече с Spring Integration, отколкото е илюстрирано тук. Това е само върхът на айсберга. Важни подробности са пропуснати. Вижте документацията на Spring за повече подробности относно това; връзките са дадени по-долу. Spring Integration има предимства, като инверсия на управлението (IoC), аспектно ориентирано програмиране за справяне с междусекторни проблеми и други основни предимства на Spring Framework, с които разполага. Spring Integration го отвежда по-далеч. Разработчиците на Spring Integration не трябва да знаят за това как, кога и къде се намират данните. Рамката управлява начина, по който бизнес логиката трябва да бъде изпълнена чрез маневриране на съобщението чрез подходящи компоненти. Освен обикновена XML конфигурационна схема, Spring BOOT starters предоставя необходимите зависимости за стартиране на кода с малки притеснения относно зависимостите.
Препратки
- Общ преглед на пролетната интеграция
- Пролетна интеграция