您的位置:首页 > 产品设计 > UI/UE

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

2016-04-26 15:39 1016 查看
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控制台看到正确的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ActiveMQ