springMVC下集成active MQ發送郵件


環境:本地需安裝activemq,且訪問正常,安裝方法網上很多,這里省略。

1.添加相關jar包,我這里使用的是maven,你也可以選擇其他方式添加。下面是maven相關配置:

 <!--  ActiveMQ JMS 相關jar begin -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
            <version>5.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>5.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-j2ee-management_1.1_spec</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jms_1.1_spec</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.1.5.RELEASE</version>
        </dependency>


        <!--  ActiveMQ JMS 相關jar end -->

2.編寫發送和接收處理類

public class MyMessageConverter implements MessageConverter {  
   
    public Message toMessage(Object object, Session session)  
            throws JMSException, MessageConversionException {  
        return session.createObjectMessage((Serializable) object);  
    }  
   
    public Object fromMessage(Message message) throws JMSException,  
            MessageConversionException {  
        ObjectMessage objMessage = (ObjectMessage) message;  
        return objMessage.getObject();  
    }  

3.編寫發送實現類,接口類這里就不貼了。

public class ProducerServiceImpl implements ProducerService {
 
    private JmsTemplate jmsTemplate;
    
    protected final Logger logger = Logger.getLogger(getClass());
    
    public void sendMessage(final Serializable obj) {
        logger.debug("---------------生產者向MQ發送消息-----------------");
        jmsTemplate.convertAndSend(obj);
    } 

    public JmsTemplate getJmsTemplate() {
        return jmsTemplate;
    } 

    @Resource
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

4.編寫監聽類

public class MyMessageListener implements MessageListener {  
    
    @Autowired
    private  MyMessageConverter messageConverter;  
    
    protected final Logger logger = Logger.getLogger(getClass());
    
    public void onMessage(Message message) {  
        if (message instanceof ObjectMessage) {  
            ObjectMessage objMessage = (ObjectMessage) message;  
            try {  
                Mail mail = (Mail) messageConverter.fromMessage(objMessage);  
                logger.debug("接收到一個ObjectMessage,包含Email對象,准備發送郵件!");
                new MailUtil().send(mail);
            } catch (JMSException e) {  
                logger.info("接收到一個ObjectMessage,但處理失敗!");
            }  
        }  
    }  

5.配置XML

<context:component-scan base-package="com.guesslive" />  
    <!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 -->  
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 -->  
        <property name="connectionFactory" ref="connectionFactory"/>  
        <!-- 消息轉換器 -->  
        <property name="messageConverter" ref="emailMessageConverter"/>  
        <property name="defaultDestination" ref="queueDestination" />   
        <property name="explicitQosEnabled" value="true" /> <!-- deliveryMode, priority, timeToLive 的開關,要生效,必須配置為true,默認false-->  
        <property name="deliveryMode" value="2" /> <!-- 發送模式  DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久 默認2-持久-->  
    </bean>  
    <!-- 類型轉換器 -->  
    <bean id="emailMessageConverter" class="com.guesslive.admin.common.mq.MyMessageConverter"/>  
  
    <!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供-->  
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
        <property name="brokerURL" value="tcp://127.0.0.1:61616"/>
        <property name="userName" value="admin"/> 
        <property name="password" value="admin"/> 
        <property name="useAsyncSend" value="true" />  
        <!-- 如果傳輸的對象是Obeject 這里必須加上這句  否則會導致對象序列化失敗 出現classnotfound異常  詳細: http://activemq.apache.org/objectmessage.html -->
        <property name="trustAllPackages" value="true"/>
    </bean>  
      
    <!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->  
    <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
        <!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->  
        <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
    </bean>  
    <!--隊列目的地-->  
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
        <constructor-arg>  
            <value>email</value>  
        </constructor-arg>  
    </bean>  
    <!-- 消息監聽器 -->  
    <bean id="consumerMessageListener" class="com.guesslive.admin.common.mq.MyMessageListener"/>  
    <!-- 消息監聽容器 -->  
    <bean id="jmsContainer"  
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
        <property name="connectionFactory" ref="connectionFactory" />  
        <property name="destination" ref="queueDestination" />  
        <property name="messageListener" ref="consumerMessageListener" />  
    </bean>

6.發送和接收

//調用向MQ推送消息的方法
producerService.sendMessage(mail);

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM