七、 Spring 整合 ActiveMQ

1 创建 spring-activemq-producer

1.1 修改 POM 文件

添加spring的依赖 除此之外 还要加入activemq完整包 spring-jms包xbean-spring包 如果用到了连接池 还要加连接池包

1.2 整合 ActiveMQ 加入sprng封装的activeMQ配置

applicationContext-jms.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jmshttp://www.springframework.org/schema/jms/spring-jms.xsdhttp://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsd"><!-- 需要创建一个连接工厂,连接ActiveMQ. ActiveMQConnectionFactory. 需要依赖ActiveMQ提供的amq标签 --><!-- amq:connectionFactory 是bean标签的子标签, 会在spring容器中创建一个bean对象.可以为对象命名. 类似: <bean id="" class="ActiveMQConnectionFactory"></bean>--><amq:connectionFactory brokerURL="tcp://192.168.142.6:61616"userName="admin" password="admin" id="amqConnectionFactory"/><!-- spring管理JMS相关代码的时候,必须依赖jms标签库. spring-jms提供的标签库. --><!-- 定义Spring-JMS中的连接工厂对象CachingConnectionFactory - spring框架提供的连接工厂对象. 不能真正的访问MOM容器.类似一个工厂的代理对象. 需要提供一个真实工厂,实现MOM容器的连接访问.--><bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"><property name="targetConnectionFactory" ref="amqConnectionFactory"></property><property name="sessionCacheSize" value="3"></property></bean><!-- 注册监听器 --><!-- 开始注册监听. 需要的参数有:acknowledge - 消息确认机制container-type - 容器类型 default|simplesimple:SimpleMessageListenerContainer最简单的消息监听器容器,只能处理固定数量的JMS会话,且不支持事务。default:DefaultMessageListenerContainer是一个用于异步消息监听器容器 ,且支持事务         destination-type - 目的地类型. 使用队列作为目的地.connection-factory - 连接工厂, spring-jms使用的连接工厂,必须是spring自主创建的不能使用三方工具创建的工程. 如: ActiveMQConnectionFactory.--><jms:listener-container acknowledge="auto" container-type="default"destination-type="queue" connection-factory="connectionFactory" ><!-- 在监听器容器中注册某监听器对象.destination - 设置目的地命名ref - 指定监听器对象--><jms:listener destination="test-spring" ref="myListener"/></jms:listener-container></beans>

2 创建 spring-activemq-consumer

是一个 jar 工程

2.1 修改 POM 文件

创建一个war工程,导入相关依赖。 加上spring-service springmvc springjsm 的配置。 创建pojo 创建service 创建service实现类(spring容器注入了activemq 因此只需要发送消息), 创建contriller。Jsp相关页面

2.2 整合 ActiveMQ

3 测试整合

需求:

1)在 producer 中创建 Users 对象

2)将 Users 对象传递到 ActiveMQ 中

3)在 Consumer 中获取 Users 对象并在控制台打印

3.1 Producer 发送消息

3.1.1 如果使用了连接池需要添加两个坐标

PooledConnectionFactoryBean

3.1.2 发送消息

package com.bjsxt.service.impl;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;import com.bjsxt.pojo.Users;
import com.bjsxt.service.UserService;
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate JmsTemplate jmsTemplate;@Overridepublic void addUser(Users user) {//消息发送this.jmsTemplate.send(new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {Message message = session.createObjectMessage(user);return message;}});}}

3.2 Consumer 接收消息

3.2.1 接收消息

package com.bjsxt.listener;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.bjsxt.pojo.Users;
import com.bjsxt.service.UserService;
//消息监听器
@Component(value="myListener")
public class MyMessageListener implements MessageListener{@Autowiredprivate UserService userService;@Overridepublic void onMessage(Message message) {ObjectMessage objectMessage=(ObjectMessage)message;Users user = null;try {user = (Users)objectMessage.getObject();} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}/*Users user = (User)((ObjectMessage)message).getObject();*/userService.showMsg(user);}}

JsonP

一、 JsonP 简介

1 什么是 JsonP

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)

那获取资料,即跨域读取数据。

为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同

源策略。

2 什么是跨域?

跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源

