package com.mq;
public class ConstanParam {
public static String USER = "admin";
public static String PASSWORD = "123456";
public static String URL = "failover://tcp://10.10.10.10:61618";
public static String SUBJECT = "test.queue.demo";
}
/**
* 接收mq消息
*/
package com.mq;
import java.util.Enumeration;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MQAcceptMessage implements MessageListener {
private String USER = ConstanParam.USER;
private String PASSWORD = ConstanParam.PASSWORD;
private String URL = ConstanParam.URL;
private String SUBJECT = ConstanParam.SUBJECT;
private Destination dest = null;
private Connection conn = null;
private Session session = null;
private MessageConsumer consumer = null;
private boolean stop = false;
// 初始化
private void initialize() throws JMSException, Exception {
// 连接工厂是用户创建连接的对象.
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USER, PASSWORD, URL);
// 连接工厂创建一个jms connection
conn = connectionFactory.createConnection();
// 是生产和消费的一个单线程上下文。会话用于创建消息的生产者,消费者和消息。会话提供了一个事务性的上下文。
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); // 不支持事务
// 目的地是客户用来指定他生产消息的目标还有他消费消息的来源的对象.
dest = session.createQueue(SUBJECT);
// dest = session.createTopic(SUBJECT);
// 会话创建消息的生产者将消息发送到目的地
consumer = session.createConsumer(dest);
}
/**
* 消费消息
*
* @throws JMSException
* @throws Exception
*/
public void startReceiveMessage() throws JMSException, Exception {
initialize();
conn.start();
consumer.setMessageListener(this);
// 等待接收消息
while (!stop) {
Thread.sleep(5000);
}
}
@SuppressWarnings("rawtypes")
@Override
public void onMessage(Message msg) {
try {
if (msg instanceof TextMessage) {
TextMessage message = (TextMessage) msg;
System.out.println("------Received TextMessage------");
System.out.println(message.getText());
} else if (msg instanceof MapMessage) {
MapMessage message = (MapMessage) msg;
System.out.println("------Received MapMessage------");
System.out.println(message.getLong("long"));
System.out.println(message.getBoolean("boolean"));
System.out.println(message.getShort("short"));
System.out.println(message.getString("MapMessage"));
System.out.println("------Received MapMessage for while------");
Enumeration enumer = message.getMapNames();
while (enumer.hasMoreElements()) {
Object obj = enumer.nextElement();
System.out.println(message.getObject(obj.toString()));
}
} else if (msg instanceof StreamMessage) {
StreamMessage message = (StreamMessage) msg;
System.out.println("------Received StreamMessage------");
System.out.println(message.readString());
System.out.println(message.readBoolean());
System.out.println(message.readLong());
} else if (msg instanceof ObjectMessage) {
System.out.println("------Received ObjectMessage------");
ObjectMessage message = (ObjectMessage) msg;
MqMessage mqMessage = (MqMessage) message.getObject();
System.out.println("name: " + mqMessage.getName());
} else if (msg instanceof BytesMessage) {
System.out.println("------Received BytesMessage------");
BytesMessage message = (BytesMessage) msg;
byte[] byteContent = new byte[1024];
int length = -1;
StringBuffer content = new StringBuffer();
while ((length = message.readBytes(byteContent)) != -1) {
content.append(new String(byteContent, 0, length));
}
System.out.println(content.toString());
} else {
System.out.println(msg);
}
stop = true;
} catch (JMSException e) {
e.printStackTrace();
}
}
// 关闭连接
public void close() throws JMSException {
System.out.println("Consumer:->Closing connection");
if (consumer != null)
consumer.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
}
}
package com.mq;
import java.io.Serializable;
public class MqMessage implements Serializable{
/** * 序列化ID */
private static final long serialVersionUID = 7543452786622377175L;
private String name;
private Integer id;
/**
* 获取name
* @return name name
*/
public String getName() {
return name;
}
/**
* 设置name
* @param name name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取id
* @return id id
*/
public Integer getId() {
return id;
}
/**
* 设置id
* @param id id
*/
public void setId(Integer id) {
this.id = id;
}
}
package com.mq;
import java.io.Serializable;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 发送mq消息
*
*/
public class MQSender {
private Destination destination = null;
private Connection conn = null;
private Session session = null;
private MessageProducer producer = null;
/**
* 获取conn
*
* @return conn conn
*/
public Connection getConn() {
return conn;
}
// 初始化
public void initialize() throws JMSException, Exception {
// 连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ConstanParam.USER, ConstanParam.PASSWORD, ConstanParam.URL);
conn = connectionFactory.createConnection();
// 事务性会话,自动确认消息
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 消息的目的地(Queue/Topic)
destination = session.createQueue(ConstanParam.SUBJECT);
// destination = session.createTopic(SUBJECT);
// 消息的提供者(生产者)
producer = session.createProducer(destination);
// 不持久化消息
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
public void sendMessage(MsgTypeEnum msgTypeEnum, Object msgObject) throws JMSException, Exception {
initialize();
// 连接到JMS提供者(服务器)
conn.start();
switch (msgTypeEnum) {
// 发送字节消息
case BYTES:
BytesMessage msg2 = session.createBytesMessage();
msg2.writeBytes(msgObject.toString().getBytes());
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(msg2);
break;
// 发送Map消息
case MAP:
MapMessage msg = session.createMapMessage();
msg.setBoolean("boolean", true);
msg.setShort("short", (short) 0);
msg.setLong("long", 123456);
msg.setString("MapMessage", "ActiveMQ Map Message!");
producer.send(msg);
break;
// 发送对象消息
case OBJECT:
ObjectMessage msg12 = session.createObjectMessage();
msg12.setObject((Serializable) msgObject);
producer.send(msg12);
break;
// 发送流消息
case STREAM:
StreamMessage msg1 = session.createStreamMessage();
msg1.writeBoolean(false);
msg1.writeLong(1234567890);
producer.send((StreamMessage) msg1);
break;
// 发送文本消息
case TEXT:
TextMessage msg11 = session.createTextMessage();
msg11.setText((String) msgObject);
producer.send(msg11);
break;
default:
break;
}
close();
}
// 关闭连接
public void close() throws JMSException {
if (producer != null)
producer.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
}
}
package com.mq;
import javax.jms.JMSException;
public class MQSendThread extends Thread {
@Override
public void run() {
MQSender sender = new MQSender();
// 连接到JMS提供者(服务器)
try {
sender.initialize();
sender.getConn().start();
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
while (true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
sender.sendMessage(MsgTypeEnum.BYTES,"bytes_"+System.currentTimeMillis());
sender.close();
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package com.mq;
public enum MsgTypeEnum {
TEXT("text", "文本信息"), MAP("map", "Map信息"), STREAM("stream", "流信息"), OBJECT("object", "对象信息"), BYTES("byte", "字节信息");
public String key;
public String value;
/**
* 创建一个新的实例MsgTypeEnum.
*
* @param key
* @param value
*/
private MsgTypeEnum(String key, String value) {
this.key = key;
this.value = value;
}
}
package com.mq;
import javax.jms.JMSException;
public class Test {
public static void main(String[] args) {
MQSendThread mqSendThread = new MQSendThread();
mqSendThread.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
MQAcceptMessage mqAcceptMessage = new MQAcceptMessage();
try {
mqAcceptMessage.startReceiveMessage();
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ActiveMQ 发送消息和接收消息 Demo
最新推荐文章于 2024-08-05 12:08:49 发布