如何将空值和异常传递给客户端Spring集成入站/出站JMS网关?

时间:2012-10-17 15:57:54

标签: exception null jms spring-integration gateway

我在客户端设置了出站JMS网关,在服务器端设置了入站JMS网关。客户端使用这些网关以同步方式调用服务器端的服务。

服务器端服务是一个返回找到的对象的find-method,如果找不到任何内容,则返回null。

问题是无法将null传递回客户端,所以我的问题是:

  1. 将null传递回客户端的最佳做法是什么?
  2. 如果服务器端方法抛出异常,我该如何将此异常传回客户端?
  3. 此致 Christian von Wendt-Jensen

1 个答案:

答案 0 :(得分:1)

Spring不支持null有效负载的想法但它可以抛出异常。将服务激活器的“requires-reply”属性设置为true。如果你直接使用入站网关调用,那么你需要抛出一个异常,你不能返回null,因为它会静默返回,如果没有指定超时,调用者线程将无限期地等待。

e.g。

如果您使用Service激活器,那么通过将“requires-reply”设置为true,如果生成null reply,则spring integration将抛出您可以发送到客户端调用代码的ReplyRequiredException。

要在客户端发送异常,您可以使用以下策略。

在入站网关上配置错误通道。

<int-jms:inbound-gateway request-channel="req" reply-channel="reply" error-channel="serverError" /> 

在serverError频道上添加服务激活器以重新抛出。我通常将异常包装在一些常见的Exception holder类中,以便在客户端使用它来进行有效负载路由。

<int:channel id="serverError" />

<int:service-activator input-channel="serverError"  expression="new package.ExceptionWrapper(payload.cause==null ? payload : payload.cause)" /> 

在客户端,使用有效负载路由器,如果它是ExceptionWrapper类型,则将其路由到某个通道,例如'errorChannel',您可以在其中解包它从服务器端抛出的异常。默认情况下,将payload-router回复发送到网关回复通道。

<int:payload-type-router input-channel="replyRoute" default-output-channel="reply">
  <int:mapping type="package.ExceptionWrapper" channel="errorThrower" />
</int:payload-type-router>

<int:channel id="errorThrower" /> 

<int:service-activator input-channel="errorThrower" ref="exceptionHandler" method="process" />