spring集成activemq

 

一、安装并启动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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值