项目一 14 消息中间件ActiceMQ JMS消息服务 Spring整合JMS 发送邮件

本文详细介绍消息中间件如ActiveMQ、RabbitMQ的应用场景、安装配置及与Spring的整合开发,涵盖定时任务、PDF报表生成,并探讨了邮件发送机制与实现。

回顾

  • 定时任务( 1.jobdetail, 2.触发器,3.调度容器,4.cron表达式)
  • pdf报表(1.设计阶段 : 模板制作,2.数据填充,3.下载展示)

1 特殊模板(了解)

##1.1 分组报表

分组报表:通过列表中的一个属性,对数据进行分组打印
要达到的效果如下图所示:
在这里插入图片描述
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
(4)
在这里插入图片描述
(5)
在这里插入图片描述
(6)
在这里插入图片描述
<7>
在这里插入图片描述
<8>
在这里插入图片描述
测试分组报表相关代码:

	/**
	 * 测试:分组报表
	 */
	@RequestMapping("/exportPdf5")
	public void exportPdf5(String id) throws Exception {
		//配置模板路劲
		String path = session.getServletContext().getRealPath("/")+"/jasper/test04.jasper";
		//创建JapserPrint对象
		List<ItcastUser> list = new ArrayList<>();
		for(int i=0;i<5;i++) {
			ItcastUser user = new ItcastUser();
			user.setUsername("传智用户"+i);
			user.setAge(10 + i);
			user.setCompanyName("传智播客");
			list.add(user);
		}
		for(int i=0;i<5;i++) {
			ItcastUser user = new ItcastUser();
			user.setUsername("皮革厂用户"+i);
			user.setAge(10 + i);
			user.setCompanyName("江南皮革厂");
			list.add(user);
		}


		JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
		JasperPrint jp = JasperFillManager.fillReport(path,new HashMap<>(),dataSource);
		//输出
		JasperExportManager.exportReportToPdfStream(jp,response.getOutputStream());
	}

1.2 chart图形报表

<1>
在这里插入图片描述
<2>
在这里插入图片描述
<3>
在这里插入图片描述
(4)在这里插入图片描述
<5>
测试chart图形报表

	/**
	 * 实现报运单的pdf生成
	 *      报运单对象
	 *      报运单的所有商品
	 *      参数 : 报运单id
	 */
	@RequestMapping("/exportPdf4")
	public void exportPdf4(String id) throws Exception {
		//1.根据id查询报运单
		Export export = exportService.findById(id);
		//2.根据报运单id查询所有的商品
		ExportProductExample example = new ExportProductExample();
		ExportProductExample.Criteria criteria = example.createCriteria();
		criteria.andExportIdEqualTo(id);
		List<ExportProduct> list = exportProductService.findAll(example);
		//3.加载模板的路径
		String path = session.getServletContext().getRealPath("/")+"/jasper/export.jasper";
		//4.创建JasperPrint对象,需要填充数据
//		Map map = new HashMap();
//		map.put("customerContract",export.getCustomerContract());
		Map<String, Object> map1 = BeanMapUtils.beanToMap(export);
		JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list); //list数据
		JasperPrint jp = JasperFillManager.fillReport(path,map1,dataSource);
		//5.输出pdf文件
		JasperExportManager.exportReportToPdfStream(jp,response.getOutputStream());
	}

效果图:
在这里插入图片描述

2 邮件发送

2.1 概述

在这里插入图片描述

SMTP协议: 邮件发送协议

​ 将邮件的数据发送到smtp服务器上 : 默认端口25

POP3协议: 邮件接收协议

​ 从pop服务器上获取邮件 : 默认端口110

2.2 保存用户发送邮件

<1> 将发送邮件的工具包拷贝到项目export_common下的utils文件夹下
在这里插入图片描述
在这里插入图片描述
MailUtil内相关代码如下:

package cn.itcast.common.utils;


