SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能

一、activeMQ使用

1、activeMQ安装

(1)、解压windows版本的ActiveMQ到非中文目录下

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第1张图片

(2)、启动

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第2张图片

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第3张图片

(3)、浏览器访问

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第4张图片

2、编写入门程序

(1)、创建java项目,导入jar包

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第5张图片

(2)、编写生产者代码

package cn.itcast.activemq.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息生产者
 * @author Administrator
 *
 */
public class JMSProducer {
	// 默认连接用户名
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	// 默认连接密码
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	// 默认连接地址
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
	// 发送的消息数量
	private static final int SENDNUM = 10;

	public static void main(String[] args) {
		// 连接工厂
		ConnectionFactory connectionFactory;
		// 连接
		Connection connection = null;
		// 会话 接受或者发送消息的线程
		Session session;
		// 消息的目的地
		Destination destination;
		// 消息生产者
		MessageProducer messageProducer;
		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,
				JMSProducer.BROKEURL);

		try {
			// 通过连接工厂获取连接
			connection = connectionFactory.createConnection();
			// 启动连接
			connection.start();
			// 创建session
			session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			// 创建一个名称为HelloWorld的消息队列
			destination = session.createQueue("HelloWorld");
			// 创建消息生产者
			messageProducer = session.createProducer(destination);
			// 发送消息
			sendMessage(session, messageProducer);

			session.commit();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (connection != null) {
				try {
					connection.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		}

	}

	/**
	 * 发送消息
	 * 
	 * @param session
	 * @param messageProducer
	 *            消息生产者
	 * @throws Exception
	 */
	public static void sendMessage(Session session, MessageProducer messageProducer) throws Exception {
		for (int i = 0; i < JMSProducer.SENDNUM; i++) {
			// 创建一条文本消息
			TextMessage message = session.createTextMessage("ActiveMQ 发送消息" + i);
			System.out.println("发送消息:Activemq 发送消息" + i);
			// 通过消息生产者发出消息
			messageProducer.send(message);
		}

	}
}

(3)、编写消费者代码

package cn.itcast.activemq.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 消息消费者
 * @author Administrator
 *
 */
public class JMSConsumer {
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默认连接用户名
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默认连接密码
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;// 默认连接地址

	public static void main(String[] args) {
		ConnectionFactory connectionFactory;// 连接工厂
		Connection connection = null;// 连接

		Session session;// 会话 接受或者发送消息的线程
		Destination destination;// 消息的目的地

		MessageConsumer messageConsumer;// 消息的消费者

		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD,
				JMSConsumer.BROKEURL);

		try {
			// 通过连接工厂获取连接
			connection = connectionFactory.createConnection();
			// 启动连接
			connection.start();
			// 创建session
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			// 创建一个连接HelloWorld的消息队列
			destination = session.createQueue("HelloWorld");
			// 创建消息消费者
			messageConsumer = session.createConsumer(destination);

			while (true) {
				TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
				if (textMessage != null) {
					System.out.println("收到的消息:" + textMessage.getText());
				} else {
					break;
				}
			}

		} catch (JMSException e) {
			e.printStackTrace();
		}

	}
}

(4)、直接启动提供者和消费者即可测试运行

(5)、编写消息监听器接收消息

package cn.itcast.activemq.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;

/**
 * 消息监听器测试类
 * @author Administrator
 *
 */
public class JMSConsumerListenerTest {
	@Test
	public void testConsumer() throws JMSException {
		ConnectionFactory connectionFactory;// 连接工厂
		Connection connection = null;// 连接

		Session session;// 会话 接受或者发送消息的线程
		Destination destination;// 消息的目的地

		MessageConsumer messageConsumer;// 消息的消费者

		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(BROKEURL);

		// 通过连接工厂获取连接
		connection = connectionFactory.createConnection();
		// 启动连接
		connection.start();
		// 创建session
		session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 创建一个连接HelloWorld的消息队列
		destination = session.createQueue("HelloWorld");
		// 创建消息消费者
		messageConsumer = session.createConsumer(destination);

		messageConsumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				try {
					System.out.println(((TextMessage) message).getText());
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		});

