我们在ActiveMq代理中实现了过滤器或插件,该过滤器或插件可拦截入站消息并从安全角度验证它们。
我们需要一种程序员友好的方式来在生产方接收这些异常(理想情况下不是在连接级,而是在会话或生产级,因为它们可能需要特定于会话的响应)。
我们正在以以下方式在代理端进行消息级授权:在ActiveMq提供程序(服务器)中,我们实现BrokerFilter(插件)以拦截传入的JMS消息,并验证附加到消息的JWT访问令牌为属性。如果JWT令牌有效,则消息通过下游链传递,如果无效,则抛出SecurityException。
[我们注意到消息确实返回到发送JVM,该消息报告没有针对特定异常注册任何ExceptionListener实例。
我们的问题是,对于这种情况,我们在哪里可以在Spring JMS中最好地注册ExceptionListener?我们可以直接访问生产者和JMS会话,但不能直接访问JMS连接。
的确,将ExceptionListener注册到连接对于连接级事件很有用,但是对于会话级事件,如果我们可以在会话或生产者本地注册此类异常侦听器,则可能会使代码更易于理解和具有凝聚力。是对邮件发送尝试的直接响应。
当然,也可以通过连接级别和本地侦听器的线程本地结构来实现本地异常侦听器,但是我想知道JMS或Spring是否已经提供了这样的可能性,即会话或生产者直接发现他们的消息是未经授权,因此他们向上游应答,以调用微服务,而不是重新尝试发送微服务,例如。
我们正在使用持久性消息,但不确定是否进行同步或异步发送。我相信在异步发送时,此类事件将被回调某种ExceptionListener(在BrokerFilter.send方法中引发的异常)。在同步发送时,可能会将异常直接引发到那里(但是线程阻塞可能会降低微服务的健壮性)。
这对于connection.setExceptionListener是可解决的,但对我们来说,使用session.setExceptionListener甚至消息请求级别的侦听器可能更方便。
我们希望看到Spring JMS可以使用的其他任何选项,但可以在连接级别注册异常侦听器,并且可以使用同步发送,否则可以选择其他选项。
由于Spring JMS使用JMS API,因此您几乎仅限于JMS API提供的功能,并且它不提供会话或请求级别的异常侦听器。它为异步报告的异常提供了连接级别的异常侦听器,并为同步用例提供了常规的Java检查异常。