javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke

本文介绍使用ActiveMQ发送Serializable对象遇到的问题及解决方案。当发送自定义Serializable对象时,如果Broker端未部署相同的类库,会导致ClassNotFound异常。文章通过示例代码说明如何配置Producer和Consumer,并提供了解决方案。
摘要由CSDN通过智能技术生成

ActiveMQ发消息成功,控制台报错。

javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: com.ceair.shopping.handler.transform.User


问题重现:参考 http://blog.csdn.net/adam_wzs/article/details/51250177中代码

package com.wangzs.t3;

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.ActiveMQConnectionFactory;

/**
 * @Title 消息消费者工具类
 * @Description 消息消费者是由会话创建的一个对象,它用于接收发送到目的地的消息。
 * @author wangzs
 * @date 2016-4-26
 */
public class ConsumerTool implements MessageListener {

	private String user;
	private String password;
	private String url;
	private String queueName; // queueName是一个服务器的queue

	private ConnectionFactory connectionFactory = null; // 连接工厂,客户用来创建连接的对象
	private Destination destination = null; // 指定它生产的消息的目标和它消费的消息的来源的对象
	private Connection connection = null; // 封装了客户与 JMS 提供者之间的一个虚拟的连接
	private Session session = null; // 生产和消费消息的一个单线程上下文
	private MessageConsumer consumer = null; // 消息消费者

	public ConsumerTool() {
		super();
	}

	public ConsumerTool(String user, String password, String url, String queueName) {
		super();
		this.user = user;
		this.password = password;
		this.url = url;
		this.queueName = queueName;
	}

	public void initialize() {
		connectionFactory = new ActiveMQConnectionFactory(this.getUser(), this.getPassword(), this.getUrl());
		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
			destination = session.createQueue(this.getQueueName());
			consumer = session.createConsumer(destination);
		} catch (JMSException e) {
			e.printStackTrace();
		}

	}

	// 消费消息
	public void consumeMessage() {
		System.out.println("Consumer:->Begin listening...");
		try {
			consumer.setMessageListener(this);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onMessage(Message message) {
		try {
			if (message instanceof TextMessage) {
				TextMessage txtMsg = (TextMessage) message;
				String msg = txtMsg.getText();
				System.out.println("Consumer:->Received: " + msg);
			}
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	// 关闭连接
	public void close() {
		try {
			System.out.println("Consumer:->Closing connection");
			if (consumer != null) {
				consumer.close();
			}
			if (session != null) {
				session.close();
			}
			if (connection != null) {
				connection.close();
			}
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getQueueName() {
		return queueName;
	}

	public void setQueueName(String queueName) {
		this.queueName = queueName;
	}

}


package com.wangzs.t3;

import java.io.Serializable;

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

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * @Title 消息生产者工具类
 * @Description 消息生产者是由会话创建的一个对象,用于把消息发送到一个目的地
 * @author wangzs
 * @date 2016-4-26
 */
public class ProducerTool {

	private String user;
	private String password;
	private String url;
	private String queueName; // queueName是一个服务器的queue

	private ConnectionFactory connectionFactory = null; // 连接工厂,客户用来创建连接的对象
	private Destination destination = null; // 指定它生产的消息的目标和它消费的消息的来源的对象
	private Connection connection = null; // 封装了客户与 JMS 提供者之间的一个虚拟的连接
	private Session session = null; // 生产和消费消息的一个单线程上下文
	private MessageProducer producer = null; // 消息生产者

	public ProducerTool() {
		super();
	}

	public ProducerTool(String user, String password, String url, String queueName) {
		super();
		this.user = user;
		this.password = password;
		this.url = url;
		this.queueName = queueName;
	}

	public void initialize() {
		connectionFactory = new ActiveMQConnectionFactory(this.getUser(), this.getPassword(), this.getUrl());
		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
			destination = session.createQueue(this.getQueueName());
			producer = session.createProducer(destination);
			producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// NON_PERSISTENT:不要求 JMS Producer 持久保存消息。
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	// 发送消息 String message
	public void produceMessage(String message) {
		try {
			TextMessage msg = session.createTextMessage(message);
			System.out.println("Producer:->Sending message: " + message);
			producer.send(msg);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

<strong><span style="color:#ff0000;">	// 发送消息Serializable message
	public void produceMessage(Serializable message) {
		try {
			ObjectMessage msg = session.createObjectMessage(message);
			System.out.println("Producer:->Sending message: " + message);
			producer.send(msg);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}</span></strong>

	// 关闭连接
	public void close() {
		try {
			System.out.println("Producer:->Closing connection");
			if (producer != null) {
				producer.close();
			}
			if (session != null) {
				session.close();
			}
			if (connection != null) {
				connection.close();
			}
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getQueueName() {
		return queueName;
	}

	public void setQueueName(String queueName) {
		this.queueName = queueName;
	}

}


package com.wangzs.t3;

import java.io.Serializable;

public class User implements Serializable {
	private static final long serialVersionUID = -2194417922311787497L;

	private String name;
	private String age;

	public User() {
		super();
	}

	public User(String name, String age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}

}


package com.wangzs.t3;

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

/**
 * @Title ActiveMQ工具类测试
 * @Description
 * @author wangzs
 * @date 2016-4-26
 */
public class JunitTest {

	@Test
	public void test1() throws InterruptedException {
		ConsumerTool consumer = new ConsumerTool(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
				ActiveMQConnection.DEFAULT_BROKER_URL, "WangzsQueue");
		ProducerTool producer = new ProducerTool(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
				ActiveMQConnection.DEFAULT_BROKER_URL, "WangzsQueue");
		System.out.println(ActiveMQConnection.DEFAULT_BROKER_URL + "------------");

		// 消费者
		consumer.initialize();
		consumer.consumeMessage();

<strong><span style="color:#ff0000;">		User user1 = new User("wangzs1", "1");
		User user2 = new User("wangzs2", "2");</span></strong>

		// 生产者
		producer.initialize();
		producer.produceMessage(user1);
		producer.produceMessage(user2);
	}
}


问题分析:

 java.lang.ClassNotFoundException: com.ceair.shopping.handler.transform.User

是因为在D:\apache-activemq-5.5.1\lib里面没有user的代码,activemq无法识别

解决办法:

把本地User.java打成user.jar包放入D:\apache-activemq-5.5.1\lib路径下,重启activemq,

再次发消息,就可在activemq控制台看到正确的结果。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值