import javax.mail.Address;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class MailUtil {

	/**
	 *  实现邮件返送
	 * @param to        邮件的接收邮箱地址
	 * @param subject   邮件主题
	 * @param content   邮件正文
	 */
	public static void sendMsg(String to ,String subject ,String content) throws Exception{
		Properties props = new Properties();
		props.setProperty("mail.smtp.host", "smtp.sina.com");  //设置主机地址   smtp.qq.com    smtp.sina.com

		props.setProperty("mail.smtp.auth", "true");//认证

		//2.产生一个用于邮件发送的Session对象
		Session session = Session.getInstance(props);

		//3.产生一个邮件的消息对象
		MimeMessage message = new MimeMessage(session);

		//4.设置消息的发送者
		Address fromAddr = new InternetAddress("itcast004@sina.com");
		message.setFrom(fromAddr);

		//5.设置消息的接收者
		Address toAddr = new InternetAddress(to);
		//TO 直接发送  CC抄送    BCC密送
		message.setRecipient(MimeMessage.RecipientType.TO, toAddr);

		//6.设置主题
		message.setSubject(subject);
		//7.设置正文
		message.setText(content);

		//8.准备发送,得到火箭
		Transport transport = session.getTransport("smtp");
		//9.设置火箭的发射目标
		transport.connect("smtp.sina.com", "itcast004@sina.com", "loveyou"); //内置的邮箱发送邮件
		//10.发送
		transport.sendMessage(message, message.getAllRecipients());

		//11.关闭
		transport.close();
	}

	public static void main(String[] args) throws Exception {
		MailUtil.sendMsg("2921232227@qq.com","今晚不见不散","晚八点,老地方见.");
	}

}

当用户保存成功之后,向用户的邮箱发送一封邮件.
在这里插入图片描述

