我在客户端设置了出站JMS网关,在服务器端设置了入站JMS网关。客户端使用这些网关以同步方式调用服务器端的服务。
服务器端服务是一个返回找到的对象的find-method,如果找不到任何内容,则返回null。
问题是无法将null传递回客户端,所以我的问题是:
此致 Christian von Wendt-Jensen
答案 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" />