【问题标题】:Spring Integration SpEL for Header evaluation用于标头评估的 Spring Integration SpEL
【发布时间】:2014-09-15 11:09:19
【问题描述】:

我正在尝试使用 SpEL 评估 Spring Integration 消息的 JMSHeader,但它似乎总是评估为 false,即使消息标头标记为 true

<si:router expression="headers.jms_redelivered.equals(T(java.lang.Boolean).FALSE) ? 'channel1' : 'channel2' />

JMSXDeliveryCount=10, jms_redelivered=true

有人可以评论我在这里做错了什么吗?

谢谢

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    为我工作:

    @Test
    public void testRedeliveredHeaderWithSpEL() throws JMSException {
        DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
        javax.jms.Message jmsMessage = new StubTextMessage() {
            @Override
            public boolean getJMSRedelivered() throws JMSException {
                return true;
            }
        };
        Map<String, Object> headers = mapper.toHeaders(jmsMessage);
        assertNotNull(headers.get(JmsHeaders.REDELIVERED));
    
        SpelExpressionParser parser = new SpelExpressionParser();
        StandardEvaluationContext context = new StandardEvaluationContext();
        context.addPropertyAccessor(new MapAccessor());
        Expression expression =
                parser.parseExpression("jms_redelivered.equals(T(java.lang.Boolean).FALSE) ? 'channel1' : 'channel2'");
        assertEquals("channel2", expression.getValue(context, headers, String.class));
    
    }
    

    您确实应该确保在您的&lt;router&gt; 之前不会丢失headers

    也许你在&lt;router&gt; 之前使用了一些&lt;transformer&gt;,它返回整个Message&lt;?&gt; 而不是payload

    【讨论】:

    • 谢谢阿特姆。对我不起作用。我正在路由器通道上进行窃听以记录以查看我是否获得了所需的标头,并且看起来正在使用包括 jms_redelivered 在内的预期标头进行记录。不确定是否只是配置出错。我一直在使用代码,但更喜欢使用配置。
    • 您的 Spring 集成版本?
    • 4.0.2 SI 和 4.0.5 弹簧。谢谢
    • 好的。让我们确定你的目标是什么!现在听起来像if jms_redelivered header is equal to 'FALSE' return 'channel1' otherwise - 'channel2'。你的职位?
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2020-12-03
    • 2013-11-13
    相关资源
    最近更新 更多