我已经实现了RabbitMQ并且卡在一个地方,好像我的发送者无法向队列发送任何数据。
我的制片人课程:
@Service
public class MessageSender {
@Autowired
private AmqpTemplate template;
public void send(String text) {
template.convertAndSend(text);
}
}
我的spring配置文件如下所示:
<rabbit:connection-factory id="connectionFactory"
addresses="${connectionFactory.addresses}" channel-cache-size="${connectionFactory.channel-cache-size}"
virtual-host="${connectionFactory.vhost}" username="${connectionFactory.user}"
password="${connectionFactory.password}" />
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" queue="myQueue" exchange="myExchange" routing-key="dummyKey"/>
<rabbit:queue name="myQueue" />
<rabbit:direct-exchange name="myExchange">
<rabbit:bindings>
<rabbit:binding queue="myQueue" />
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="messageHandler" method="onMessage" queue-names="myQueue" />
</rabbit:listener-container>
<rabbit:admin connection-factory="connectionFactory" />
<bean id="messageHandler" class="com.tm.email.sender.spring.MessageHandler" />
我无法找出问题所在。
下面提到的东西很完美。我可以轻松地将消息推送到队列,然后我的发送者类完全正常。
public class Send {
private final static String QUEUE_NAME = "myQueue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
int i = 0;
while(i < 10000){
HashMap message = new HashMap();
message.put("message number", i);
channel.basicPublish("", QUEUE_NAME, null, SerializationUtils.serialize(message));
i++;
}
channel.close();
connection.close();
}
}
答案 0 :(得分:4)
routing-key="dummyKey"
定义中有默认 <rabbit:template>
。这意味着您的template.convertAndSend(text);
会通过myExchange
路由密钥向dummyKey
发送消息。
由于您没有通过binding
通过myQueue
向dummyKey
提供""
,您的邮件就会丢失。
从原始AMQP代码中,您只需使用默认routing-key
为每个队列发送消息到默认Exchange(AmqpTemplate
) - 其名称。
对于听众来说,消息在队列中的出现位置和方式并不重要。 这就是为什么第二个&#39;发送&#39;变体效果很好。
因此,要使用<rabbit:binding queue="myQueue" key="dummyKey"/>
修复您的用例,您必须添加以下内容:
{{1}}