		while (true) {

		}
	}

	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默认连接用户名
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默认连接密码
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;// 默认连接地址

}

3、spring整合activeMQ

(1)、创建jar包方式的maven工程,导入pom.xml中的jar包坐标


	4.0.0
	com.itheima.maven
	activeMQ_spring
	0.0.1-SNAPSHOT

	
		
			junit
			junit
			4.12
		
		
			org.springframework
			spring-core
			4.1.7.RELEASE
		
		
			org.springframework
			spring-jms
			4.1.7.RELEASE
		
		
			org.apache.activemq
			activemq-all
			5.2.0
		
		
			org.springframework
			spring-test
			4.1.7.RELEASE
		
		  
            org.apache.xbean  
            xbean-spring  
            4.2  
         
	

(2)、编写生产者代码

queue方式

package cn.itcast.activemq.producer.queue;

import java.util.Map;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

/**
 * 
 * @description 队列消息生产者,发送消息到队列
 * 
 */
@Component("queueSender")
public class QueueSender {

	@Autowired
	@Qualifier("jmsQueueTemplate")
	private JmsTemplate jmsTemplate;// 通过@Qualifier修饰符来注入对应的bean

	/**
	 * 发送一条消息到指定的队列(目标)
	 * 
	 * @param queueName
	 *            队列名称
	 * @param message
	 *            消息内容
	 */
	public void send(String queueName, final String message) {
		jmsTemplate.send(queueName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(message);
			}
		});
	}

	public void send(String queueName, final Map map) {
		jmsTemplate.send(queueName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				MapMessage message = session.createMapMessage();
				for (String key : map.keySet()) {
					message.setString(key, map.get(key));
				}
				return message;
			}
		});
	}

}

topic方式

package cn.itcast.activemq.producer.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

/**
 * 
 * @description Topic生产者发送消息到Topic
 * 
 */

@Component("topicSender")
public class TopicSender {

	@Autowired
	@Qualifier("jmsTopicTemplate")
	private JmsTemplate jmsTemplate;

	/**
	 * 发送一条消息到指定的队列(目标)
	 * 
	 * @param queueName
	 *            队列名称
	 * @param message
	 *            消息内容
	 */
	public void send(String topicName, final String message) {
		jmsTemplate.send(topicName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createTextMessage(message);
			}
		});
	}

}

(3)、编写消费者代码

Queue方式:

package cn.itcast.activemq.consumer.queue;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**
 * 
 * @description 队列消息监听器
 * 
 */
