Apache Camel:从消息正文中提取队列名称

Apache Camel : extract to-queue name from message body

我有一个要求,我必须向 Microsoft Teams 发送消息。 我正在尝试从我从队列收到的消息中提取“到”频道名称信息,并根据频道名称从属性文件中读取它的 url 并发送消息。下面是代码。

    RouteDefinition from = from("jms:queue:teamsq?connectionFactory=artemis");
    from.setHeader("Exchange.CONTENT_TYPE", constant("application/json"));
    final StringBuffer channelName = new StringBuffer();
    from.process(exchange -> {
        String[] dataArray = exchange.getIn().getBody(String.class).split(",", 2);
        channelName.append(dataArray[0]);
        exchange.getIn().setBody("{\"text\" : \"" + dataArray[1].trim() + "\"}");
    })
    .log("Body is : " + channelName + " : ${body}");

记录正文时,channelName 的值为空。

任何帮助我如何在此 process() 方法之外获取 channelName 的值?

从队列收到的消息是

channel1, This is test a message 5

提前致谢。

您可以设置消息header或交换属性。两者都是在路由处理期间使用的消息变量。

.setHeader("channelName", channelName.toString())
.setProperty("channelName", channelName.toString())

主要区别在于 Exchange 属性位于 Camel Exchange 上,而消息 header 是消息本身的一部分。

Camel Exchange 是消息的 Camel 包装器。它在消息进入路由时创建,在路由结束时被丢弃。

交换属性:

  • 仅在 Camel 路由处理期间可用
  • 从未发送到其他系统
  • 只有in-memory

留言header秒:

  • 每当路由路由到另一个系统时,都会为目标系统转换为消息 headers
  • 因此发送到其他系统
  • 发送到另一个系统时被序列化

如果您从 Camel 路由向 JMS queue 发送消息并从另一个路由使用它,则 Exchange 属性不再可用,而消息 header 仍然存在。

但是,如果您路由到 直接端点(Camel in-memory 端点),整个 Exchange 将被转移并且 Exchange 属性仍然可用.