1

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

服务器端服务是一个查找方法,它返回一个找到的对象,或者如果什么都找不到,则返回 null。

问题是不可能将 null 传回给客户端,所以我的问题是:

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

问候,克里斯蒂安·冯·温特-詹森

4

1 回答 1

1

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

例如

如果您使用服务激活器,则通过将“requires-reply”设置为 true,如果生成空回复,spring 集成将抛出ReplyRequiredException,您可以将其发送给客户端调用代码。

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

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

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

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

<int:channel id="serverError" />

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

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

<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" />
于 2013-07-12T10:27:19.730 回答