INTSAMPLES-144: Barrier Sample
JIRA: https://jira.spring.io/browse/INTSAMPLES-144 INTSAMPLES-144: Use o-c-a for Release INTSAMPLES-144: Switch to Spring Boot INTSAMPLES-144: Polishing * Upgrade to SI-4.2, SF-4.2, Boot-1.3 * Fix: https://jira.spring.io/browse/INTSAMPLES-145
This commit is contained in:
committed by
Artem Bilan
parent
dd7871a7ba
commit
db3d78109f
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.integration.samples.barrier;
|
||||
|
||||
import org.springframework.amqp.support.AmqpHeaders;
|
||||
import org.springframework.integration.aggregator.MessageGroupProcessor;
|
||||
import org.springframework.integration.store.MessageGroup;
|
||||
import org.springframework.messaging.Message;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @since 4.2
|
||||
*
|
||||
*/
|
||||
public class AckAggregator implements MessageGroupProcessor {
|
||||
|
||||
@Override
|
||||
public Object processMessageGroup(MessageGroup group) {
|
||||
StringBuilder builder = new StringBuilder("Result: ");
|
||||
for (Message<?> message : group.getMessages()) {
|
||||
if (builder.length() > 8) {
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(message.getPayload() + ": ack=" + message.getHeaders().get(AmqpHeaders.PUBLISH_CONFIRM));
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.integration.samples.barrier;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.ImportResource;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @since 4.2
|
||||
*/
|
||||
@Configuration
|
||||
@EnableAutoConfiguration
|
||||
@ImportResource("/META-INF/spring/integration/server-context.xml")
|
||||
public class Application {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
ConfigurableApplicationContext server = SpringApplication.run(Application.class, args);
|
||||
ConfigurableApplicationContext client
|
||||
= new SpringApplicationBuilder("/META-INF/spring/integration/client-context.xml")
|
||||
.web(false)
|
||||
.run(args);
|
||||
RequestGateway requestGateway = client.getBean("requestGateway", RequestGateway.class);
|
||||
String request = "A,B,C";
|
||||
System.out.println("\n\n++++++++++++ Sending: " + request + " ++++++++++++\n");
|
||||
String reply = requestGateway.echo(request);
|
||||
System.out.println("\n\n++++++++++++ Replied with: " + reply + " ++++++++++++\n");
|
||||
client.close();
|
||||
server.close();
|
||||
System.exit(0); // AMQP-519
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2002-2012 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.integration.samples.barrier;
|
||||
|
||||
|
||||
/**
|
||||
* @author Oleg Zhurakousky
|
||||
* @author Gunnar Hillert
|
||||
*
|
||||
*/
|
||||
public interface RequestGateway {
|
||||
|
||||
String echo(String request);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?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:int="http://www.springframework.org/schema/integration"
|
||||
xmlns:int-http="http://www.springframework.org/schema/integration/http"
|
||||
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/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd">
|
||||
|
||||
<int:gateway id="requestGateway"
|
||||
service-interface="org.springframework.integration.samples.barrier.RequestGateway"
|
||||
default-request-channel="requestChannel"/>
|
||||
|
||||
<int:channel id="requestChannel"/>
|
||||
|
||||
<int-http:outbound-gateway request-channel="requestChannel"
|
||||
url="http://localhost:8080/receiveGateway"
|
||||
http-method="POST"
|
||||
expected-response-type="java.lang.String"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,84 @@
|
||||
<?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:int="http://www.springframework.org/schema/integration"
|
||||
xmlns:int-http="http://www.springframework.org/schema/integration/http"
|
||||
xmlns:int-amqp="http://www.springframework.org/schema/integration/amqp"
|
||||
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/integration/amqp http://www.springframework.org/schema/integration/amqp/spring-integration-amqp.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
|
||||
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
|
||||
http://www.springframework.org/schema/integration/http http://www.springframework.org/schema/integration/http/spring-integration-http.xsd
|
||||
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
|
||||
|
||||
<int-http:inbound-gateway request-channel="receiveChannel"
|
||||
path="/receiveGateway"
|
||||
error-channel="errorChannel"
|
||||
supported-methods="POST"/>
|
||||
|
||||
<int:channel id="receiveChannel" />
|
||||
|
||||
<int:header-enricher input-channel="receiveChannel" output-channel="processChannel">
|
||||
<int:header name="ackCorrelation" expression="headers['id']" />
|
||||
</int:header-enricher>
|
||||
|
||||
<int:publish-subscribe-channel id="processChannel" />
|
||||
|
||||
<int:chain input-channel="processChannel" order="1">
|
||||
<int:header-filter header-names="content-type, content-length" />
|
||||
<int:splitter delimiters="," />
|
||||
<int-amqp:outbound-channel-adapter amqp-template="amqpTemplate"
|
||||
exchange-name="barrier.sample.exchange" routing-key="barrier.sample.key"
|
||||
confirm-ack-channel="confirmations"
|
||||
confirm-nack-channel="confirmations"
|
||||
return-channel="errorChannel"
|
||||
confirm-correlation-expression="#this"/>
|
||||
</int:chain>
|
||||
|
||||
<!-- Suspend the HTTP thread until the publisher confirms are asynchronously received -->
|
||||
|
||||
<int:barrier id="barrier" input-channel="processChannel" order="2"
|
||||
correlation-strategy-expression="headers['ackCorrelation']"
|
||||
output-channel="transform" timeout="10000" />
|
||||
|
||||
<int:transformer input-channel="transform" expression="payload[1]" />
|
||||
|
||||
<!-- Aggregate the publisher confirms and send the result to the barrier release channel -->
|
||||
|
||||
<int:chain input-channel="confirmations" output-channel="release">
|
||||
<int:header-filter header-names="replyChannel, errorChannel" />
|
||||
<int:service-activator expression="payload" /> <!-- INT-3791; use s-a to retain ack header -->
|
||||
<int:aggregator>
|
||||
<bean class="org.springframework.integration.samples.barrier.AckAggregator" />
|
||||
</int:aggregator>
|
||||
</int:chain>
|
||||
|
||||
<int:channel id="release" />
|
||||
|
||||
<int:outbound-channel-adapter channel="release" ref="barrier.handler" method="trigger" />
|
||||
|
||||
<!-- Consumer -> nullChannel -->
|
||||
|
||||
<int-amqp:inbound-channel-adapter channel="nullChannel"
|
||||
queue-names="barrier.sample.queue"
|
||||
connection-factory="connectionFactory" />
|
||||
|
||||
<!-- Infrastructure -->
|
||||
|
||||
<rabbit:connection-factory id="connectionFactory" host="localhost" publisher-confirms="true"
|
||||
publisher-returns="true"/>
|
||||
|
||||
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" mandatory="true" />
|
||||
|
||||
<rabbit:admin connection-factory="connectionFactory" />
|
||||
|
||||
<rabbit:queue name="barrier.sample.queue" auto-delete="true" />
|
||||
|
||||
<rabbit:direct-exchange name="barrier.sample.exchange" auto-delete="true">
|
||||
<rabbit:bindings>
|
||||
<rabbit:binding queue="barrier.sample.queue" key="barrier.sample.key" />
|
||||
</rabbit:bindings>
|
||||
</rabbit:direct-exchange>
|
||||
|
||||
</beans>
|
||||
14
basic/barrier/src/main/resources/logback.xml
Normal file
14
basic/barrier/src/main/resources/logback.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<configuration>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!-- encoders are assigned the type
|
||||
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="warn">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
</configuration>
|
||||
@@ -0,0 +1,38 @@
|
||||
package org.springframework.integration.samples.barrier;
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
* @since 4.2
|
||||
*/
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = Application.class)
|
||||
public class ApplicationTests {
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user