博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
消息中间件-activeMQ
阅读量:7033 次
发布时间:2019-06-28

本文共 5436 字,大约阅读时间需要 18 分钟。

hot3.png

JMS简介

  全称:Java Message Service 中文:Java消息服务。
  JMS是Java的一套API标准,最初的目的是为了使应用程序能够访问现有的MOM系统(MOM是Message Oriented Middleware的英文缩写,指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。);后来被许多现有的MOM供应商采用,并实现为MOM系统。
  基于JMS实现的MOM,又被称为JMS Provider。
 

 

常用的消息中间件有哪些

1ActiveMQ
  ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。

2RabbitMQ

  RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。开发语言为Erlang。

3RocketMQ

  由阿里巴巴定义开发的一套消息队列应用服务。
 

在用activeMQ获取对象(objectmessage)数据消息时 ,如果显示如下错误(这里在activeMQ里取到了消息,但是打印不出来):

Exception in thread "main" javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: Forbidden class com.liy.pojo.User! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.

    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
    at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:208)
    at com.liy.comsumer.ObjectConsumer.main(ObjectConsumer.java:39)
Caused by: java.lang.ClassNotFoundException: Forbidden class com.liy.pojo.User! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.apache.org/objectmessage.html for more information on how to configure trusted classes.
    at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.checkSecurity(ClassLoadingAwareObjectInputStream.java:112)
    at org.apache.activemq.util.ClassLoadingAwareObjectInputStream.resolveClass(ClassLoadingAwareObjectInputStream.java:57)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at org.apache.activemq.command.ActiveMQObjectMessage.getObject(ActiveMQObjectMessage.java:206)
    ... 1 more
 

说找不到可以信任的实体类(pojo类)什么的     

那么让他信任所有包下的类

    //设置所有包下的类都是可以信任的

      ((ActiveMQConnectionFactory) factory).setTrustAllPackages(true);

 

 

activeMQ和spring的使用

创建两个maven的jar工程  一个用来发送消息 ,一个用来接收消息

Activemq-02-spring-producer工程里步骤

1.引入依赖(另外一个工程里依赖是一样的 ,   这生产者和消费者完全可以写在一个工程了)

org.apache.activemq
activemq-all
5.9.0
org.apache.xbean
xbean-spring
4.5
org.springframework
spring-jms
4.1.6.RELEASE
org.springframework
spring-context
4.1.6.RELEASE

 

2.随便写个pojo类,用来传输的数据消息(注意必须实现序列化,以及写上这个序列UID)

public class User implements Serializable{ 	private static final long serialVersionUID = 1L;		private String name;		private String pwd;

 

3.写生产类

package com.liy.producer;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.ObjectMessage;import javax.jms.Session;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import com.liy.pojo.User;public class Producers {		private JmsTemplate template;		public JmsTemplate getTemplate() {		return template;	}	public void setTemplate(JmsTemplate template) {		this.template = template;	}	/**	 * 发送消息	 * @param destinationName 	 */	public void send(String destinationName,User user){		template.send(destinationName, new MessageCreator() {						@Override			public Message createMessage(Session arg0) throws JMSException {				 ObjectMessage message = arg0.createObjectMessage(user);				return message;			}		});			}	}

 

4.写spring的配置文件(applicationContext.xml)

 

5.写生产工程的测试类

public class Test {	public static void main(String[] args) {		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");		Producers pro = ac.getBean(Producers.class);			User user = new User("liy","666");				pro.send("act-spring", user);		System.out.println("消息发送完成....");	}}

 

如下即为启动成功,消息发送完了 , 这里就算关掉也没关系

2250580f37cd66612dfe2a02286e4e80c73.jpg

 

 

 

消费者工程步骤

1.依赖和生产者依赖一样

2.实体类也是一样的,复制下来即可

3.接下来写消费者类

package com.liy.consumer;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.ObjectMessage;public class Consumers implements MessageListener{	@Override	public void onMessage(Message message) {		 ObjectMessage obj = (ObjectMessage) message;		try {			System.out.println(obj.getObject());		} catch (JMSException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}		}

 

4.写spring的配置文件

 

5.消费工程的测试类(因为spring配置文件里有设置监听器 ,只要生产者工程发布了消息,监听器就会自动获取消息, 所以只要把spring容易开启即可)

public class Test {	public static void main(String[] args) {		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");	 	}}

 

如图

b6eb42ce29af5b63b8d1e3595995d8f4a4a.jpg

转载于:https://my.oschina.net/u/4116654/blog/3048094

你可能感兴趣的文章
Maven学习总结(四)——Maven核心概念
查看>>
安装xtables-addons时报错
查看>>
.NET开发规范教程
查看>>
网络公开课《最后的升级-Oracle RAC数据库升级》
查看>>
配置FTP服务
查看>>
我的友情链接
查看>>
人类认识的层次模型
查看>>
WDS使用捕获映像制作企业自定义映像
查看>>
C++数组、指针与vector、iterator
查看>>
SSL及其开源实现OpenSSL+创建私有CA
查看>>
jquery实现表单form异步提交
查看>>
Citrix xendesktop中未注册(Not registered)的检查流程
查看>>
一张图让你看懂JAVA线程间的状态转换
查看>>
Performance comparison Raw device VS Ext2 VS Ext3 VS OCFS
查看>>
ISBN号码(CCF考题)
查看>>
PendingIntent中Flags的参数设置
查看>>
企业级镜像仓库harbor搭建(http/https)及使用
查看>>
从MySQL到MongoDB简易对照表 (转)
查看>>
python爬取某个网页的图片-如百度贴吧
查看>>
使用httpwatch抓包
查看>>