3 什么是同源策略?

同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,

它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策

略。如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协议+域

名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。

3.1 非同源策略限制以下几种行为

1.) Cookie、LocalStorage 和 IndexDB 无法读取

2.) DOM 和 Js 对象无法获得

3.) AJAX 请求不能发送

4 常见跨域场景

URL 说明 是否允许通信

http://www.domain.com/a.js

http://www.domain.com/b.js 同一域名,不同文件或路径 允许

http://www.domain.com/lab/c.js

http://www.domain.com:8000/a.js

http://www.domain.com/b.js 同一域名,不同端口 不允许

http://www.domain.com/a.js

https://www.domain.com/b.js 同一域名,不同协议 不允许

http://www.domain.com/a.js

http://192.168.4.12/b.js 域名和域名对应相同 ip 不允许

http://www.domain.com/a.js

http://x.domain.com/b.js 主域相同,子域不同 不允许

http://domain.com/c.js

http://www.domain1.com/a.js

http://www.domain2.com/b.js 不同域名 不允许

5 跨域解决方案

1) 通过 jsonp 跨域

2) document.domain + iframe 跨域

3) location.hash + iframe

4) Dave Vieira-Kurz + iframe 跨域

5) postMessage 跨域

6) 跨域资源共享(CORS)

7) nginx 代理跨域

8) nodejs 中间件代理跨域

9) WebSocket 协议跨域

6 JsonP 优缺点

JSONP 的优点是:它不像 XMLHttpRequest 对象实现的 Ajax 请求那样受到同源策略的

限制;它的兼容性更好,在更加古老的浏览器中都 可以运行,不需要 XMLHttpRequest 或

ActiveX 的支持;并且在请求完毕后可以通过调用 callback 的方式回传结果。

JSONP 的缺点则是:它只支持 GET 请求而不支持 POST 等其它类型的 HTTP 请求;它

只支持跨域 HTTP 请求这种情况,不能解决不同域的两个页面之间如何进行 JavaScript 调用

的问题。

二、 JsonP 的使用

1 搭建跨域场景

1.1 需求

1)创建两个 web 工程,名称为 jsonDemo1(8080)、jsonDemo2(9090)

2)jsonDemo1 中提供一个 index.jsp。

3)在 jsonDemo1 的 index.jsp 中通过 Jquery 的 Ajax 跨域请求 jsonDemo2

4)jsonDemo2 中使用 springMVC 处理请求,返回一个 json 对象

5)在 jsonDemo1 中将返回的结果插入到 index.jsp 中

1.2 创建项目

1.2.1 jsonDemo1

pom文件里添加了spring的依赖和Tomcat配置

1.2.2 jsonDemo2

pom文件添加了spingmvc jsp json 依赖 tomcat端口9090

2 使用 JsonP 解决跨域

2.1 Ajax 跨域请求时会出现异常

2.2 在 ajax 中请求方式有所改变

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="/js/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){$("#but").click(function(){$.ajax({type:"get",url:"http://localhost:9090/user/findUser",dataType:"jsonp",jsonp:"callback",success:function(data){alert(data);var str = "";for(i=0;i<data.length;i++){str+= data[i].userid+" "+data[i].username+" "+data[i].userage+" ";}$("#show").html(str);}});});
});
</script>
</head>
<body><span id="show"></span><input type="button" value="OK" id="but"/>
</body>
</html>

2.3 请求的 Controller 需要改变

package com.bjsxt.web.controller;import java.util.ArrayList;
import java.util.List;import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.bjsxt.commons.JsonUtils;
import com.bjsxt.pojo.User;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/findUser")@ResponseBodypublic Object findUser(String callback){User user=new User(1,"zhangsan",20);User user1=new User(2,"lisi",21);User user2=new User(3,"wangwu",22);List<User> list=new ArrayList<User>();list.add(user);list.add(user1);list.add(user2);//callback({id:1,name:zhangsan...})/*String str=JsonUtils.objectToJson(list);return callback+"("+str+")"*/;//利用spring去转换json-jsonpMappingJacksonValue mj=new MappingJacksonValue(list);mj.setJsonpFunction(callback);return mj;}
}

