Java Spring将消息从使用者发送回队列

时间:2018-11-14 18:42:44

标签: java spring rabbitmq

我有一个将消息发送到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();
        }
    }
}

然后在我的配置中,我进行了设置:     @豆角,扁豆     公共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
    }
}

2 个答案:

答案 0 :(得分:2)

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

public class MyListener {
    @Autowired
    private Repush repush;

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

答案 1 :(得分:0)

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

通过在侦听器方法中的时间点使用new创建Repush,您将无法获得可以识别您所处上下文的bean。