JMS消息发送和接收实例 - 点对点模式

本文详细介绍了如何使用JMS进行点对点模式的消息发送和接收,包括同步接收的代码实现。首先,文章提及了发送消息的9个步骤,从获取Weblogic Server上下文到使用队列发送器发送消息。在编程前,需要导入相关JAR包并配置JMS服务器。此外,还特别提示读者参考另一篇关于在Weblogic服务器中配置消息服务器的文章。对于接收消息,提到了同步接收的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发送消息

不管是将消息发送到队列还是发布到主题,编程的步骤是相同的,差别在于使用不同的JMS对象。具体定义见表:


发送消息的过程大体分为以下几步;

1、获得一个Weblogic Server上下文的引用;

2、创建连接工厂;

3、使用连接工厂创建一个连接;

4、使用连接创建一个会话;

5、获取一个目的;

6、使用会话和目的创建消息的生产者;

7、创建消息对象;

8、使用连接创建一个需要发送的消息类型的实例;

9、使用连接的一个队列发送器或主题公布器,然后使用发送器或公布器发送消息。


在敲代码之前要先导入需要的JAR包,并且配置JMS服务器。


注意:

wlfullclient.jar生成方式是,进入weblogic的安装目录例如C:\Oracle\Middleware\wlserver_10.3\server\lib,运行 java -jar wljarbuilder.jar就能生成wlfullclient.jar文件 

JMS服务器配置请参考《学习在Weblogic服务器中配置消息服务器图解  


发送消息代码:

package com.xu.testDemo;

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class MsgQueueSender {

	/**
	 * @功能:JMS中实现点对点消息服务--发送消息
	 * @作者:
	 * @日期:2012-10-17
	 */

	private QueueSender sender;
	private TextMessage msg;

	public MsgQueueSender(String[] argv) throws NamingException, JMSException {
		/* 初始化上下文对象 */
		String url = "t3://localhost:7001";
		Properties p = new Properties();
		p.put(Context.INITIAL_CONTEXT_FACTORY,
				"weblogic.jndi.WLInitialContextFactory");
		p.put(Context.PROVIDER_URL, url);
		Context ctx = new InitialContext(p);

		/* 创建一个连接工厂 */
		QueueConnectionFactory qConFactory = (QueueConnectionFactory) ctx
				.lookup("weblogic.jms.ConnectionFactory");

		/* 创建一个队列 */
		Queue messageQueue = (Queue) ctx.lookup("jms/MyMDB");

		/* 创建连接 */
		QueueConnection qCon = qConFactory.createQueueConnection();

		/* 创建一个会话 */
		QueueSession session = qCon.createQueueSession(false,
				Session.AUTO_ACKNOWLEDGE);

		/* 创建一个发送者 */
		sender = session.createSender(messageQueue);

		/* 创建一个消息 */
		msg = session.createTextMessage();

	}

	public void runClient(String str) throws JMSException {
		/* 设置消息,并发送 */
		msg.setText("Hello");
		sender.send(msg);
		msg.setText("Welcome to JMS");
		sender.send(msg);
		msg.setText(str);
		sender.send(msg);
	}

	public static void main(String[] args) throws Exception {
		try {
			MsgQueueSender mqs = new MsgQueueSender(args);
			mqs.runClient("aaa");

		} catch (NamingException e) {
			System.err.println("");
			System.err.println("**请确保已经正确地设置JMS服务器。在运行之前必须配置JMS服务器和正确的JMS目的。");
			System.err.println("");
			throw e;

		}
	}

}


接收消息分为同步与异步接收。

同步接收代码:

package com.xu.testDemo;

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class SyncMesConsumer {

	/**
	 * @功能:同步接收消息实例
	 * @作者:
	 * @日期:2012-10-17
	 */

	private QueueReceiver receiver;
	private TextMessage msg;

	public SyncMesConsumer() throws NamingException, JMSException {
		/* 初始化上下文对象 */
		String url = "t3://localhost:7001";
		Properties p = new Properties();
		p.put(Context.INITIAL_CONTEXT_FACTORY,
				"weblogic.jndi.WLInitialContextFactory");
		p.put(Context.PROVIDER_URL, url);
		Context ctx = new InitialContext(p);

		/* 创建一个连接工厂 */
		QueueConnectionFactory qConFactory = (QueueConnectionFactory) ctx
				.lookup("weblogic.jms.ConnectionFactory");
		/* 创建一个队列 */
		Queue messageQueue = (Queue) ctx.lookup("jms/MyMDB");
		/* 创建一个连接 */
		QueueConnection qCon = qConFactory.createQueueConnection();
		/* 创建一个会话 */
		QueueSession session = qCon.createQueueSession(false,
				Session.AUTO_ACKNOWLEDGE);

		/* 创建消息接收者 */
		receiver = session.createReceiver(messageQueue);
		/* 在调用此方法之前,消息传递被禁止 */
		qCon.start();

	}

	public void runClient() throws JMSException {
		msg = (TextMessage) receiver.receive();
		System.err.println("Reciverd:" + msg.getText());
		msg = (TextMessage) receiver.receive();
		System.err.println("Reciverd:" + msg.getText());
		msg = (TextMessage) receiver.receive();
		System.err.println("Reciverd:" + msg.getText());
	}

	public static void main(String[] args) throws Exception {
		SyncMesConsumer consumer = new SyncMesConsumer();
		consumer.runClient();

	}

}

代码运行结果:

异步接收代码:

package com.xu.testDemo;

import java.util.Properties;

import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class AsynMesConsumer implements MessageListener {

	/**
	 * @功能:异步接收消息
	 * @作者:
	 * @日期:2012-10-18
	 */
	
	private int EXPECTED_MESSAGE_COUNT = 2;
	private int messageCount = 0;
	private QueueReceiver receiver;
	private TextMessage msg;
	
	public AsynMesConsumer() throws NamingException, JMSException
	{
		/*初始化上下文对象*/
		String url = "t3://localhost:7001";
		Properties p = new Properties();
		p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
		p.put(Context.PROVIDER_URL, url);
		Context ctx = new InitialContext(p);
		
		/*创建连接工厂*/
		QueueConnectionFactory qConFactory = (QueueConnectionFactory)
				ctx.lookup("weblogic.jms.ConnectionFactory");
		/*创建队列*/
		Queue messageQueue = (Queue) ctx.lookup("jms/MyMDB");
		/*创建连接*/
		QueueConnection qCon = qConFactory.createQueueConnection();
		/*创建一个会话*/
		QueueSession session = qCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
		/*创建一个接收者*/
		receiver = session.createReceiver(messageQueue);
		/*设置一个消息监听*/
		receiver.setMessageListener(this);
		qCon.start();
		
	}
	@Override
	public void onMessage(Message m) {
		
		try {
			msg = (TextMessage) m;
			System.out.println("Receiver:"+msg.getText());
			
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		messageCount ++;
	}
	public boolean expectMoreMessage()
	{
		return messageCount < EXPECTED_MESSAGE_COUNT;
	}
	public static void main(String[] args) throws Exception {
		int MAX_TRIES = 10;
		int tryCount = 0;
		AsynMesConsumer consumer = new AsynMesConsumer();
		while(consumer.expectMoreMessage() && (tryCount < MAX_TRIES))
		{
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e)
			{
				e.printStackTrace();
			}	
			tryCount ++;
		}
		

	}
}

运行效果:

















评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值