【问题标题】:Java Spring send back message to queue from consumerJava Spring将消息从消费者发送回队列
【发布时间】:2023-04-07 21:38:01
【问题描述】:

我有一个向rabbitmq发送消息的服务,消费者对消息进行一些操作并重新排队。

我可以成功地向 rabbitmq 发送初始消息,但问题是如果消息需要修改,我无法向 rabbitmq 重新发送任何已使用的消息。

@Service
public class MyService {

    /**
     * The template
     */
    @Autowired
    private AmqpTemplate amqpTemplate;
    private final RabbitMQConfig config;

    public void send(String message) {
        try {
            amqpTemplate.convertAndSend("ex", "r", message);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然后在我的配置中我进行了设置: @豆角,扁豆 public ConnectionFactory connectionFactory() { /* 工作代码 */ }

@Bean
public Queue myQueue() { return new Queue("my-queue"); 
// etc...

@Bean
MessageListenerAdapter myListenerAdapter(MyListener listener) {
    return new MessageListenerAdapter(listener, "listener");
}

@Bean
MyListener myListener() {
    return new MyListener();
}

那么……

public class MyListener {
    public void receiveMessage(String message) { 
        // ... some code
        // if message requires modification, then repush
        new Repush().push(message);
    }
}

我尝试使用 new 创建一个新类,但“myService”始终为空

@Component
public class Repush {
    @Autowired
    private MyService myService;

    public void push(String message) {
        // myService is null at this point
    }
}

【问题讨论】:

    标签: java spring rabbitmq


    【解决方案1】:

    不要使用new 创建 bean。 Spring 仅在 bean 中注入字段。你的 MyListener 是一个 bean。只需在此类中添加带有@Autowired 注释的Repush 字段即可。

    public class MyListener {
        @Autowired
        private Repush repush;
    
        public void receiveMessage(String message) { 
            // ... some code
            // if message requires modification, then repush
            repush.push(message);
        }
    }
    

    【讨论】:

    • 不仅仅是现场注入。作者需要学习spring、bean等全概念。
    • 它不是可编译的顺便说一句。删除 final 关键字或添加构造函数,如果添加构造函数,Spring 足够聪明,可以注意到依赖关系,因此不需要 @Autowired :)
    【解决方案2】:

    如果您在应用程序上下文中将 myService 声明为 bean,并且将 Repush 声明为 bean,则您可以使用 @Autowired 将其注入 MyListener

    通过在侦听器方法中的某个时间点使用 new 创建 Repush,您不会得到一个识别您所处的上下文的 bean。

    【讨论】:

    • 如果我只在“MyListener.receiveMessage()”中调用“MyService”会更好吗?
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2013-08-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2013-02-21
    • 2013-06-09
    • 2021-11-14
    相关资源
    最近更新 更多