Spring integration 如何使用Spring Integration在收到消息时调用安全设置

Spring integration 如何使用Spring Integration在收到消息时调用安全设置,spring-integration,Spring Integration,我目前正在使用Spring集成从队列中获取消息,并使用服务激活器将它们发送到服务。我的问题是,我调用的服务需要为当前线程设置安全上下文。这可以通过调用另一个bean的无参数方法handleAuthentication()来设置。我想知道在调用service activator服务之前,在收到新消息时调用此服务的最佳方式是什么?我原本想将两个服务激活器链接在一起,第一个调用handleAuthentication(),但这似乎不正确,因为handleAuthentication()不需要来自实际消

我目前正在使用Spring集成从队列中获取消息,并使用服务激活器将它们发送到服务。我的问题是,我调用的服务需要为当前线程设置安全上下文。这可以通过调用另一个bean的无参数方法handleAuthentication()来设置。我想知道在调用service activator服务之前,在收到新消息时调用此服务的最佳方式是什么?我原本想将两个服务激活器链接在一起,第一个调用handleAuthentication(),但这似乎不正确,因为handleAuthentication()不需要来自实际消息的任何信息。

是的,您关于安全处理的假设是正确的。这实际上只是一个副作用方面,不应与业务逻辑联系在一起

因此,我们应该使用一些允许我们在程序中遵循相同行为的东西。它在编程中也被称为
方面

为此,Spring Integration建议使用类似于
MessageChannelInterceptor
的钩子,根据您的解释,您可以在
preReceive()
回调中准确地实现
handleAuthentication()


另一个技巧可以通过
MethodInterceptor
实现来实现,它应该在目标服务调用之前将
SecurityContext
填充到当前线程中。

我遇到了一个关于预接收和后接收如何工作的问题。无论是否有消息,每次轮询通道时都会调用这些方法。是否有一种方法,只有在实际存在消息时才会调用这些消息?否则,它将不断调用handleAuthentication()。哦,对了!如何在
postReceive()
回调中执行同样的操作?
postReceive()
实际上也总是在轮询时被调用。我通过查看org.springframework.integration.channel.AbstractPollableChannel的
receive(longtimeout)
方法验证了这一点。当没有消息时,回调只接收回消息的null。为True,但是如果(message!=null)并且仅在这种情况下执行
handleAuthentication()
,则可以检查实现