項目要用到總線技術,今天研究了一下Spring編程的方法整合activeMQ: web
一、注入鏈接工廠: spring
@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory(){
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(this.mqURL);
return activeMQConnectionFactory;
}
注意此處的ActiveMQConnectionFactory是org.apache.activemq.spring包中的,而不是org.apache.activemq包中的類。 apache
mqURL從外部配置文件中注入,形式如tcp://192.168.1.1:61616 編程
二、注入消息目的地 tcp
@Bean
Topic alarmMessageTopic(){
Topic topic = () -> DeviceAlarmMessage.alarm_topic;
return topic;
} 函數
此處我用的是訂閱發佈的模式,若是用點對點隊列模式能夠建立Queue。我用的J2EE的topic接口,用lambda表達式給接口的函數賦值,也能夠用activeMQ的ActiveMQTopic和ActiveMQQueue。 this
三、注入JMS模板
spa
@Bean
JmsTemplate alarmJmsTemplate(){
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(this.activeMQConnectionFactory());
jmsTemplate.setDefaultDestination(this.alarmMessageTopic());
return jmsTemplate;
}
.net
指定了鏈接工廠和topic。下面會看到收消息用消息驅動POJO,因此JmsTemplate應該主要用於發消息,我如今的系統無發消息的需求,因此能夠不注入JmsTemplate。 對象
四、建立消息驅動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接口的類。
五、上述已經配置完成。但啓動web應用後,收消息的時候會報禁止序列化類DeviceAlarmMessage的錯誤。在Spring啓動配置類(實現了WebApplicationInitializer接口的類)中加入屬性:
System.setProperty("org.apache.activemq.SERIALIZABLE_PACKAGES", "com.sfauto.site.entities");
該屬性表示能夠序列化類的包。
若是不直接發送對象,即不用序列化,應不用加入此屬性。