一、安装并启动activemq |
二、activemq的jar包如下: maven配置文件pox.xml <!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>${activemq.version}</version>
<!-- <exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions> -->
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-web</artifactId>
<version>${activemq.version}</version>
<!-- <exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions> -->
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>${activemq.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-xmpp</artifactId>
<version>${activemq.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- activemq --> |
三、spring配置activemq 1.spring-activemq.xml <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-autowire="byName" default-lazy-init="true">
<!-- Publisher 生产者-->
<bean id="resourceTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="ResourceMessageTopic"/> <!-- TODO key 主题 自己定义-->
</bean>
<bean id="topicPublisherConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp\://127.0.0.1\:61616?wireFormat.maxInactivityDuration\=0&wireFormat.maxInactivityDurationInitalDelay\=30000&jms.redeliveryPolicy.maximumRedeliveries\=3" />
<property name="useAsyncSend" value="true" />
<property name="userName" value="admin" /> <!-- 默认admin-->
<property name="password" value="admin" /> <!-- 默认admin-->
</bean>
<bean id="topicPublisherConnectionFactoryPool" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory" ref="topicPublisherConnectionFactory"/>
</bean>
<bean id="jmsPublishTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="topicPublisherConnectionFactoryPool" />
<property name="messageConverter" ref="resourceMessageConverter" />
<property name="pubSubDomain" value="true"/> <!-- true订阅模式、false队列-->
<property name="explicitQosEnabled" value="true" />
<property name="sessionTransacted" value="true"/>
<property name="receiveTimeout" value="10000"/>
<property name="deliveryMode" value="2"/>
</bean>
<bean id="topicPublisher" class="com.ailk.vpnms.resource.message.service.impl.PublisherServiceImpl">
<property name="jmsTemplate" ref="jmsPublishTemplate" />
<property name="topic" ref="resourceTopic" />
</bean>
<bean id="resourceMessageConverter" class="com.resource.message.utils.ResourceMessageConverter" /> <!-- 自定义发送接收格式-->
<!-- Subscriber -->
<!-- one 消费者1-->
<bean id="ClientID1" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="clientID" value="ClientID1" /> <!-- TODO -->
<property name="brokerURL" value="${activemq.brokerURL}" />
<property name="userName" value="${activemq.username}" />
<property name="password" value="${activemq.password}" />
</bean>
</property>
<property name="maxConnections" value="1" />
</bean>
<bean id="topicListenerAdapter1" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg ref="rcSubscriberServiceImpl" /> <!-- 消费类 -->
<property name="defaultListenerMethod" value="handleMessage" /> <!-- 方法 -->
<property name="messageConverter" ref="resourceMessageConverter" /> <!--消息转换类 -->
</bean>
<bean id="topicListenerContainer1" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="ClientID1" />
<property name="pubSubDomain" value="true"/>
<property name="concurrentConsumers" value="1"/>
<property name="maxConcurrentConsumers" value="1"/>
<property name="receiveTimeout" value="10000"/>
<property name="subscriptionDurable" value="true"/>
<property name="clientId" value="ClientID1"/> <!-- TODO -->
<property name="durableSubscriptionName" value="ClientID1"/> <!-- TODO -->
<property name="cacheLevel" value="0"/>
<property name="autoStartup" value="true" />
<property name="messageSelector" value="messageType=1 OR messageType=2" /> <!-- TODO -->
<property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE"/>
<property name="destination" ref="resourceTopic" />
<property name="messageListener" ref="topicListenerAdapter1" />
</bean>
<!-- two 消费者2-->
<bean id="ClientID2" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="clientID" value="ClientID2" /> <!-- TODO -->
<property name="brokerURL" value="${activemq.brokerURL}" />
<property name="userName" value="${activemq.username}" />
<property name="password" value="${activemq.password}" />
</bean>
</property>
<property name="maxConnections" value="1" />
</bean>
<bean id="topicListenerAdapter2" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg ref="vpnStatSubscriberServiceImpl" /> <!-- 消费类 -->
<property name="defaultListenerMethod" value="handleMessage" /> <!-- 方法 -->
<property name="messageConverter" ref="resourceMessageConverter" /> <!--消息转换类 -->
</bean>
<bean id="topicListenerContainer2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="ClientID2" />
<property name="pubSubDomain" value="true"/>
<property name="concurrentConsumers" value="1"/>
<property name="maxConcurrentConsumers" value="1"/>
<property name="receiveTimeout" value="10000"/>
<property name="subscriptionDurable" value="true"/>
<property name="clientId" value="ClientID2"/> <!-- TODO -->
<property name="durableSubscriptionName" value="ClientID2"/> <!-- TODO -->
<property name="cacheLevel" value="0"/>
<property name="autoStartup" value="true" />
<property name="messageSelector" value="messageType=0 OR messageType=5" /> <!-- TODO -->
<property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE"/>
<property name="destination" ref="resourceTopic" />
<property name="messageListener" ref="topicListenerAdapter2" />
</bean> |
四、ResourceMessageConverter 自定义消息转换类 public class ResourceMessageConverter implements MessageConverter
{
/**
* 把MQ消息转化为自定义消息(接收)
*/
public Object fromMessage(Message message) throws JMSException, MessageConversionException
{
ActiveMQObjectMessage mqMessage = (ActiveMQObjectMessage) message ;
ResourceMessage rm = new ResourceMessage(MessageType.toMessageType(mqMessage.getIntProperty("messageType")),
AlertType.toAlertType(mqMessage.getIntProperty("alertType"))) ;
rm.setDeviceChineseNames(ReciprocalStringList.stringToList(mqMessage.getStringProperty("deviceChineseNames"),String.class));
rm.setDeviceIds(ReciprocalStringList.stringToList(mqMessage.getStringProperty("deviceIds"),Long.class));
rm.setDeviceTypes(ReciprocalStringList.stringToList(mqMessage.getStringProperty("deviceTypes"),DeviceType.class));
rm.setVpnChineseNames(ReciprocalStringList.stringToList(mqMessage.getStringProperty("vpnChineseNames"),String.class));
rm.setProvinceChineseNames(ReciprocalStringList.stringToList(mqMessage.getStringProperty("provinceChineseNames"),String.class));
rm.setVpnIds(ReciprocalStringList.stringToList(mqMessage.getStringProperty("vpnIds"),Long.class));
rm.setServiceIds(ReciprocalStringList.stringToList(mqMessage.getStringProperty("serviceIds"),Long.class));
return rm;
}
/**
* 把自定义消息转化为MQ消息(发送)
*/
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException
{
ActiveMQObjectMessage mqMessage = (ActiveMQObjectMessage) session.createObjectMessage();
ResourceMessage message = (ResourceMessage) object ;
mqMessage.setIntProperty("messageType", message.getMessageType().getValue());
mqMessage.setIntProperty("alertType", message.getAlertType().getValue());
mqMessage.setBooleanProperty("deviceIdsStatus", message.isDeviceIdsStatus());
mqMessage.setBooleanProperty("deviceChineseNamesStatus", message.isDeviceChineseNamesStatus());
mqMessage.setBooleanProperty("vpnChineseNamesStatus", message.isVpnChineseNamesStatus());
mqMessage.setBooleanProperty("provinceChineseNamesStatus", message.isProvinceChineseNamesStatus());
mqMessage.setBooleanProperty("deviceTypesStatus", message.isDeviceTypesStatus());
mqMessage.setBooleanProperty("vpnIdsStatus", message.isVpnIdsStatus());
mqMessage.setBooleanProperty("serviceIdsStatus", message.isServiceIdsStatus());
if(message.isDeviceChineseNamesStatus()){
mqMessage.setStringProperty("deviceChineseNames", ReciprocalStringList.listToString(message.getDeviceChineseNames()));
}
if(message.isDeviceIdsStatus()){
mqMessage.setStringProperty("deviceIds", ReciprocalStringList.listToString(message.getDeviceIds()));
}
if(message.isVpnIdsStatus()){
mqMessage.setStringProperty("vpnIds", ReciprocalStringList.listToString(message.getVpnIds()));
}
if(message.isVpnChineseNamesStatus()){
mqMessage.setStringProperty("vpnChineseNames", ReciprocalStringList.listToString(message.getVpnChineseNames()));
}
if(message.isProvinceChineseNamesStatus()){
mqMessage.setStringProperty("provinceChineseNames", ReciprocalStringList.listToString(message.getProvinceChineseNames()));
}
if(message.isDeviceTypesStatus()){
mqMessage.setStringProperty("deviceTypes", ReciprocalStringList.listToString(message.getDeviceTypes()));
}
if(message.isServiceIdsStatus()){
mqMessage.setStringProperty("serviceIds", ReciprocalStringList.listToString(message.getServiceIds()));
}
return mqMessage ;
}
} |
五、消息类 public class ResourceMessage implements Serializable {
@Override
public String toString() {
return "MessageType :" + messageType.getValue() + ",AlertType :" + alertType.getValue() +"\n"
+ "provinceChineseNames :" + ReciprocalStringList.listToString(provinceChineseNames) +"\n"
+ "deviceTypes :" + ReciprocalStringList.listToString(deviceTypes) +"\n"
+ "deviceIds :" + ReciprocalStringList.listToString(deviceIds) +"\n"
;
}
private final MessageType messageType ;// 消息类型
private final AlertType alertType ;//变更类型
private boolean deviceIdsStatus ;//是否有设备ID集合
private List<Long> deviceIds ;//设备ID集合
get 、、set 方法
}
} |
六、 生产者 public void sendImmediately(ResourceMessage resourceMessage) {
try{
logger.info(resourceMessage) ;
jmsTemplate.convertAndSend(topic, resourceMessage) ;
logger.info("send message successed! ") ;
}catch(Exception e){
logger.error("send message failed : ", e) ;
}
} |
七、消费者 public interface ISubscriberService {
/**
* 处理消息
* @param MessageType
*/
void handleMessage(ResourceMessage resourceMessage) ;
} public class VpnStatSubscriberServiceImpl implements ISubscriberService {
private Logger logger = Logger.getLogger(this.getClass());
@Autowired
private IVpnStatService vpnStatService ;
/* (non-Javadoc)
* @see com.asiainfo.message.service.ISubscriberService#handleMessage(com.asiainfo.message.bo.MessageType)
*/
public void handleMessage(ResourceMessage message) {
logger.info("收到消息资源统计~~~~~~");
try{
MessageType mtype = message.getMessageType();
AlertType atype = message.getAlertType();
return ;
}
}catch(Exception e){
logger.error("资源统计出现异常!", e) ;
}
}
}
|
转载于:https://my.oschina.net/zxj143/blog/1550064