我最近一直在研究Spring集成和AMQP(RabbitMQ),因为我需要用异步方法通信两个应用程序(中间件和后端),这样中间件在接收客户端调用时就不会阻塞。
我首先采用了一种更简单的方法,以同步方式实现这一点,这意味着我在中间件上有一个网关接口和一个出站网关(requiresReply=true),然后在后端有一个入站网关和一个服务激活器。这种初始方法工作得很好(我使用了Spring集成XML配置)。
现在,我需要澄清如何以异步方式实现这一点。
通过查看RabbitMQ教程6,最好使用回调队列和相关标识,根据我的理解,这将类似于调用Spring RabbitTemboard的转换和发送(),然后接收(),而不是转换SendAnd接收()(这将阻止直到收到响应)。
我已经检查了Spring集成文档,其中我需要替换中间件上的网关接口,以便它返回Future或ListenableFuture。
异步网关
完成后,我还查看了outbound gateway的文档,其中说明它可以与RabbitTemplate一起管理correlationID和replyTo消息属性。
我的问题是:
老实说,你没有提供原始的业务需求。这可能是一个事实,真的没有理由处理这个async
handsoff,因为你有一个@Gateway
作为一个切入点,它是无线程的,即使它被阻止等待回复它不影响其他线程,这些线程可能执行类似的sendAndRecture
操作。在大多数情况下,在同一个请求者线程中执行所有操作就足够了,并且不会因为转移到共享的ThreadPoolExecator而降低性能。
好的,Future
允许您释放调用方一点,以便准备好接受同一线程中的新请求。
由于它是一个MessagingGateway
并且您无论如何都希望得到一个应答,因此有一个与请求相关联的钩子-TemporaryReplyChannel
头。这就是为什么
我想说的是,我们可以实现与异步回复要求相同的
临时回复通道
增益。
您应该使用入站
/出站
通道适配器对。
- 在发送消息到
之前
嗯,像这样的事情...
HTH
请随时提出更多问题。如果我误解了你的问题,请纠正我。
我有一个入站RabbitMQ通道适配器,每天成功处理3000条消息,但是偶尔我会在RabbitMQ管理控制台看到1条未包装的消息。这似乎仍然是这样。 我确实有一个重试建议链,可以重试3次,然后通过死信路由密钥移动到DLQ,这对大多数例外情况都很有效。 在过去的几周里,unacked已经发生了两次,有一次我能够进行线程转储,并看到int-http:outbound-gateway调用在等待http响
我尝试使用@ControllerAdvise+@ExceptionHandler来捕获ConstraintViolationException,但是它似乎是以前捕获的,抛出的是TransactionSystemException。 验证数据是非常基本的事情,但出于某种原因,在搜索了很多次之后,我还没有找到解决方案。 编辑:显示代码:
我使用spring集成和amqp实现了请求/回复。由于某些原因,客户机抛出异常,处理请求可能需要很长时间(在某些情况下甚至需要一个小时)- 我的客户端配置如下。 我相信回复超时默认值是-1,表示无限期等待,但不确定为什么它不工作,任何帮助都将不胜感激。 此外,在amqp中实施如此长时间的等待操作是否存在任何已知问题,或者应该没问题? 非常感谢。
我正在尝试添加过滤器以丢弃流并在失败后继续执行主流并聚合拆分器。两个错误的预期类型 丢弃通道没有连接回主流以执行拆分中的下一项。 我可以写路线 更新1: 网关能够拦截请求,但执行的流而不是中的下一项 更新2:(回答)来自Artem 这将执行条件跳过
我正在将SpringBoot 2.0与Spring Integr5.0.3一起使用,并且我的HTTP. in边界网关有问题。我的目标是验证发布到网关的JSON,因为请求pojo由强制字段组成。 有没有一种简单的方法来验证pojo中的字段是否已设置?我已经测试过的是使用@NotNull-SpringValidation,但它似乎不受Spring集成的支持。 你好smoothny
问题内容: 以下是我的代码段。我想使用angular来验证我的下拉菜单。 有效表示: 有效值可以是“选择服务”以外的任何值,这是我的默认值。 像其他ASP.net的下拉列表一样,需要字段验证器DefaultValue =“ 0”,因此在这里,我的下拉列表将与服务绑定,我想选择除“选择服务”之外的所有其他值。 问题答案: 您需要在下拉列表中添加属性,然后需要添加属性,然后可以使用引用错误: HTML