大家好!问题是这样的:
我有一个应用程序正在侦听 RabbitMQ 中的特定队列。当消息到达此队列时,会以某种方式对其进行处理。问题是没有标头和编码的常规消息(例如,在 base64 中)无法加载到此队列中。
如果我在队列中放一条常规消息(下面有一个示例),那么程序将在表单中出现错误Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: invalid stream header: 304A2F52。
此外,他收到消息本身:有一个方法RMQMessage#fromMessage(byte[] b, List<String> trustedPackages) throws RMQJMSException,如果你在那里放一个断点,你可以看到b我发送的正是我发送的变量。
通过经验,我发现他对消息到达的形式不满意,并意识到程序正确解析了此类消息:
结果,应用程序的输出是正常的:
2021-10-15 16:10:12.286 INFO 14264 --- [enerContainer-1] .m.m.w.CustomMessageListener : [x] Received <<< queue Привет
问题是如何重新配置 RabbitMQ 客户端,以便它可以接受纯文本消息,而不是用一堆标头编码。
我正在使用以下依赖项:
<dependency>
<groupId>com.rabbitmq.jms</groupId>
<artifactId>rabbitmq-jms</artifactId>
<version>2.3.0</version>
</dependency>
侦听器的分配如下(代码稍作修改,实际上是动态创建队列+为它们分配侦听器,但无论如何这是通过 完成的JmsListenerEndpointRegistrar):
public class JmsListenerConfiguration implements JmsListenerConfigurer {
private final CustomMessageListener messageListener;
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
final String queue = "queue";
final SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId(queue);
endpoint.setDestination(queue);
endpoint.setMessageListener((message) -> messageListener.onMessage(message, queue));
registrar.registerEndpoint(endpoint);
}
}


您的问题不在于队列本身或 rabbitmq 设置。您的问题是您的(?)应用程序正在使用此特定队列来存储 JMS 消息,即 特定格式的特定任务的消息。
如果您以不同的形式以不同的目的在那里发送消息,那么很明显,从队列中读取并希望在那里看到 JMS 消息的客户端(并且它具有特殊的格式和特殊的标头)不理解它们。消息格式由客户端设置,即 rabbitmq-jms 库,它是严格定义的,不可配置。在这里您可以看到消息正文是如何从
Message.要解决您的问题,您需要了解为什么需要它。如果您想发送消息以便现有的 JMS 客户端可以处理它们,那么就没有办法了——您需要以 rabbitmq JMS 客户端支持的格式发送。
如果您想向其他客户端发送消息,那么您不需要使用相同的队列 - 您需要创建一个新队列,专门用于您的任务,最重要的是,不要向其中添加 JMS 消息,而是使用类from
spring-rabbitmq:RabbitTemplate发送和SimpleMessageListenerContainer接收消息: