Mule 在变压器中使用 JMS 连接器

Posted

技术标签:

【中文标题】Mule 在变压器中使用 JMS 连接器【英文标题】:Mule using JMS Connector in transformer 【发布时间】:2013-08-22 22:10:24 【问题描述】:

我正在编写一个转换器,除其他外,它需要根据 ActiveMQ 中的给定队列中是否有待处理的消息来设置消息上的一些内容。

有没有办法将 jms:activemq-connector 传递到转换器代码中并在 transformMessage() 方法中对其进行调用以获取队列计数?

编辑:

我找到了一种使用 MuleContext 访问连接器的方法,但我没有看到我期望的结果;队列总是看起来是空的。我加载了队列,然后运行了一个调用转换器的流。在那个变压器的开始,我有以下内容:

public Object transformMessage( MuleMessage message, String outputEncoding )
        throws TransformerException

    MuleContext context = message.getMuleContext();
    MuleRegistry registry = context.getRegistry();
    JmsConnector connector = (JmsConnector)registry.lookupConnector( "AMQConnector" );

    try
    
        Session session = connector.getSession( false, false );
        Queue queue = session.createQueue( "MyQueue" );
        QueueBrowser browser = session.createBrowser( queue );
        Enumeration enumeration = browser.getEnumeration();
        boolean hasMessages = enumeration.hasMoreElements();
        System.out.println( "Value is: " + hasMessages );
    
    catch ( Exception e )
    
    
....

我看到了预期的消息数量...即,如果我从队列中的 8 条消息开始,我会看到该消息 8 次。但是,hasMessages 的值始终为 false。

我想我的问题已经变成了“如何从 Mule 转换器中获取队列计数?”

【问题讨论】:

【参考方案1】:

Mule 对队列浏览没有任何 OOTB 支持,因此您的方法是正确的。

您是否有一个活动的入站端点正在消耗您在转换器中浏览的队列?如果是,也许您得到false for hasMessages 仅仅是因为ActiveMQ 客户端已经预取了所有消息,所以队列浏览器看不到任何消息。

【讨论】:

谢谢大卫。有一个消费者,虽然它是单线程的而且相当慢。我没有意识到 ActiveMQ 的预取会使消息对队列浏览器不可见。既然您说该方法是正确的,我将花费一些测试来禁用消费者并看看我所看到的。谢谢。

以上是关于Mule 在变压器中使用 JMS 连接器的主要内容,如果未能解决你的问题,请参考以下文章

Mule 2.2.6 - 处理 JMS 连接丢失的策略

从 mule 中的队列/主题中读取消息

基础知识环形变压器基础知识及问答

Mule 请求者正在使用 JMS 队列中的所有消息

具有接收器线程配置文件配置的 Mule ActiveMQ JMS 组件不起作用

整流变压器电流波形