2015-05-04 99 views
0

當在提供的服務器上從Mule Studio運行Mule App時,我可以從實現接口EndpointMessageNotificationListener的類默認「監聽」服務器通知。默認情況下如何啓用Mule服務器通知?

當我在集羣中運行的獨立環境(版本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

但不起任何作用。我們的班級在我們的獨立環境中仍然沒有收到任何通知。任何指向它的工作?

回答

1

好吧,當我發現問題是什麼時,結果是一個相當模糊的修復。

一個不同的通知偵聽器沒有正確啓動,這阻礙了所有其他通知偵聽器接收到任何通知(這有點危險)。

的其他通知聽衆的問題是,它試圖讀取初始化過程中這樣一個屬性文件(在部署到由騾子工作室使用的服務器,其工作原理):

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: [email protected] 

之後,沒有任何通知偵聽器可以收到任何通知。

只要我處理這種情況,所有其他聽衆開始接收通知沒有問題。

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)); 

    } 

} 

而且在騾子的XML配置:

在spring配置
<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; 
    } 

} 

而且在騾子的配置:

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

這工作在出站端點也。

我希望這可以幫助別人!

0

爲訪問者嘗試實現相同結果的小提示。 首先,你應該根據你想被通知按下面的例子是什麼實現的Java類:

package stackoverflow.mule.notifications 

. . . 

public class MyEndpointNotificationListener implements EndpointMessageNotificationListener<EndpointMessageNotification> { 

    @Override 
    public void onNotification(EndpointMessageNotification notification) {   

     // Whatever you have to do when notified goes here. 
    } 
} 

然後是你的騾配置。首先您註冊通知監聽器的Spring bean:

<spring:beans> 
    <spring:bean name="MyEndpointNotificationListener" 
       class="stackoverflow.mule.notifications.MyEndpointNotificationListener" 
       id="MyEndpointNotificationListener" /> 
</spring:beans> 

僅低於它,你必須註冊爲下面的通知:

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

而且你去那裏。現在應該工作。這已被用於Mule ESB 3.8(CE或EE)。

乾杯!