当前位置: 首页 > 知识库问答 >
问题:

过滤jms消息与xQuery,使用apache骆驼野蝇

谢阳成
2023-03-14

我无法使用ApacheCamel和wildfly对JMS消息使用xquery。

我的代码从jms队列中读取并尝试过滤消息

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cdi.ContextName;
import org.apache.camel.component.jms.JmsComponent;
import org.wildfly.extension.camel.CamelAware;

import javax.annotation.Resource;
import javax.ejb.Startup;
import javax.enterprise.context.ApplicationScoped;
import javax.jms.ConnectionFactory;


@Startup
@CamelAware
@ApplicationScoped
@ContextName("test")
class MyRouteBuilder extends RouteBuilder {


    @Resource(mappedName = "java:jboss/DefaultJMSConnectionFactory")
    private ConnectionFactory connectionFactory;

    @Override
    public void configure() throws Exception {

        getContext().addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));


        from("jms:queue:test1").
                routeId("test").
                to("log:jms?showAll=true").
                filter().xquery("fn:contains(//person/name/text(),'james')").
                to("file://Users/asse/Outbound");

当我运行带有消息

消息历史记录 --------------------------------------------------------------------------------------------------------------------------------------- RouteId ProcessorId处理器
经过(ms)[test][test][jms://队列: test1
][5][test][to7][log: jms? show All=true
][1][test][filter7][filter[xQuery{XQuery[net.sf.saxon.query.XQueryExpression@3af367ad ]}] ] [ 2]

Stacktrace----------------------------------------------------------------------------------------------:org。阿帕奇。骆驼RuntimeExpressionException:java。lang.NullPointerException:外部对象不能在org上包装Java null。阿帕奇。骆驼组成部分xquery。XQueryBuilder。在org上匹配(XQueryBuilder.java:220)。阿帕奇。骆驼加工机过滤处理器。在org上匹配(FilterProcessor.java:65)。阿帕奇。骆驼加工机过滤处理器。在org上处理(FilterProcessor.java:51)。阿帕奇。骆驼经营仪器处理器。org上的进程(InstrumentationProcessor.java:77)。阿帕奇。骆驼加工机重新发货。在org上处理(redeliveryrrorhandler.java:542)。阿帕奇。骆驼加工机卡梅隆处理器。进程(CamelInternalProcessor.java:197)

我不明白为什么!有人能帮我解决这个问题吗??


共有1个答案

韩华美
2023-03-14

在单机版camel 2.18.1中遇到了相同的问题。

我相信这是camel中的一个bug,是升级到Saxon 9.7.0版时引起的,它不再允许将空值放入查询上下文中,而该bug位于类org中。阿帕奇。骆驼组成部分xquery。XQueryBuilder。它试图将所有交换头和属性添加到方法org中的查询执行上下文中。阿帕奇。骆驼组成部分xquery。XQueryBuilder#配置查询。如果任何头或属性都有空值(在JMS消息的情况下,会有很多头),就会引发异常。

我能够重现这个问题,似乎这不是骆驼2.18中xquery的唯一问题

我记录了一个jira的问题https://issues.apache.org/jira/browse/CAMEL-10653

 类似资料:
  • 我有一个从JMS队列读取项目并将其写入数据库的路径。 我已经阅读了关于ApacheCamelJMS组件的文档,但我没有得到我的问题的确切和明确的答案,即“如果路由中出现异常,JMS消费者是否会重新插入项目或解锁JMS队列中的消息?”。 谢谢 阿里

  • 我有一个场景,我想“拉”RabbitMQ队列/主题的消息,并一次处理一个。特别是当消费者启动时,队列中已经有消息。我尝试了以下方法,但没有成功(这意味着,这些选项中的每一个都会读取队列,直到队列为空,或者直到另一个线程关闭上下文)。 1.第一次处理后立即停止路由 与1类似,但使用闩锁而不是while loop和sleep。 使用轮询消费者 使用ConsumerTemplate()-类似于上面的代码

  • Spring Boot上有一个应用程序,它把它的jms请求放在一个队列中,然后从另一个队列中获取答案。还有一个应用程序正在处理响应队列。请求~每秒100次。实际上,问题是如何处理它们并选择我需要的?现在我使用@JmsListener读取队列中的所有消息,但是那些不适合我的应用程序的消息被绘制出来。创建一个线程并分别等待答案,在我看来,这似乎不是一个好主意,因为可以有几千个线程。如何成为?

  • 我对骆驼很陌生,如果这很明显,请原谅。 我们正在尝试设置一条骆驼路线(在 talend esb 中),它执行以下操作: < li >通过JMS接收消息 < li >数据库更新 < li >通过JMS使用请求/回复将消息发送到另一个系统 < li >使用回复中的信息进行另一次数据库更新 这一切都在一条路线上。我发现该路由不再接受 1 中的任何消息。当它正在等待 3 中的回复时。 我曾尝试在JMS组件

  • 我创建了一个路由器类,并在@Configuration中标记为@Bean。有一件事我不太确定,那就是camel会多久调用一次数据库以获取select结果?一旦我在数据库中有了一个新条目,camel就会检索并处理它。

  • 我很难让Spring Camel获得注册为Bean的HeaderFilterStrategy类,这样就可以通过Camel路线找到它。我试图注释HeaderFilterStrategy自定义类似乎是徒劳的。。。那么如何注册这个东西,以便在运行时找到它呢? 我有一个驼峰应用程序,其中一条路线使用定制的HeaderFilterStrategy 策略类看起来像: 我注册它与骆驼使用一个简单的注册表: 我在