在这里插入图片描述
发邮件的核心代码如下:

	/**
	 * 保存或者更新部门
	 *      1.参数user
	 *      2.获取到企业id并设置
	 *      3.判断 user中是否具有id
	 *          2.1 没id,调用service保存
	 *          2.2 有id,调用service更新
	 *      4.跳转页面
	 */
	@RequestMapping("/edit")
	public String edit(User user) {
		//2.获取到企业id并设置
		user.setCompanyId(getLoginCompanyId());
		user.setCompanyName(getLoginCompanyName());
		String password = user.getPassword();
		//3.判断 user中是否具有id
		if(StringUtils.isEmpty(user.getId())) {
			//没id,调用service保存
			userService.save(user);
			//发送邮件
			String to = user.getEmail();
			String subject = "欢迎使用saas-export系统";
			String content = "尊敬的用户"+user.getUserName()+"您好,欢迎加入saas系统,您的访问URL: http://localhost:8088" +
					", 登录名: "+to+",密码:"+password;
			try {
				MailUtil.sendMsg(to,subject,content);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			//有id,调用service更新
			userService.update(user);
		}
		//4.跳转页面
		return "redirect:/system/user/list.do";
	}

3 消息中间件(重点)

##3.1 概述

在这里插入图片描述

消息的生产者: 创建消息,将消息发送到中间件

消息的消费者: 从中间件中获取消息,使用消息

消息中间 : 软件

3.2 应用场景

异步处理,应用解耦,流量削峰

在这里插入图片描述

3.3 JMS规范

JMS : Java Message service (java消息服务) , 是java中使用消息中间件的一套标准/规范(接口和抽象类).

3.3.1 jms中定义的消息模式

在这里插入图片描述

3.3.2 jms中的API对象(编程模型)

在这里插入图片描述

在这里插入图片描述

3.3.3 java中的消息中间件

消息中间件: 实现了JMS规范的工具

ActiveMq : 是java开发的apache开源的

RabbitMQ : 阿里开源

Kafka : 处理大数据

3.4 ActiveMq

提供了两方面的内容:

  • ​ 消息中间件服务器
  • ​ 提供了一套操作消息中间服务的java工具类实现了JMS规范

3.5 安装ActiveMq服务

<1> 将ActiveMq安装到Linux上面

在这里插入图片描述

<2>

第一步:安装 jdk(略) 

第二步:把 activemq的压缩包(apache-activemq-5.14.5-bin.tar.gz)上传到 linux 系统 

第三步:解压缩压缩包  

tar -zxvf  apache-activemq-5.14.5-bin.tar.gz

第四步:进入apache-activemq-5.14.5的bin目录

cd  apache-activemq-5.14.5/bin

第五步:启动 activemq

./activemq start

第六步:停止activemq:

./activemq stop

业务端的监控窗口 : http://ip:8161
在网页上输入linux服务器地址+8161端口号
在这里插入图片描述

请求地址: tcp://ip:61616 (java代码访问消息中间件)

4 JMS入门案例

##4.1 消息生产者
在这里插入图片描述
在这里插入图片描述
消息生产者内相关代码:

package cn.itcast.test;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class MqProducer {
	/**
	 * 入门案例:消息的生产者
	 */
	public static void main(String[] args) throws JMSException {
		//1.创建连接工厂
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.102:61616");
		//2.创建连接(默认连接未打开)
		Connection connection = factory.createConnection();
		//3.打开连接
		connection.start();
		//4.创建session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//是否需要事务,事务提交方式
		//5.创建目的地对象  队列 queue,主体 topic
		Destination destination  = session.createTopic("heima92-topic");
		//Destination destination = session.createQueue("heima92-queue");//参数 :队列的名称
		//6.创建消息的生产者
		MessageProducer producer = session.createProducer(destination);//创建一个到heima92-queue队列的生产者
		//7.创建消息
		TextMessage message = session.createTextMessage("i am a girl!");//参数 : 传递的文本内容
		//8.发送消息
		producer.send(message);
		//9.释放资源
		session.close();
		connection.close();
	}
}

##4.2 消息消费者

在这里插入图片描述
在这里插入图片描述

4.2.1 自定义监听器

在这里插入图片描述

###4.2.2 测试方法

在这里插入图片描述

##4.3 spring整合开发生产者

4.3.1 抽取工具类

在这里插入图片描述
在这里插入图片描述
消息消费者内相关代码:

package cn.itcast.test;

import cn.itcast.listener.TestMessageListener;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class MqConsumer {
	public static void main(String[] args) throws JMSException {
		//1.创建连接工厂
		ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.102:61616");
		//2.创建连接
		Connection connection = factory.createConnection();
		//3.开启连接
		connection.start();
		//4.创建session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建目的地
		//Destination destination = session.createQueue("heima92-queue");
		Destination destination  = session.createTopic("heima92-topic");
		//6.创建消息的消费者
		MessageConsumer consumer = session.createConsumer(destination);
		//7.监听消息
		consumer.setMessageListener(new TestMessageListener());
	}
}

4.3.2 配置spring和mq整合(生产者)

<1> 创建生产者 在pom文件中导入依赖
在这里插入图片描述
<2>
在这里插入图片描述

<context:component-scan base-package="cn.itcast"></context:component-scan>

<!--连接工厂-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <constructor-arg name="brokerURL" value="tcp://192.168.25.102:61616/"></constructor-arg>
</bean>

<!--缓存连接工厂:spring为了优化mq-->
<bean class="org.springframework.jms.connection.CachingConnectionFactory" id="cachingConnectionFactory">
    <property name="targetConnectionFactory" ref="connectionFactory"></property>
</bean>

<!--JmsTemplate : spring提供的工具类,发送mq消息-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="cachingConnectionFactory"></property>
</bean>

<!--创建工具类-->
<bean id="producer" class="cn.itcast.utils.SpringProducer"></bean>

<!--配置目的地-->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg name="name" value="heima92-queue"></constructor-arg>
</bean>

<3>创建一个类,测试SpringMqProduce是否搭建成功
在这里插入图片描述
相关代码如下:

package cn.itcast.test;

import cn.itcast.utils.SpringProducer;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

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

public class SpringMqProducer {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-mq-producer.xml");
		//获取jmstemplate对象
//		JmsTemplate jmsTemplate = (JmsTemplate) ac.getBean("jmsTemplate");
//		//发送消息
//		//1.目的地  queue
//		Destination destination = new ActiveMQQueue("heima92-queue");
//		//2.发送消息
//		jmsTemplate.send(destination, new MessageCreator() {
//			public Message createMessage(Session session) throws JMSException {
//				//创建消息
//				return session.createTextMessage("spring的queue消息");
//			}
//		});
		SpringProducer springProducer = (SpringProducer)ac.getBean("producer");
		springProducer.sendMsg("工具类发送的");

	}
}

4.4 spring整合开发消费者

4.4.1 消息监听器

在这里插入图片描述

4.4.2 整合配置spring消息消费者

在这里插入图片描述

<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://192.168.25.102:61616"/>
</bean>

<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
    <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>

<!--监听器交给spring容器管理-->
<bean id="testMessageListener" class="cn.itcast.listener.TestMessageListener"></bean>


<!--
    配置消息监听器容器集合
        1.指定监听的消息类型
        2.指定缓存连接工厂
    当监听到queue类型的消息之后,自动的执行监听器中的业务逻辑
-->
<jms:listener-container destination-type="queue" connection-factory="connectionFactory">
    <jms:listener destination="heima92-queue" ref="testMessageListener"></jms:listener>
</jms:listener-container>

把容器创建出来,把容器启动起来

在这里插入图片描述

5 使用消息中间件发送邮件(重点)

作业 :

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值