Spring 如何在PublishSubscribeChannel中测试交付?

Spring 如何在PublishSubscribeChannel中测试交付?,spring,spring-integration,spring-cloud-stream,Spring,Spring Integration,Spring Cloud Stream,我的应用程序中有一个PublishSubscribeChannel,它应该将消息传递到同一JVM中的不同MessageHandler。处理程序使用@StreamListener注释订阅到频道。通道使用执行器,因此传递是异步的 现在,我想测试发送者和处理者是否同意通过通道发送的特定对象类型(消息的类型)。AFAIU我有两种方法来测试这一点: 查找给定频道的所有订户并验证其 签名 向通道发送消息,并验证没有处理程序引发异常 我不知道该怎么做。我想我可以(2)通过收听errorChannel(那里应该

我的应用程序中有一个
PublishSubscribeChannel
,它应该将消息传递到同一JVM中的不同
MessageHandler
。处理程序使用
@StreamListener
注释订阅到频道。通道使用
执行器
,因此传递是异步的

现在,我想测试发送者和处理者是否同意通过通道发送的特定对象类型(消息的类型)。AFAIU我有两种方法来测试这一点:

  • 查找给定频道的所有订户并验证其 签名
  • 向通道发送消息,并验证没有处理程序引发异常
  • 我不知道该怎么做。我想我可以(2)通过收听
    errorChannel
    (那里应该没有消息),但我不太明白我应该等待多长时间才能收到错误消息


    有什么建议吗?

    对于1,您可以使用反射查看通道调度程序中的处理程序集合;然后再次使用反射查看投手的
    方法

    然而,你的设计是有缺陷的,除非你不介意丢失信息;传入消息将在您移交给执行人后立即确认;如果服务器崩溃,消息将丢失


    如果您去掉了执行器,将更简单的方法是向通道添加一个拦截器,该拦截器将在其
    AfterEndCompletion()
    方法中通知任何异常(满足您的2)。

    对于1,您可以使用反射来查看通道调度程序中的处理程序集合;然后再次使用反射查看投手的
    方法

    然而,你的设计是有缺陷的,除非你不介意丢失信息;传入消息将在您移交给执行人后立即确认;如果服务器崩溃,消息将丢失


    如果您去掉了执行器,则向通道添加拦截器会更简单,它将在其
    AfterEndCompletion()
    方法(满足您的2)中通知任何异常。

    重新设计缺陷。是的,我有这个顾虑,但由于我的处理程序执行IO,因此可能会阻塞,所以我希望同时处理传入消息。使用executor是我所知道的唯一方法。您应该增加使用者的并发性,而不是添加一个executor。对不起,我不明白,如果我的通道在一个JVM内,在没有executor的情况下增加并发性会有多大帮助。你能给我指出一些文档吗?
    @StreamListener
    由一个侦听器容器支持,该容器通过
    并发性
    属性管理线程-它在内部使用任务执行器。看见如果发生故障,将消息传递给您自己的执行者将导致消息丢失。您根本不应该使用发布/订阅频道;活页夹将依次调用多个
    @StreamListeners
    ,并且只有在最后一个成功时才确认消息。如果希望同时调用它们,则应为每个绑定一个新通道,每个通道都有不同的使用者
    。重新设计缺陷。是的,我有这个顾虑,但由于我的处理程序执行IO,因此可能会阻塞,所以我希望同时处理传入消息。使用executor是我所知道的唯一方法。您应该增加使用者的并发性,而不是添加一个executor。对不起,我不明白,如果我的通道在一个JVM内,在没有executor的情况下增加并发性会有多大帮助。你能给我指出一些文档吗?
    @StreamListener
    由一个侦听器容器支持,该容器通过
    并发性
    属性管理线程-它在内部使用任务执行器。看见如果发生故障,将消息传递给您自己的执行者将导致消息丢失。您根本不应该使用发布/订阅频道;活页夹将依次调用多个
    @StreamListeners
    ,并且只有在最后一个成功时才确认消息。如果希望同时调用它们,则应该为每个绑定一个新通道,每个通道都有一个不同的使用者