我目前正在尝试构建一个发送和接收Rabbitmq消息的单一Spring Boot应用程序。老实说,我在这里进行了反复试验,没有找到合适的组合。
现在,尝试发送消息时发生错误。我的SpringBoot应用程序看起来像:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@RestController
public class KCentralSvc {
static final String topicExchangeName = "kcentral-exchange";
static final String queueName = "kcentral";
@Autowired
private KCRepository kcRepo;
@RequestMapping("/addItem")
public String addItem(@RequestBody KCItem item) {
System.out.println("Entering add item: "+item.toString());
KCItem i = kcRepo.save(item);
//String tmp = kcRepo.findByIsbn("1234").getName();
KCSender sender = new KCSender();
sender.send();
return "this is a test "+item.toString();
}
@Bean
Queue queue() {
System.out.println("Queue() called");
return new Queue(queueName, false);
}
@Bean
TopicExchange exchange() {
return new TopicExchange(topicExchangeName);
}
@Bean
Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("kcentral.#");
}
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(listenerAdapter);
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(KCReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
public static void main(String[] args) {
System.out.println("Welcome K Services");
SpringApplication.run(KCentralSvc.class, args);
}
}
然后我有发送者类:
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
public class KCSender{
@Autowired
private RabbitTemplate template;
@Autowired
private Queue queue;
public void send() {
String message = "Hello World!";
if (template == null){
System.out.println("template null");
}
if (queue==null){
System.out.println("queue null");
}
this.template.convertAndSend(queue.getName(), message);
System.out.println(" [x] Sent '" + message + "'");
}
}
还涉及其他一些类,但问题似乎出在我试图“连接” rabbitTemplate和队列的方式上,因为两者均为空。任何提示将不胜感激。