JMS消息处理(六):PTP消息的同步接收和异步接收

PTP消息的同步接收和异步接收
1.PTP消息的同步接收
需要等待消息的到来,先接收,后发送
两种模型中同步接收消息的编程基本是相同的,步骤如下
	1.通过JNDI查找获取JMS连接工厂
	2.通过JMS工厂创建JMS连接
	3.JMS连接创建JMS会话
	4.通过JNDI查找获取JMS消息目的
	5.JMS会话根据指定的JMS消息目的来创建一个JMS消息消费者
	6.利用消息的消费者对象同步的接收消息
	7.关闭JMS资源

eg:新建SyConsumer类

/*同步接受消息*/ 
//先接收 后发送 等待消息队列里收到消息
public class SyConsumer {
	
	//1.获取命名服务的Context对象(获取初始化容器)
	private Context getInitalContext() throws Exception {
		
		final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
		
		final String SERVER_URL = "t3://localhost:7001";
		
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
		props.put(Context.PROVIDER_URL, SERVER_URL);
		
		Context ctx = new InitialContext(props);
		
		return ctx;
	}
	
	//2.同步接收PTP消息
	public void reciveMessage() throws Exception {
		//定义默认的连接工厂
		final String CONNECTION_FACTORY = "weblogic.jms.ConnectionFactory";
		//获取容器 实例化
		Context ctx = getInitalContext();
		//查找连接对象 通过JNDI查找获取JMS连接工厂
		ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY);
		//通过JNDI查找获取JMS消息目的
		Destination dest = (Destination) ctx.lookup("MessageQueue");
		//通过JMS工厂创建JMS连接
		Connection conn = connFactory.createConnection();
		//启动JMS连接,开始传输JMS消息
		conn.start();
		//JMS连接创建JMS会话
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//利用JMS会话创建消息消费者对象
		MessageConsumer receiver = session.createConsumer(dest);
		//利用消息的消费者对象同步的接收消息
		TextMessage msg = (TextMessage) receiver.receive();
		System.out.println(msg);
		System.out.println("同步接收到的消息:"+msg.getText());
		//释放资源
		session.close();
		conn.close();
		
		
	}
	
	//3.测试执行
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//new自身一个对象
		SyConsumer sc = new SyConsumer();
		try {
			sc.reciveMessage();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2.PTP消息的异步接收
无需等待消息的到来 先发送 后接收

JMS消息的异步接收有点类似于AWT的事件编程,JMS消息消费者并不主动调用receive()方法去接收消息,
	而是采用一种监听器的机制来监听消息目的。当有消息抵达消息目的时,JMS消费者将自动触发它所对应的监听器的监听方法。
	
JMS消息异步接收的编程必须实现消息监听器,异步接收不会阻塞线程,无需一直等待消息的到来,
	如果JMS消息目的有多个消息到来,异步消费者上监听器的监听方法将自动被触发多次。
	如果线程程序没有其他事情可做,而且又没有接收到消息,程序将直接退出。

eg:新建AsyncConSumer类实现MessageListener监听接口

public class AsyncConSumer implements MessageListener {

	//3.PTP异步接收消息
	public AsyncConSumer() throws Exception {

		final String CONNECTION_FACTORY_JNDI = "weblogic.jms.ConnectionFactory";
		Context ctx = getInitalContext();
		ConnectionFactory connFactory = (ConnectionFactory) ctx.lookup(CONNECTION_FACTORY_JNDI);
		Connection conn = connFactory.createConnection();
		Destination dest = (Destination) ctx.lookup("MessageQueue");
		conn.start();
		Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
		MessageConsumer receiver = session.createConsumer(dest);
		//设置一个消息的监听器
		receiver.setMessageListener(this);
		//接收时让线程睡眠多长时间 10s
		Thread.sleep(10000);
		
		session.close();
		conn.close();
		
	}
	
	//1.获取命名服务的Context对象(获取初始化容器)
	private Context getInitalContext() throws Exception {
		
		final String INIT_FACTORY = "weblogic.jndi.WLInitialContextFactory";
		
		final String SERVER_URL = "t3://localhost:7001";
		
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY, INIT_FACTORY);
		props.put(Context.PROVIDER_URL, SERVER_URL);
		
		Context ctx = new InitialContext(props);
		
		return ctx;
	}
		
	@Override//2.监听器
	public void onMessage(Message msg) {
		// TODO Auto-generated method stub
		TextMessage message = (TextMessage) msg; 
		System.out.println(message);
		
		try {
			System.out.println("异步接收到的消息"+message.getText());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	//4.测试
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			//由于构造方法 new的时候会初始化
			AsyncConSumer consumer = new AsyncConSumer();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值