【问题标题】:Spring JMS header boolean could not be resolvedSpring JMS 标头布尔值无法解析
【发布时间】:2020-06-24 16:09:21
【问题描述】:

我在 Spring JMS Listener 版本 5 中有错误

我已将标头设置为布尔值。 我检查了 IBM mq 浏览器上的消息头,并且值设置正确; 但是当侦听器使用消息时,标头无法解析。 这是错误:

MessageHandlingException:方法参数类型 [class java.lang.Boolean] 缺少标头“VERSION_MESSAGE”,

这里是听众

@JmsListener(destination = QUEUE_INTERNE, containerFactory = "ListenerContainerFactory")
    public void onMessageReceived(String message,                
                                  @Header (value = JmsHeaders.VERSION_MESSAGE) Boolean version)

这里是JmsHeaders.VERSION_MESSAGE的值是JmsHeaders

public static final String VERSION_MESSAGE="VERSION_MESSAGE";

我尝试了另一种方法,像这样从侦听器中删除标头:

@JmsListener(destination = QUEUE_INTERNE, containerFactory = "ListenerContainerFactory")
    public void onMessageReceived(javax.jms.Message message)

boolean version=message.getBooleanProperty(JmsHeaders.VERSION_MESSAGE);

我没有错误,但布尔值始终为 false。

额外信息, 侦听器容器像这样被覆盖:

@Override
protected Message receiveMessage(MessageConsumer consumer) throws JMSException {
    BatchMessage batch = new BatchMessage(batchSize);       
    while (!batch.releaseAfterMessage(super.receiveMessage(consumer))) ;
    return batch.getMessages().isEmpty() ? null : batch;
}

并且被覆盖的方法总是返回 false:

  @Override
        public boolean getBooleanProperty(String s) throws JMSException {
            return false;
        }

现在我明白为什么我总是得到错误,但我怎样才能让它重新获得正确的价值?

谢谢

【问题讨论】:

    标签: ibm-mq spring-jms


    【解决方案1】:

    我终于找到了我的问题的解决方案, 鉴于我的 defaultListenerContainerFactory 已被覆盖,并且当我们收到消息时执行此方法

    @Override
    protected Message receiveMessage(MessageConsumer consumer) throws JMSException {
        BatchMessage batch = new BatchMessage(batchSize);       
        while (!batch.releaseAfterMessage(super.receiveMessage(consumer))) ;
        return batch.getMessages().isEmpty() ? null : batch;
    }
    

    所以我们无法从侦听器访问标头,因为我们将消息包装在 batchMessage 中:

    公共类 BatchMessage 实现消息 {

    private List<Message> messages = new ArrayList<>();
    
    private int batchSize;
    

    实现消息类:

    package javax.jms;
    
    import java.util.Enumeration;
    
    public interface Message {
        int DEFAULT_DELIVERY_MODE = 2;
        int DEFAULT_PRIORITY = 4;
        long DEFAULT_TIME_TO_LIVE = 0L;
        long DEFAULT_DELIVERY_DELAY = 0L;
    
        String getJMSMessageID() throws JMSException;
    
        void setJMSMessageID(String var1) throws JMSException;
    
        long getJMSTimestamp() throws JMSException;
    
        void setJMSTimestamp(long var1) throws JMSException;
    
        byte[] getJMSCorrelationIDAsBytes() throws JMSException;
    

    所有 JmsHeaders 和 Jms 数据都在 Message 中意味着什么;

    所以我必须通过 BatchMessage 中的 List 来获取所有 JmsAttributes 和 Headers 。

    这里是监听器:

    @JmsListener(destination = TARGETQUEUE, containerFactory = "BatchMessageListenerContainerFactory")
        public void onMessageReception(Message message) throws StockageQueueListenerException {
    
            try{
    
                        insererBatch((BatchMessage) message);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多