如何默认启用Mule服务器通知?

时间:2015-05-04 16:31:06

标签: mule

在提供的服务器上运行Mule Studio的Mule应用程序时,我能够"听"默认情况下从实现接口EndpointMessageNotificationListener的类的服务器通知。

当我在群集中运行的独立环境(版本3.6.1)中部署相同的代码时,我无法检索相同的通知。默认情况下启用服务器通知需要什么?

我不想在每个应用中配置这个 - 但也许我们需要?默认情况下启动mule-servers以启用服务器通知时是否有配置? (这是在Mule Studio提供的Mule服务器上实现的?)

如果我们需要在每个应用中启用通知。怎么做到这一点?我试过了(其中com.company.EndpointListener是我实现EndpointMessageNotificationListener接口的类):

<spring:bean name="endpointListener" class="com.company.EndpointListener"/>

<notifications>
  <notification event="ENDPOINT-MESSAGE"/> 
  <notification-listener ref="endpointListener"/>
</notifications>

(如此处所述:http://www.mulesoft.org/documentation/display/current/Mule+Server+Notifications

但它什么都没做。我的班级在我们的独立环境中仍然没有收到任何通知。是否有指向它的工作?

2 个答案:

答案 0 :(得分:1)

好的,当我发现问题是什么时,这是一个相当模糊的修复。

未正确启动不同的通知侦听器,这阻碍了所有其他通知侦听器接收任何通知(这有点危险)。

其他通知侦听器问题是它尝试在初始化期间以这种方式读取属性文件(当部署到Mule Studio使用的服务器时可以正常工作):

MyClass.class.getClassLoader().getResourceAsStream("MyFile.file")

但我需要将其更改为:

Thread.currentThread().getContextClassLoader().getResourceAsStream("MyFile.file")

否则听众引起了异常:

org.mule.work.DefaultWorkListener: Work caused exception on 'workCompleted'. Work being executed was: org.mule.context.notification.ServerNotificationManager@5a66c9cf 

之后,根本没有通知监听器可以收到任何通知。

一旦我处理了这个案例,所有其他听众就开始毫无问题地收到通知。

答案 1 :(得分:0)

是一个错误: https://www.mulesoft.org/jira/browse/MULE-7183

我有同样的问题。好几天我无法工作:(

根据:

https://docs.mulesoft.com/mule-user-guide/v/3.7/mule-server-notifications#notification-interfaces

有多个通知界面:组件消息通知,端点消息通知,连接通知,自定义通知,ETC

这里有一些捕获组件和查询消息的方法:

  • 仅截取组件消息

这个解决方案和我一样。需要最小的努力和最小的配置。问题是它可以接收enpoint消息:(

import org.apache.log4j.Logger;
import org.mule.api.MuleEvent;
import org.mule.api.MuleMessage;
import org.mule.api.context.notification.MessageProcessorNotificationListener;
import org.mule.api.processor.MessageProcessor;
import org.mule.context.notification.MessageProcessorNotification;

public class ComponentMessageProcessor implements MessageProcessorNotificationListener<MessageProcessorNotification> {
private Logger log = Logger.getLogger(ComponentMessageProcessor.class);

@Override
public void onNotification(MessageProcessorNotification m) {
    MuleEvent ev = m.getSource();
    MuleMessage msg = ev.getMessage();
    Object payload = msg.getPayload();
    String ref = payload != null ? payload.toString() : "null";

    MessageProcessor proc = m.getProcessor();
    log.info(String.format("\n\n\n[%s][%s][%s][%s]\n\n\n", ev.getFlowConstruct().getName(),m.getProcessorPath(), proc.getClass().getSimpleName(),ref));

  }

}

在mule xml config中:

<spring:beans>
        <spring:bean name="componentMessageProcessor" class="com.mycompany.ComponentMessageProcessor"></spring:bean>
    </spring:beans>

或者在弹簧配置中:

<bean name="componentMessageProcessor" class="com.mycompany.componentMessageProcessor"></bean>

我尝试用以下方法捕获端点消息:

implements EndpointMessageNotificationListener<EndpointMessageNotification>{

instead of

implements MessageProcessorNotificationListener<MessageProcessorNotification> {

但是没有触发听众。

来源:Mule - Intercept all flows

  • 拦截Enpoint消息。

不干净且具有干扰性。

import org.mule.api.MuleEvent;
import org.mule.api.MuleException;
import org.mule.api.processor.MessageProcessor;

public class EndpointMessageProcesor  implements MessageProcessor{

    @Override
    public MuleEvent process(MuleEvent event) throws MuleException {
        System.out.println("\n\n\n\n\n"+event.getMessage().getPayload()+"\n\n\n\n");
        return event;
    }

}

在mule配置中:

<jms:inbound-endpoint queue="queue.req" ...>
            <custom-processor class="com.mycompany.EndpointMessageProcesor"></custom-processor>
        </jms:inbound-endpoint>

这也适用于出站端点。

我希望这有助于某人!