spring-integration
Jdbc-integratie
Zoeken…
Jdbc inkomende adapter - xml-configuratie
In het officiële referentiedocument staat:
De hoofdfunctie van een inkomende kanaaladapter is om een SQL SELECT-query uit te voeren en de resultaatset als een bericht om te zetten. De berichtlading is de gehele resultatenset, uitgedrukt als een lijst, en de typen items in de lijst zijn afhankelijk van de gebruikte rijtoewijzingsstrategie. De standaardstrategie is een generieke mapper die alleen een kaart retourneert voor elke rij in het queryresultaat.
Broncode
public class Application { static class Book { String title; double price; Book(String title, double price) { this.title = title; this.price = price; } double getPrice() { return price; } String getTitle() { return title; } @Override public String toString() { return String.format("{title: %s, price: %s}", title, price); } } static class Consumer { public void consume(List<Book> books) { books.stream().forEach(System.out::println); } } static class BookRowMapper implements RowMapper<Book> { @Override public Book mapRow(ResultSet rs, int rowNum) throws SQLException { String title = rs.getString("TITLE"); double price = rs.getDouble("PRICE"); return new Book(title, price); } } public static void main(String[] args) { new ClassPathXmlApplicationContext( "classpath:spring/integration/stackoverflow/jdbc/jdbc.xml"); } }XML-configuratiebestand
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/jdbc http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:spring/integration/stackoverflow/jdbc/schema.sql"/> </jdbc:embedded-database> <bean id="bookRowMapper" class="spring.integration.stackoverflow.jdbc.Application$BookRowMapper"/> <int:channel id="channel"/> <int-jdbc:inbound-channel-adapter id="jdbcInbound" channel="channel" data-source="dataSource" query="SELECT * FROM BOOKS" row-mapper="bookRowMapper"> <int:poller fixed-rate="1000"/> </int-jdbc:inbound-channel-adapter> <int:outbound-channel-adapter id="outbound" channel="channel" method="consume"> <bean class="spring.integration.stackoverflow.jdbc.Application$Consumer"/> </int:outbound-channel-adapter> </beans>schema.sql
CREATE TABLE BOOKS ( TITLE VARCHAR(20) NOT NULL, PRICE DOUBLE NOT NULL ); INSERT INTO BOOKS(TITLE, PRICE) VALUES('book1', 10); INSERT INTO BOOKS(TITLE, PRICE) VALUES('book2', 20);Samenvatting:
-
jdbcInbound: eenjdbcInboundinkomende kanaaladapter. Het voert SQLSELECT * FROM BOOKSen converteert de resultaatset naarList<Book>via hetbookRowMapper. Ten slotte verzendt het deze boekenlijst naar hetchannel. -
channel: het bericht overbrengen -
outbound: een generieke uitgaande adapter. zie Generieke inkomende en uitgaande kanaaladapter
-
Jdbc Outbound Channel Adapter - XML-configuratie
In het Spring Integration Reference Docuement staat:
De uitgaande kanaaladapter is het omgekeerde van de inkomende: de rol is om een bericht af te handelen en te gebruiken om een SQL-query uit te voeren. De berichtlading en headers zijn standaard beschikbaar als invoerparameters voor de query ...
Java-code
public class OutboundApplication { static class Book { String title; double price; Book(String title, double price) { this.title = title; this.price = price; } public double getPrice() { return price; } public String getTitle() { return title; } } static class Producer { public Book produce() { return IntStream.range(0, 3) .mapToObj(i -> new Book("book" + i, i * 10)) .collect(Collectors.toList()) .get(new Random().nextInt(3)); } } public static void main(String[] args) { new ClassPathXmlApplicationContext( "classpath:spring/integration/stackoverflow/jdbc/jdbc-outbound.xml"); } }XML-configuratiebestand
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd http://www.springframework.org/schema/integration/jdbc http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="jdbc:h2:tcp://localhost/~/booksystem"/> <property name="username" value="sa"/> <property name="password" value=""/> <property name="driverClassName" value="org.h2.Driver"/> </bean> <jdbc:initialize-database> <jdbc:script location="classpath:spring/integration/stackoverflow/jdbc/schema.sql"/> </jdbc:initialize-database> <int:channel id="channel"/> <int:inbound-channel-adapter channel="channel" method="produce" > <bean class="spring.integration.stackoverflow.jdbc.OutboundApplication$Producer"/> <int:poller fixed-rate="1000"/> </int:inbound-channel-adapter> <int-jdbc:outbound-channel-adapter id="jdbcOutbound" channel="channel" data-source="dataSource" sql-parameter-source-factory="sqlParameterSource" query="INSERT INTO BOOKS(TITLE, PRICE) VALUES(:title, :price)"/> <bean id="sqlParameterSource" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory"> <property name="parameterExpressions"> <map> <entry key="title" value="payload.title"/> <entry key="price" value="payload.price"/> </map> </property> </bean> </beans>schema.sql
DROP TABLE IF EXISTS BOOKS; CREATE TABLE BOOKS ( TITLE VARCHAR(20) NOT NULL, PRICE DOUBLE NOT NULL );U kunt de tabel
BOOKSobserveren en u kunt zien dat de records zijn ingevoegd. Of je kunt eenint-jdbc:inbound-channel-adapterom deBOOKStabel te tellen en je kunt zien dat het aantal getallen voortdurend groeit.Samenvatting:
-
inbound: een generieke inkomende adapter die wordt gebruikt om hetBookobject als bericht te laden en naar kanaalkanaalchannel. -
channel: gebruikt om bericht over te dragen. -
jdbcOutbound: een jdbc outbound adapter, ontvangt het bericht metBooktype en bereidt vervolgens de query parameter:titleen:priceviasqlParameterSourcebonen met behulp van spel zoalspayload.titleenpayload.priceom de titel te krijgen en prijs vormen de boodschap payload.
-

