我有一个Web应用程序,它通过弹簧过滤器设置弹簧安全上下文.服务受基于用户角色的弹簧注释的保护.这有效.
异步任务在JMS侦听器中执行(扩展javax.jms.MessageListener).这个监听器的设置是用Spring完成的.
在此时,用户通过身份验证,从Web应用程序发送消息.在消息处理期间,我需要在JMS线程(用户和角色)中使用相同的身份验证.
今天,这是通过将Spring身份验证放在JMS ObjectMessage中来完成的:
SecurityContext context = SecurityContextHolder.getContext();
Authentication auth = context.getAuthentication();
... put the auth object in jms message object
Run Code Online (Sandbox Code Playgroud)
然后在JMS侦听器内部提取身份验证对象并在上下文中设置:
SecurityContext context = new SecurityContextImpl();
context.setAuthentication(auth);
SecurityContextHolder.setContext(context);
Run Code Online (Sandbox Code Playgroud)
这大部分时间都有效.但是,如果在处理消息之前有延迟,则永远不会处理消息.我无法确定这些消息丢失的原因,但我不确定我们传播身份验证的方式是好的,即使它在另一个服务器中处理消息时在custer中工作也是如此.
这是传播Spring身份验证的正确方法吗?
此致,Mickaël
如何在 kubernetes 中为 kafka、amqp 或任何其他可伸缩的消息代理部署消息使用者?我的假设是消费者运行一个循环来拉取消息。
我希望 kubernetes 在许多消息到达代理队列时创建更多 pod,并在队列中到达的消息太少时删除一些 pod。
哪个组件拥有结束pods的主动权?Pod 本身是因为它无法从队列中获取消息?还是 kubernetes 因为 pod 不消耗 cpu?
如果队列为空时任何 pod 结束,恐怕只要队列为空,pod 就会一直生和死。