@Component
public class QueueReceiver1 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("QueueReceiver1接收到消息:" + ((TextMessage) message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}

package cn.itcast.activemq.consumer.queue;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**
 * 
 * @description 队列消息监听器
 * 
 */
@Component
public class QueueReceiver2 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("QueueReceiver2接收到消息:" + ((TextMessage) message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

package cn.itcast.activemq.consumer.queue;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.springframework.stereotype.Component;

/**
 * 
 * @description 队列消息监听器
 * 
 */
@Component
public class QueueReceiver3 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("QueueReceiver3接收到消息:" + ((MapMessage) message).getString("company"));
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

Topic方式:

package cn.itcast.activemq.consumer.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**
 * 
 * @description Topic消息监听器
 * 
 */
@Component
public class TopicReceiver1 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("TopicReceiver1接收到消息:" + ((TextMessage) message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

package cn.itcast.activemq.consumer.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.springframework.stereotype.Component;

/**
 * 
 * @description Topic消息监听器
 * 
 */
@Component
public class TopicReceiver2 implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("TopicReceiver2接收到消息:" + ((TextMessage) message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

(4)、编写spring配置文件



	
	
	
	
	
    
    
    
        
    
	
	
    
      
    
          
        
        
        
        
        
    
    
     

    
    
          
        
        
        
    

    
    
           
        
        
        
    

    

    

    
    
        
        
    
    
    
        
    

    
    
        
        
    

    
    
    

(5)、编写测试类

package cn.itcast.activemq.test;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.itcast.activemq.producer.queue.QueueSender;
import cn.itcast.activemq.producer.topic.TopicSender;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-mq.xml")
public class ActiveMQTest {
	@Autowired
	private QueueSender queueSender;

	@Autowired
	private TopicSender topicSender;

	@Test
	public void testMQ() {

		queueSender.send("test.queue", "Hello,Queue");
		topicSender.send("test.topic", "Hello,Topic");
		Map map = new HashMap<>();
		map.put("company", "传智播客");
		queueSender.send("test.map", map);

		while (true) {
			// 持续执行 ,让监听器 有时间接收信息
		}
	}
}

二、重构客户注册功能,发短信功能分离

1、在common-parent项目中导入activeMQ相关jar包坐标

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第6张图片

2、在bos_fore的spring配置文件中配置activeMQ的相关模版配置

	
	
    
    
    
    
    	
    	
    	
    
	

    
      
    
          
        
        
        
        
        
    
    
     

    
    
          
        
        
        
    
	

3、在CustomerAction中注入模版对象,并编写代码

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第7张图片

三、开发消费者项目 -- 继承common-parent的war项目

1、创建mavne project

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第8张图片

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第9张图片

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第10张图片

2、在web.xml中配置spring监听器



	bos_sms
	
		index.html
		index.htm
		index.jsp
		default.html
		default.htm
		default.jsp
	
	
	
		org.springframework.web.context.ContextLoaderListener
	
	
		contextConfigLocation
		classpath:applicationContext.xml
	

3、编写spring核心配置文件,配置activeMQ工厂



	
	
	
    
    
    
    	
    	
    	
    
	

    
      
    
          
        
        
        
        
        
    
    

4、开发一个监听器类,监听消息队列中的消息

package com.itheima.consumer;

import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;

/**
 * 消息监听类
 * @author Administrator
 *
 */
public class MsgConsumer implements MessageListener {

	//当监听到消息之后,onMessage方法会自动执行
	public void onMessage(Message message) {
		MapMessage mapMessage = (MapMessage) message;
		//从消息对象中获取数据
		try {
			String telephone = mapMessage.getString("telephone");
			String msg = mapMessage.getString("msg");
			System.out.println("成功的接收到了提供者发送的消息:" + telephone + "  :  " +msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

5、在spring配置文件中注册监听器

	
	
	
		
		
	

四、JQuery easyUI datagrid 行编辑功能使用方式

1、行编辑功能列属性的API


SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第11张图片






2、html代码





Insert title here








	

五、使用datagrid的行编辑功能实现运单快速录入功能

1、完善waybill_quick.html中结束编辑时触发的事件

SSH综合项目实战(快递) -- day10 activeMQ、JQueryEasyUI行编辑功能_第12张图片

2、编写Action代码

package com.itheima.bos.web.action.take_delivery;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.itheima.bos.domain.take_delivery.WayBill;
import com.itheima.bos.service.take_delivery.WayBillService;
import com.itheima.bos.web.action.common.CommonAction;

/**
 * 工单动作类
 * @author Administrator
 *
 */
@Controller
@Namespace("/")
@ParentPackage("struts-default")
@Scope("prototype")
public class WayBillAction extends CommonAction {

	@Autowired
	private WayBillService service;
	
	@Action(value="waybillAction_save")
	public String save() throws Exception{
		String flag = "1";
		try {
			service.save(model);
		} catch (Exception e) {
			e.printStackTrace();
			flag = "0";
		}
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print(flag);
		return NONE;
	}
}

3、编写Service层代码

package com.itheima.bos.service.take_delivery.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itheima.bos.dao.take_delivery.WayBillDao;
import com.itheima.bos.domain.take_delivery.WayBill;
import com.itheima.bos.service.take_delivery.WayBillService;

@Service
@Transactional
public class WayBillServiceImpl implements WayBillService {

	@Autowired
	private WayBillDao dao;
	public void save(WayBill model) {
		dao.save(model);
	}

}

4、编写Dao层代码

package com.itheima.bos.dao.take_delivery;

import org.springframework.data.jpa.repository.JpaRepository;

import com.itheima.bos.domain.take_delivery.WayBill;

public interface WayBillDao extends JpaRepository {

}


你可能感兴趣的:(ssh项目实战)