/**
* JMS操作基类,用于统一获取连接,关闭连接
*
* @author sunjun
*/
public class JMSBase {
private final static String URL = "tcp://localhost:61616";
private final static String JNDI_NAME_CONNECTIONFACTORY = "connectionFactory";
private final static String JNDI_NAME_QUEUE_CONNECTIONFACTORY = "queueConnectionFactory";
private final static String JNDI_NAME_TOPIC_CONNECTIONFACTORY = "topicConnectionFactry";
protected final static String QUEUE_NAME = "test.queue1";
/**
* 创建ConnectionFactory
*
* @param useJNDI
* true:通过 JNDI创建<br>
* false:直接通过brokerUrl创建
* @return
* @throws NamingException
*/
private ConnectionFactory getConnectionFactory(boolean useJNDI)
throws NamingException {
if (useJNDI) {
InitialContext context = new InitialContext();
return (ConnectionFactory) context
.lookup(JNDI_NAME_CONNECTIONFACTORY);
}
return new ActiveMQConnectionFactory(URL);
}
/**
* 创建Connection
*
* @return
* @throws Exception
*/
protected Connection getConnection() throws Exception {
return getConnectionFactory(true).createConnection();
}
/**
* 关闭Session,Connection
*
* @param session
* @param connection
* @throws JMSException
*/
protected void close(Session session, Connection connection)
throws JMSException {
if (session != null)
session.close();
if (connection != null)
connection.close();
}
}
/**
* 发送JMS消息,PTP,发送一个持久的文本消息到队列test.queue1上,即使activemq重启,消息也不会丢失
*
* @author sunjun
*/
public class Publisher extends JMSBase {
@Test
public void testPublish() throws Exception {
// 创建得connection
Connection connection = getConnection();
// connection.start();
// 创建session
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建queue
Queue queue = session.createQueue(QUEUE_NAME);
// 创建producer
MessageProducer producer = session.createProducer(queue);
// 发送的消息进行持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建一个文本消息
Message message = session.createTextMessage("text message content.");
message.setStringProperty("property1", "value1");
// 发送消息
producer.send(message);
// 关闭session,connection
close(session, connection);
System.out.println("publish text message success.");
}
}
/**
* 接收JMS消息,PTP,接收队列test.queue1上的所有消息<br>
* 接收有两种方式:主动去receive,通过见听器异步接收
*
* @author sunjun
*/
public class Receiver extends JMSBase implements MessageListener {
@Test
public void testRecieve() throws Exception {
// 创建connection
Connection connection = getConnection();
// 开始
connection.start(); // 只有开始了才能接收消息
// 创建session
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 创建queue
Queue queue = session.createQueue(QUEUE_NAME);
// 创建consumer
MessageConsumer consumer = session.createConsumer(queue);
receiveMessage(false, consumer);
}
/**
* 接收所有消息
*
* @param sync
* @param consumer
* @throws JMSException
*/
private void receiveMessage(boolean sync, MessageConsumer consumer)
throws JMSException {
if (sync) {
// 主动接收,同步接收
int i = 0;
while (true) {
i++;
Message receive = consumer.receive();
if (receive != null) {
System.out.println("receive message:"
+ ((TextMessage) receive).getText() + " with i="
+ i + " at time " + new Date().toLocaleString());
}
}
} else {
// 被动接收,异步接收
consumer.setMessageListener(this);
while (true) {
}
}
}
@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
System.out.print("receive a text message:");
System.out.print(((TextMessage) message).getText());
System.out.println(" at time " + new Date().toLocaleString());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
运行发送和接收,接收端收到消息如下:
receive a text message:text message content. at time 2010-11-1 22:40:16
receive a text message:text message content. at time 2010-11-1 22:40:16