JMS学习4 - 初试在队列上发布/接收消息

/**
 * 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值