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();
}
}
}