Spring整合activeMQ

jopen 8年前發布 | 23K 次閱讀 ActiveMQ 消息系統

項目要用到總線技術,今天研究了一下Spring編程的方法整合activeMQ:

1、注入連接工廠:

@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory(){
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
    activeMQConnectionFactory.setBrokerURL(this.mqURL);
    return activeMQConnectionFactory;
}
注意此處的ActiveMQConnectionFactory是org.apache.activemq.spring包中的,而不是org.apache.activemq包中的類。

mqURL從外部配置文件中注入,形式如tcp://192.168.1.1:61616

2、注入消息目的地

@Bean
Topic alarmMessageTopic(){
    Topic topic = () -> DeviceAlarmMessage.alarm_topic;
    return topic;
}

此處我用的是訂閱發布的模式,如果用點對點隊列模式可以創建Queue。我用的J2EE的topic接口,用lambda表達式給接口的函數賦值,也可以用activeMQ的ActiveMQTopic和ActiveMQQueue。


3、注入JMS模板

@Bean
JmsTemplate alarmJmsTemplate(){
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(this.activeMQConnectionFactory());
    jmsTemplate.setDefaultDestination(this.alarmMessageTopic());
    return jmsTemplate;
}

指定了連接工廠和topic。下面會看到收消息用消息驅動POJO,所以JmsTemplate應該主要用于發消息,我現在的系統無發消息的需求,所以可以不注入JmsTemplate。

4、創建消息驅動POJO機制

4.1 首先創建并注入消息處理類:

public class DeviceAlarmHandler {
    public void processDeviceAlarm(DeviceAlarmMessage alarmMessage){
        System.out.println(alarmMessage.toString());
    }
}

這個類包含了一個方法,處理收到的DeviceAlarmMessage 對象。

@Bean
public DeviceAlarmHandler deviceAlarmHandler(){
    return new DeviceAlarmHandler();
}

4.2 注入MessageListenerAdapter

@Bean
public MessageListenerAdapter alarmMessageListener(){
    MessageListenerAdapter listener = new MessageListenerAdapter(this.deviceAlarmHandler());
    listener.setDefaultListenerMethod("processDeviceAlarm");
    return listener;
}
指定了消息處理類和消息處理方法

4.3 注入DefaultMessageListenerContainer

@Bean
public DefaultMessageListenerContainer alarmMessageListenerContainer(){
    DefaultMessageListenerContainer listenerContainer = new DefaultMessageListenerContainer();
    listenerContainer.setConnectionFactory(this.activeMQConnectionFactory());
    listenerContainer.setMessageListener(this.alarmMessageListener());
    listenerContainer.setDestination(this.alarmMessageTopic());
    return listenerContainer;
}
指定連接工廠、messageListenerAdapter和topic。

注:此處也可以不用Spring消息驅動POJO的機制,改用實現MessageListener接口的類。

5、上述已經配置完成。但啟動web應用后,收消息的時候會報禁止序列化類DeviceAlarmMessage的錯誤。在Spring啟動配置類(實現了WebApplicationInitializer接口的類)中加入屬性:

System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES", "com.sfauto.site.entities");

該屬性表示可以序列化類的包。

如果不直接發送對象,即不用序列化,應不用加入此屬性。

來自: http://my.oschina.net/u/2453016/blog/596940

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!