我有一个将消息发送到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
}
}
答案 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。