如何在FUSE中监听AMQ代理

时间:2016-08-16 19:53:14

标签: activemq jbossfuse

我想添加一个功能,它利用JBoss FUSE中内置的AMQ,并将启动容器 - 即,将添加到启动功能,启动级别< = 100。

此功能将立即尝试通过AMQ发送一些消息,因此我希望为“监听”添加逻辑或者只是等待代理启动事件。

我目前唯一的句柄是记录的消息,如:

... | ActiveMQServiceFactory           | 196 - io.fabric8.mq.mq-fabric
      - 1.2.0.redhat-143 | Broker amq has started.

在我的功能文件中,我尝试创建了一些功能依赖项,例如:

<feature name="myFeature" ...
    <feature version="1.2.0.redhat-133">mq-fabric</feature>
    <feature version="5.11.0.redhat-620133">activemq</feature>

......但那没用。我也尝试将起始等级设置为90年代的某些东西,但这也不起作用。

我是否只是错过了这些方法中的某些内容?

我可以在我的蓝图中注入相关的OSGi服务吗? - 也就是说,可能有一个.isBrokerStarted()方法?

我最近的想法是,也许我可以为一条咨询消息注册一个回调...如果有效,我会发布这个答案。

不幸的是,我不再相信尝试连接和倾听咨询主题是一种可行的方法。我已经部署了这个功能。如果在上面的“代理启动”日志消息之后安装它,它可以正常工作,但否则失败。

问题似乎是因为蓝图上下文初始化发生在AMQ异步启动时,任何结果连接都是无效的。我原以为AMQ连接工厂或Camel组件会不透明地提供一些保证来防止这种情况。显然事实并非如此。调查他们的API(具体来说,org.apache.activemq.ActiveMQSslConnectionFactory和org.apache.camel.component.jms.JmsConfiguration),我找不到状态检查的公共方法......只能设置“testConnectionOnStartup” Camel组件的属性。据推测,这可能会记录在案,并抛出1+例外,但事实并非如此。非常混乱。

2016年8月24日更新:

终于有了更多的时间来处理这个问题,并尝试了几件事...... 我对camel-amq设置了一个功能依赖,因为它位于功能依赖链的“顶部”:

camel-amq - &gt;取决于mq-fabric - &gt;取决于activemq - &gt;取决于activemq-client

这不起作用。在对伐木进行了一些调整之后,我相信我已经证实了我在上面的暗示。起始级别和功能依赖性无法解决此问题。较低启动级别的所有依赖功能或捆绑包将在amq代理实际准备好之前报告已安装/已启动(并记录上述消息)。

因此,我的功能将安装,启动和失败 - 除非我能找到一种方法来完成帖子标题的建议:'听AMQ经纪人开始'。有谁知道这样做的方法?

2016年8月25日更新:

我看到ActiveMQServiceFactory(记录代理启动消息)本身在其上下文本地的org.apache.activemq.broker.BrokerService实例上有句柄。如果这也是作为OSGi服务提供的,那么我认为我可以等待“broker.waitUntilStarted();”然后以编程方式创建我的JMS连接。当我有时间尝试这个时会报告...

1 个答案:

答案 0 :(得分:0)

首先,我无法找到ActiveMQServiceFactory上的可用句柄...它是通过org.osgi.service.cm.ManagedServiceFactory界面提供的,但也以某种方式代理,因此它不能被投射到ActiveMQServiceFactory: - /

因此,我最终创建了一个功能,该功能通过代理的最慢启动连接器(在我的情况下为ssl连接器)以编程方式创建连接/会话/临时队列的连续循环,然后删除/关闭所有。之后,此功能以编程方式安装我的其他功能。

这很有效。

基本上:

// ... setup amq conn factory
while (true) {
  Thread.sleep(5000L);
  try { 
    amqConnFactory.createConnection()
                  .start()
                  .createSession(fals‌​e, Session.AUTO_ACKNOWLEDGE)
                  .createTemporaryQueue();
    break;
  } catch (Exception e) {
    // debug log 'not up yet'
  }
}