注意callback 是随意命名的 在前台用jsonp的时候 需要指明

jason-jsonp的转换 可以用自己的工具类 也可以用spring提供的方法

spring service加上@autowired 空指针_Spring整合activeMQ和JsonP相关推荐

  1. Spring整合ActiveMQ完成消息队列MQ编程

    <–start–> 第一步:新建一个maven,将工程命名为activeMQ_spring.在pom.xml文件中导入相关jar包. ①spring开发和测试相关的jar包: spring ...

  2. ActiveMQ —— Spring 整合 ActiveMQ

    前文 消息中间件 -- 简介 ActiveMQ 下载.安装 ActiveMQ -- Java 连接 ActiveMQ(点对点) ActiveMQ -- Java 连接 ActiveMQ(发布订阅 To ...

  3. java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解

    本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...

  4. 加上项目路径 spring security忽略不生效_Spring 常见面试题「收藏」

    Spring 常见面试题 1 Spring框架是什么?它的主要模块有哪些? Spring框架是一个Java平台,提供全面的基础设施支持开发Java应用程序.Spring处理基础设施部分,这样你就可以专 ...

  5. Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析

    Spring MVC 解读--@Autowired 一.@Autowired 作为一个Spring开发者对@Autowired注解必定是非常了解了, 顾名思义自动装配,应该是Spring会自动将我们标 ...

  6. autowired注解_Spring系列之Spring常用注解总结

    作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...

  7. 实战06_SSM整合ActiveMQ支持多种类型消息

    接上一篇:企业实战05_SSM整合ActiveMQ支持多种类型消息https://blog.csdn.net/weixin_40816738/article/details/100572129 1.S ...

  8. 实战05_SSM整合ActiveMQ支持多种类型消息

    接上一篇:实战04_SSM整合ActiveMQ支持多种类型消息https://blog.csdn.net/weixin_40816738/article/details/100572124 1.Str ...

  9. activeMQ基础学习和SpringBoot整合activeMQ案例

    昨天仔细研究了activeMQ消息队列,也遇到了些坑,昨天晚上也写了篇文章记录坑的内容,其实上篇文章(SpringBoot整合activeMQ消息队列手动签收(Session.CLIENT_ACKNO ...

  10. springboot整合ActiveMQ(点对点和发布订阅)

    springboot整合ActiveMQ(点对点和发布订阅) ActiveMQ是什么,为什么使用MQ 是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后, ...

最新文章

  1. Oralce日常高效率巡检_数据库性能、安全检查
  2. 指针系统学习7-返回指针值的函数
  3. 分布式计算引擎MapReduce
  4. java考题_Java考题知识点
  5. 同事就是同事,职场没有兄弟姐妹
  6. 入门微信小程序(含实战) [第九篇] -- 下拉刷新和上拉加载
  7. 玩转LiteOS组件:玩转Librws
  8. git笔记之解决eclipse不能提交jar等文件的问题
  9. 陆奇下下选,YC上上签
  10. Redis BigKey
  11. 网络管理软件,这个市场肉很多
  12. tensorflow安装中踩到的坑protobuf、h5py、tensorboard、werkzeug
  13. 在软件测试中UT,IT,ST,UAT分别是什么意思
  14. 历年研究生数学建模优秀论文汇总
  15. A股动量策略有效性验证
  16. Flutter(Dart)基础——函数详解
  17. 如何搭建一个简单的个人网站
  18. 上海七宝惊现海宝美眉
  19. Python采集手机4K壁纸,又是一个练手小案例,也不用担心没壁纸换咯
  20. 诺贝尔奖得主费曼大神教你如何学习

热门文章

  1. Realsense D455 修改分辨率和FPS
  2. 【ARC083E】Bichrome Tree
  3. mysql(指RDS)验证pureftpd登录
  4. 设计模式之设计原则(一)
  5. ThinkPHP5.0版本和ThinkPHP3.2版本的差别
  6. cefsharp作为采集工具(学习笔记)
  7. 在控制用' * '台画一个圆形图案
  8. matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性
  9. 【Redis学习笔记】Redis初识
  10. 从零基础入门Tensorflow2.0 ----六、30 kaggle 10 monkeys 基础模型搭建与训练