Spring Integration Gateway是一个组件,它隐藏了Spring Integration所提供的消息传输API。
换句话说,就是一个Messaging Gatewayencapsulates messaging-specific code,并将其与应用程序的其他部分分开。
网关提供请求-回复行为。这与只提供单向发送或接收行为的通道适配器相反。
我们使用与之前Spring JMS集成示例相同的Maven项目设置。
不过这次我们将建立一个请求/回复流,网关也会处理回复。
有两个出站通道连接到JmsOutboundGateway
。
OutboundRequestChannel将消息发送到出站网关。这个网关从Spring Integration消息中创建JMS消息,并将其发送到JMS目的地(在此为请求队列)。然后它处理JMS回复消息并将其发送到OutboundResponseChannel。
JmsInboundGateway
连接到两个入站通道。
入站网关从一个JMS目的地接收并发送至InboundRequestChannel。它还处理InboundResponseChannel上的回复,并将其发送到JMS的回复目的地(在这里是回复队列)。
OrderService
实现了一个基本的请求/回复行为。它在InboundRequestChannel上监听,在InboundResponseChannel上回复。
我们将使用以下工具/框架。
我们的项目有以下目录结构。
首先,我们创建一个OutboundGatewayConfig
类,并用@Configuration
对其进行注释。
定义一个OutboundOrderRequestChannel作为一个DirectChannel
bean。这是框架提供的默认通道,但你可以使用Spring Integration提供的任何消息通道。
OutboundOrderResponseChannel被定义为一个QueueChannel
。这允许我们使用receive()
方法接收响应信息。
jmsOutboundGateway出站网关构造函数需要一个ConnectionFactory
。我们只是传递Spring Boot为我们自动配置的Bean。
使用setRequestDestinationName()
来设置请求JMS消息需要发送到的目的地(request.q)。setReplyDestinationName()
方法用于指定需要发送响应JMS消息的JMS目的地(response.q)。
网关从OutboundOrderRequestChannel接收请求信息。两者之间的联系是通过@ServiceActivator
进行的。这个注解允许将任何Spring管理的对象连接到一个输入通道。
OutboundOrderResponseChannel是用setReplyChannel()
指定的。
package com.codenotfound.jms;
import javax.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.jms.JmsOutboundGateway;
import org.springframework.messaging.MessageChannel;
@Configuration
public class OutboundGatewayConfig {
@Value("${destination.order.request}")
private String orderRequestDestination;
@Value("${destination.order.response}")
private String orderResponseDestination;
@Bean
public MessageChannel outboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel outboundOrderResponseChannel() {
return new QueueChannel();
}
@Bean
@ServiceActivator(inputChannel = "outboundOrderRequestChannel")
public JmsOutboundGateway jmsOutboundGateway(
ConnectionFactory connectionFactory) {
JmsOutboundGateway gateway = new JmsOutboundGateway();
gateway.setConnectionFactory(connectionFactory);
gateway.setRequestDestinationName(orderRequestDestination);
gateway.setReplyDestinationName(orderResponseDestination);
gateway.setReplyChannel(outboundOrderResponseChannel());
return gateway;
}
}
在InboundGatewayConfig
类中,我们配置了入站网关。
我们定义了InboundOrderRequestChannel和InboundOrderResponseChannel消息通道。
接下来,我们创建OrderService
。Bean,它将处理传入的请求信息。它使用@ServiceActivator
连接到InboundOrderRequestChannel。
jmsInboundGateway构造器requires一个MessageListenerContainer
和一个ChannelPublishingJmsMessageListener
。
在网关上,我们指定InboundOrderRequestChannel作为请求消息通道。
我们没有指定一个回复通道。网关会自动创建一个临时的、匿名的回复通道,在那里监听回复。
我们创建SimpleMessageListenerContainer
,允许我们接收来自请求目的地(request.q)的消息。关于设置的更多细节,请参考Spring JMS监听器的例子。
ChannelPublishingJmsMessageListener将JMS消息转换为Spring集成消息,然后将该消息发送到一个通道。如果expectReply
值为真,它也会等待Spring Integration的回复消息,并将其转换成JMS回复消息。
默认情况下,setExpectReply
属性被设置为false,所以不要忘记将其设置为true!
package com.codenotfound.jms;
import javax.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.jms.ChannelPublishingJmsMessageListener;
import org.springframework.integration.jms.JmsInboundGateway;
import org.springframework.jms.listener.SimpleMessageListenerContainer;
import org.springframework.messaging.MessageChannel;
@Configuration
@EnableIntegration
public class InboundGatewayConfig {
@Value("${destination.order.request}")
private String orderRequestDestination;
@Bean
public MessageChannel inboundOrderRequestChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel inboundOrderResponseChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "inboundOrderRequestChannel")
public OrderService orderService() {
return new OrderService();
}
@Bean
public JmsInboundGateway jmsInboundGateway(
ConnectionFactory connectionFactory) {
JmsInboundGateway gateway = new JmsInboundGateway(
simpleMessageListenerContainer(connectionFactory),
channelPublishingJmsMessageListener());
gateway.setRequestChannel(inboundOrderRequestChannel());
return gateway;
}
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(
ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container =
new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName(orderRequestDestination);
return container;
}
@Bean
public ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener() {
ChannelPublishingJmsMessageListener channelPublishingJmsMessageListener =
new ChannelPublishingJmsMessageListener();
channelPublishingJmsMessageListener.setExpectReply(true);
return channelPublishingJmsMessageListener;
}
}
为了总结这个例子,我们需要创建OrderService
。
这个类接收一个订单信息。然后它记录内容,并使用MessageBuilder创建一个简单的状态信息。
为了让jmsOutboundGateway能够将一个响应与之前的请求相关联,我们设置了jms_correlationId属性。
我们还指定inboundOrderResponseChannel作为需要发送响应的消息通道。
package com.codenotfound.jms;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
public class OrderService {
private static final Logger LOGGER =
LoggerFactory.getLogger(OrderService.class);
public Message<?> order(Message<?> order) {
LOGGER.info("received order='{}'", order);
Message<?> status = MessageBuilder.withPayload("Accepted")
.setHeader("jms_correlationId",
order.getHeaders().get("jms_messageId"))
.setReplyChannelName("inboundOrderResponseChannel").build();
LOGGER.info("sending status='{}'", status);
return status;
}
}
现在我们已经配置了两个网关,是时候测试它们了。
创建一个SpringJmsApplicationTest
单元测试案例。然后,使用ApplicationContext
来获取对OutboundOrderRequestChannel的引用。
发送一个Spring Integration消息,然后在OutboundOrderResponseChannel上等待响应的到来。
package com.codenotfound.jms;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@DirtiesContext
public class SpringJmsApplicationTest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testIntegrationGateway() {
MessageChannel outboundOrderRequestChannel =
applicationContext.getBean("outboundOrderRequestChannel",
MessageChannel.class);
QueueChannel outboundOrderResponseChannel = applicationContext
.getBean("outboundOrderResponseChannel", QueueChannel.class);
outboundOrderRequestChannel
.send(new GenericMessage<>("order-001"));
assertThat(
outboundOrderResponseChannel.receive(5000).getPayload())
.isEqualTo("Accepted");;
}
}
在根目录下打开命令提示符,使用以下Maven命令启动测试用例。
mvn test
在输出日志中,我们可以看到,订单信息被入站网关收到。
一个TemporaryReplyChannel被用来接收来自OrderService
的响应。
流程以出站网关收到状态信息而结束。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.5.RELEASE)
2019-05-30 17:10:10.203 INFO 9624 --- [ main] c.c.jms.SpringJmsApplicationTest : Starting SpringJmsApplicationTest on DESKTOP-2RB3C1U with PID 9624 (started by Codenotfound in C:\Users\Codenotfound\repos\spring-jms\spring-jms-integration-gateway)
2019-05-30 17:10:10.204 INFO 9624 --- [ main] c.c.jms.SpringJmsApplicationTest : No active profile set, falling back to default profiles: default
2019-05-30 17:10:10.891 INFO 9624 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2019-05-30 17:10:10.897 INFO 9624 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created.
2019-05-30 17:10:10.903 DEBUG 9624 --- [ main] faultConfiguringBeanFactoryPostProcessor : SpEL function '#xpath' isn't registered: there is no spring-integration-xml.jar on the classpath.
2019-05-30 17:10:10.909 INFO 9624 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2019-05-30 17:10:11.009 INFO 9624 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationDisposableAutoCreatedBeans' of type [org.springframework.integration.config.annotation.Disposables] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-30 17:10:11.046 INFO 9624 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration$EnhancerBySpringCGLIB$e7ebec34] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-30 17:10:11.906 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Using Persistence Adapter: MemoryPersistenceAdapter
2019-05-30 17:10:11.992 INFO 9624 --- [ JMX connector] o.a.a.broker.jmx.ManagementContext : JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
2019-05-30 17:10:12.093 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-2RB3C1U-59598-1559229011932-0:1) is starting
2019-05-30 17:10:12.098 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-2RB3C1U-59598-1559229011932-0:1) started
2019-05-30 17:10:12.098 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : For help or more information please see: http://activemq.apache.org
2019-05-30 17:10:12.132 INFO 9624 --- [ main] o.a.activemq.broker.TransportConnector : Connector vm://localhost started
2019-05-30 17:10:12.554 INFO 9624 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2019-05-30 17:10:12.625 DEBUG 9624 --- [ main] faultConfiguringBeanFactoryPostProcessor :
Spring Integration global properties:
spring.integration.channels.autoCreate=true
spring.integration.taskScheduler.poolSize=10
spring.integration.readOnly.headers=
spring.integration.channels.maxUnicastSubscribers=0x7fffffff
spring.integration.endpoints.noAutoStartup=
spring.integration.messagingTemplate.throwExceptionOnLateReply=false
spring.integration.channels.maxBroadcastSubscribers=0x7fffffff
2019-05-30 17:10:12.633 DEBUG 9624 --- [ main] .s.i.c.GlobalChannelInterceptorProcessor : No global channel interceptors.
2019-05-30 17:10:12.639 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2019-05-30 17:10:12.640 INFO 9624 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application.errorChannel' has 1 subscriber(s).
2019-05-30 17:10:12.641 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started _org.springframework.integration.errorLogger
2019-05-30 17:10:12.641 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {service-activator:inboundGatewayConfig.orderService.serviceActivator} as a subscriber to the 'inboundOrderRequestChannel' channel
2019-05-30 17:10:12.641 INFO 9624 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.inboundOrderRequestChannel' has 1 subscriber(s).
2019-05-30 17:10:12.641 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started inboundGatewayConfig.orderService.serviceActivator
2019-05-30 17:10:12.642 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {jms:outbound-gateway:outboundGatewayConfig.jmsOutboundGateway.serviceActivator} as a subscriber to the 'outboundOrderRequestChannel' channel
2019-05-30 17:10:12.642 INFO 9624 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.outboundOrderRequestChannel' has 1 subscriber(s).
2019-05-30 17:10:12.642 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started outboundGatewayConfig.jmsOutboundGateway.serviceActivator
2019-05-30 17:10:12.642 INFO 9624 --- [ main] ishingJmsMessageListener$GatewayDelegate : started org.springframework.inte[email protected]7fda2001
2019-05-30 17:10:12.643 INFO 9624 --- [ main] o.s.i.jms.JmsMessageDrivenEndpoint : started [email protected]c1dfb
2019-05-30 17:10:12.643 INFO 9624 --- [ main] o.s.integration.jms.JmsInboundGateway : started jmsInboundGateway
2019-05-30 17:10:12.672 INFO 9624 --- [ main] c.c.jms.SpringJmsApplicationTest : Started SpringJmsApplicationTest in 2.878 seconds (JVM running for 3.83)
2019-05-30 17:10:13.050 DEBUG 9624 --- [ main] o.s.integration.channel.DirectChannel : preSend on channel 'outboundOrderRequestChannel', message: GenericMessage [payload=order-001, headers={id=cc373c3d-4828-3ac8-eff0-961cf89896d1, timestamp=1559229013049}]
2019-05-30 17:10:13.051 DEBUG 9624 --- [ main] o.s.integration.jms.JmsOutboundGateway : jmsOutboundGateway received message: GenericMessage [payload=order-001, headers={id=cc373c3d-4828-3ac8-eff0-961cf89896d1, timestamp=1559229013049}]
2019-05-30 17:10:13.058 DEBUG 9624 --- [ main] o.s.integration.jms.JmsOutboundGateway : ReplyTo: queue://response.q
2019-05-30 17:10:13.102 DEBUG 9624 --- [ Session Task-1] .i.j.ChannelPublishingJmsMessageListener : converted JMS Message [ActiveMQTextMessage {commandId = 7, responseRequired = true, messageId = ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1, destination = queue://request.q, transactionId = null, expiration = 0, timestamp = 1559229013072, arrival = 0, brokerInTime = 1559229013073, brokerOutTime = 1559229013081, correlationId = null, replyTo = queue://response.q, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1042, properties = {timestamp=1559229013049}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = order-001}] to integration Message payload [order-001]
2019-05-30 17:10:13.108 DEBUG 9624 --- [ Session Task-1] o.s.integration.channel.DirectChannel : preSend on channel 'inboundOrderRequestChannel', message: GenericMessage [payload=order-001, headers={replyChannel=org.springframewor[email protected]528ed261, jms_redelivered=false, errorChannel=org.springframewor[email protected]528ed261, jms_replyTo=queue://response.q, jms_destination=queue://request.q, id=5aa2de11-c75d-5cad-347d-cde8edd8add3, priority=4, jms_timestamp=1559229013072, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, timestamp=1559229013108}]
2019-05-30 17:10:13.108 DEBUG 9624 --- [ Session Task-1] o.s.i.handler.ServiceActivatingHandler : ServiceActivator for [org.spr[email protected]549bfc9a] (inboundGatewayConfig.orderService.serviceActivator.handler) received message: GenericMessage [payload=order-001, headers={replyChannel=org.springframewor[email protected]528ed261, jms_redelivered=false, errorChannel=org.springframewor[email protected]528ed261, jms_replyTo=queue://response.q, jms_destination=queue://request.q, id=5aa2de11-c75d-5cad-347d-cde8edd8add3, priority=4, jms_timestamp=1559229013072, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, timestamp=1559229013108}]
2019-05-30 17:10:13.116 INFO 9624 --- [ Session Task-1] com.codenotfound.jms.OrderService : received order='GenericMessage [payload=order-001, headers={replyChannel=org.springframewor[email protected]528ed261, jms_redelivered=false, errorChannel=org.springframewor[email protected]528ed261, jms_replyTo=queue://response.q, jms_destination=queue://request.q, id=5aa2de11-c75d-5cad-347d-cde8edd8add3, priority=4, jms_timestamp=1559229013072, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, timestamp=1559229013108}]'
2019-05-30 17:10:13.116 INFO 9624 --- [ Session Task-1] com.codenotfound.jms.OrderService : sending status='GenericMessage [payload=Accepted, headers={replyChannel=inboundOrderResponseChannel, jms_correlationId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, id=0457eb0e-6e39-0ba0-e1e9-6ed3e950511c, timestamp=1559229013116}]'
2019-05-30 17:10:13.116 DEBUG 9624 --- [ Session Task-1] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'inboundOrderRequestChannel', message: GenericMessage [payload=order-001, headers={replyChannel=org.springframewor[email protected]528ed261, jms_redelivered=false, errorChannel=org.springframewor[email protected]528ed261, jms_replyTo=queue://response.q, jms_destination=queue://request.q, id=5aa2de11-c75d-5cad-347d-cde8edd8add3, priority=4, jms_timestamp=1559229013072, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, timestamp=1559229013108}]
2019-05-30 17:10:13.117 DEBUG 9624 --- [ Session Task-1] .i.j.ChannelPublishingJmsMessageListener : Reply destination: queue://response.q
2019-05-30 17:10:13.127 DEBUG 9624 --- [ main] o.s.integration.jms.JmsOutboundGateway : converted JMS Message [ActiveMQTextMessage {commandId = 10, responseRequired = true, messageId = ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:1:1, destination = queue://response.q, transactionId = null, expiration = 0, timestamp = 1559229013119, arrival = 0, brokerInTime = 1559229013119, brokerOutTime = 1559229013121, correlationId = ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, replyTo = queue://response.q, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1040, properties = {priority=4, timestamp=1559229013117}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = Accepted}] to integration Message payload [Accepted]
2019-05-30 17:10:13.129 DEBUG 9624 --- [ main] o.s.integration.channel.QueueChannel : preSend on channel 'outboundOrderResponseChannel', message: GenericMessage [payload=Accepted, headers={jms_redelivered=false, jms_replyTo=queue://response.q, jms_destination=queue://response.q, jms_correlationId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, id=e64b09f8-fe5b-e612-7d44-bd1d118cfdc9, priority=4, jms_timestamp=1559229013119, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:1:1:1, timestamp=1559229013129}]
2019-05-30 17:10:13.130 DEBUG 9624 --- [ main] o.s.integration.channel.QueueChannel : postSend (sent=true) on channel 'outboundOrderResponseChannel', message: GenericMessage [payload=Accepted, headers={jms_redelivered=false, jms_replyTo=queue://response.q, jms_destination=queue://response.q, jms_correlationId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, id=e64b09f8-fe5b-e612-7d44-bd1d118cfdc9, priority=4, jms_timestamp=1559229013119, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:1:1:1, timestamp=1559229013129}]
2019-05-30 17:10:13.130 DEBUG 9624 --- [ main] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'outboundOrderRequestChannel', message: GenericMessage [payload=order-001, headers={id=cc373c3d-4828-3ac8-eff0-961cf89896d1, timestamp=1559229013049}]
2019-05-30 17:10:13.131 DEBUG 9624 --- [ main] o.s.integration.channel.QueueChannel : postReceive on channel 'outboundOrderResponseChannel', message: GenericMessage [payload=Accepted, headers={jms_redelivered=false, jms_replyTo=queue://response.q, jms_destination=queue://response.q, jms_correlationId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:2:1:1, id=e64b09f8-fe5b-e612-7d44-bd1d118cfdc9, priority=4, jms_timestamp=1559229013119, jms_messageId=ID:DESKTOP-2RB3C1U-59598-1559229011932-4:1:1:1:1, timestamp=1559229013129}]
2019-05-30 17:10:13.198 INFO 9624 --- [ main] ishingJmsMessageListener$GatewayDelegate : stopped org.springframework.inte[email protected]7fda2001
2019-05-30 17:10:13.199 INFO 9624 --- [ main] o.s.i.jms.JmsMessageDrivenEndpoint : stopped [email protected]c1dfb
2019-05-30 17:10:13.199 INFO 9624 --- [ main] o.s.integration.jms.JmsInboundGateway : stopped jmsInboundGateway
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application.errorChannel' has 0 subscriber(s).
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : stopped _org.springframework.integration.errorLogger
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Removing {service-activator:inboundGatewayConfig.orderService.serviceActivator} as a subscriber to the 'inboundOrderRequestChannel' channel
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.inboundOrderRequestChannel' has 0 subscriber(s).
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : stopped inboundGatewayConfig.orderService.serviceActivator
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Removing {jms:outbound-gateway:outboundGatewayConfig.jmsOutboundGateway.serviceActivator} as a subscriber to the 'outboundOrderRequestChannel' channel
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.integration.channel.DirectChannel : Channel 'application.outboundOrderRequestChannel' has 0 subscriber(s).
2019-05-30 17:10:13.200 INFO 9624 --- [ main] o.s.i.endpoint.EventDrivenConsumer : stopped outboundGatewayConfig.jmsOutboundGateway.serviceActivator
2019-05-30 17:10:13.201 INFO 9624 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'taskScheduler'
2019-05-30 17:10:13.207 INFO 9624 --- [ main] o.a.activemq.broker.TransportConnector : Connector vm://localhost stopped
2019-05-30 17:10:13.207 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-2RB3C1U-59598-1559229011932-0:1) is shutting down
2019-05-30 17:10:13.213 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-2RB3C1U-59598-1559229011932-0:1) uptime 1.448 seconds
2019-05-30 17:10:13.213 INFO 9624 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.15.9 (localhost, ID:DESKTOP-2RB3C1U-59598-1559229011932-0:1) is shutdown
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.186 s - in com.codenotfound.jms.SpringJmsApplicationTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.691 s
[INFO] Finished at: 2019-05-30T17:10:13+02:00
[INFO] ------------------------------------------------------------------------
如果你想运行上述代码样本,你可以得到完整的源代码here。
在本教程中,我们建立了一个端到端的消息传递实例,使用了一个出站和入站的Spring JMS集成网关。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://codenotfound.com/spring-jms-integration-gateway-example.html
内容来源于网络,如有侵权,请联系作者删除!