我们需要使用SI服务为GUI提供服务。 GUI通过JMS队列与后端通信,并等待在jms replyTo头属性中指定的tmp队列上的响应。
因此,可以有10个gui向后端发出查询,并在其各自的tmp队列上接收消息。
所以我使用入站网关编写了一个SI服务,看起来像这样
<int:channel id="inChannel" />
<int:channel id="outChannel" />
<int-jms:inbound-gateway id="jmsSampleService" request-destination-name="TEST_QUEUE_2" request-channel="inChannel"
connection-factory="qpidJmsConnectionFactory" extract-request-payload="true" error-channel="errorChannel" />
<int:service-activator input-channel="inChannel" ref="sampleService2" method="processMessage" />
public class SampleService2 {
public Response processMessage(Object obj) throws Exception {
LOG.info("Message received on sample service. ");
Thread.sleep(5000);
Response response = new ResponseImpl();
response.setPayload("Test response");
return response;
}
这很好用,我可以看到服务在jmsReplyTo队列上返回一条消息。但是,这是单线程同步操作,这意味着除非GUI1被服务,否则将阻止GUI2的调用。我想以异步方式执行此操作,因为这只是对类的方法调用。
我们在mule做了类似的事情
<flow name="sampleServiceFlow">
<jms:inbound-endpoint queue="TEST_QUEUE" connector-ref="queryQpidConnector" />
<byte-array-to-object-transformer />
<component>
<spring-object bean="sampleService" />
</component>
<object-to-byte-array-transformer />
<expression-filter evaluator="groovy"
expression="message.getOutboundProperty('replyToQueueName') != null" />
<jms:outbound-endpoint queue="#[header:OUTBOUND:replyToQueueName]" connector-ref="queryQpidConnector" />
</flow>
由于mule服务没有任何txns,因此它可以简单地使用auto-ack中的消息,并让SampleService的方法为该调用提供服务。
有没有办法在SI中实现这样的东西?也许通过使用消息驱动通道适配器?有没有办法在通道之间传播jms标题属性?
答案 0 :(得分:0)
只需在入站网关上使用并发。 concurrent-consumers
是最小max-concurrent-consumers
(如果指定)是最大值;适配器的容器根据需要调整并发性。
我不确定你的意思
有没有办法在频道之间传播jms标题属性?
jms标头映射到集成标头,反之亦然。