上篇博客写到了JMS两种消息模型(P2P、pub/sub)《JMS两种消息模型》。本篇博客通过一个实例来进一步了解P2P模型。

Queue消息的发送与接收——PTP消息传递模型,样例:

Queue消息的发送与接收:

1。MyQueeuMDBBeanClient.java(Queue消息的发送者)

package com.jinb.cn;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext; public class MyQueeuMDBBeanClient { public static void main(String[] args) throws Exception {
InitialContext context = new InitialContext(); //获得QueueConnectionFactory对象
QueueConnectionFactory factory = (QueueConnectionFactory)context.lookup("ConnectionFactory"); //创建QueueConnection
QueueConnection connection = (QueueConnection)factory.createConnection(); /**
* 通过connection创建QueueSession对象;
* 当中第一个參数为是否支持事务。TRUE为支持,false为不支持。
* 若设为true,则须要手动COMMIT;
* 第二个參数为响应的模式,普通情况下就设为QueueSession.AUTO_ACKNOWLEDGE
* */
QueueSession session = (QueueSession)connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //获取Destination对象
Queue queue = (Queue)context.lookup("queue/myqueue"); //创建文本消息
TextMessage message = session.createTextMessage("你好,我是韩学敏。这是第一个消息驱动Bean"); //创建消息发送者,发送到queue 目的对象
QueueSender sender = session.createSender(queue); //发送消息
sender.send(message); //关闭资源
session.close();
connection.close(); System.out.println("消息已经发送!");
} }

client发送消息的一般步骤:

(1)创建一个JNDI初始化上下文(Context)

   Properties props = new Properties();
props.setProperty(“java.naming.factory.initial”,”org.jnp.interfaces.NamingContextFactory”);
props.setProperty(“java.naming.provider.url”,”localhost:1099”);
props.setProperty(“java.naming.factory.url.pkgs”,”org.jboss.naming:org.jnp.interfaces”);
InitialContext ctx = new InitialContext(props);

或,建立一个jndi.properties文件。

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

   java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

   java.naming.provider.url=localhost

MyQueeuMDBBeanClient.java中写例如以下代码:

InitialContext context = new InitialContext();

(2)依据上下文查找连接工厂TopicConnectFactory/QueueConnectionFactory(有两种连接工厂。依据是topic/queue来使用对应的类型);

//获得QueueConnectionFactory对象

QueueConnectionFactory factory = (QueueConnectionFactory)context.lookup("ConnectionFactory");

(3)从连接工厂得到一个连接(Connect  有两种连接TopicConnection/QueueConnection);

//创建QueueConnection

QueueConnection connection = (QueueConnection)factory.createConnection();

(4)通过连接来建立一个会话(Session);

/**

* 通过connection创建QueueSession对象。

* 当中第一个參数为是否支持事务。TRUE为支持,false为不支持。

* 若设为true,则须要手动COMMIT;

* 第二个參数为响应的模式,普通情况下就设为QueueSession.AUTO_ACKNOWLEDGE

* */

QueueSession session = (QueueSession)connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);

(注:建立不须要事务的而且能自己主动接收消息收条的会话。在非事务Session中。消息传递的方式有三种:

Session.AUTO_ACKNOWLEGE:当客户机调用的receive方法成功返回,或当MessageListenser成功处理了消息,session将会自己主动接收消息的收条。

Session.CLIENT_ACKNOWLEDGE:Session对象依赖于应用程序对已接收到的消息调用确认方法。一旦调用该方法,会话将确认全部自上次确认后收到的消息。

该方法同意应用程序通过一次调用接收、处理和确认一批消息。

Session.DUPS_OK_ACKNOWLEDGE:一旦消息处理中返回了应用程序接收方法,Session对象即确认消息接收,同意反复确认。就资源利用情况而言,此模式最高效。)

(5)查找目的地(Topic/Queue);

Destination destination =(Queue) ctx.lookup(“queue/foshanshop”);

(6)依据会话以及目的地建立消息制造者MessageProducer(扩展了QueueSender和TopicPublisher这两个基本口)

MessageProducer producer = session.createProducer(destination);

TextMessage msg=session.createTextMessage(“你好,我是韩学敏。第一个消息驱动Bean”);//发送文本

producer.send(msg);

2,MyQueueMDBBean.java(Queue消息的接收者)

package com.jinbo.cn;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; //通过注解配置 MDB 是一个什么样的消费者. 这里p2p消费者
@MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/myqueue")
}
)
public class MyQueueMDBBean implements MessageListener { public void onMessage(Message msg) {
//转换为 TextMessage
TextMessage message = (TextMessage)msg;
try {
System.out.println("MyQueueMDBBean被调用了:[" + message.getText() +"]");
} catch (JMSException e) {
e.printStackTrace();
}
}
}

以上代码的凝视解释:

@MessageDriver凝视:指明这是一个消息驱动Bean;

@ActivationConfigProperty凝视:使用此凝视配置消息的各种属性;当中destinationType属性指定消息的类型queue。Destination属性制定消息路径(Destination),消息驱动Bean在公布时,假设路径(Destination)不存在。容器会自己主动创建,当容器关闭时路径将被删除。

执行程序。当一个消息到达queue/muqueue队列,就会触发onMessage方法,消息作为一个參数传入,在onMessage方法里得到消息体并调用print方法把消息内容打印到控制台。

3,JBoss公布。执行结果:

MyQueueMDBBean被调用了:[你好,我是韩学敏。这是第一个消息驱动Bean]

Queue 消息的发送与接收(PTP 消息传递模型)的更多相关文章

  1. 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收

    前言:上一篇文章 只是 RabbitMQ 的科普,本文将仔细分析 Cinder 中 RabbitMQ 的各组件的使用.消息的发送和接收等.由于各流程步骤很多,本文只会使用若干流程图来加以阐述,尽量做到 ...

  2. nodejs 数据库操作,消息的发送和接收,模拟同步

    var deasync = require('deasync'); //导入模板 var mysql=require('mysql'); var Stomp = require('stompjs'); ...

  3. 【Spring Boot】Spring Boot之整合RabbitMQ并实现消息的发送和接收

    一.项目配置 1)引入maven坐标 <!--amqp--> <dependency> <groupId>org.springframework.boot</ ...

  4. Udp实现消息的发送和接收、以及图片的上传

    //Udp实现消息的发送和接收 import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagram ...

  5. msgrcv,msgsnd进程通信,消息的发送和接收

    //进程通信,消息的发送和接收 //client.c #include <unistd.h> #include <sys/types.h> #include <sys/s ...

  6. 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收

    消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...

  7. 使用spring-rabbit测试RabbitMQ消息确认(发送确认,接收确认)

    1.首先是rabbitmq的配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...

  8. RabbitMQ消息确认(发送确认,接收确认)

    前面几篇记录了收发消息的demo,今天记录下关于 消息确认方面的 问题. 下面是几个问题: 1.为什么要进行消息确认? 2.rabbitmq消息确认 机制是什么样的? 3.发送方如何确认消息发送成功? ...

  9. DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

    背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...

随机推荐

  1. 分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小

    原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the co ...

  2. 第14周 项目三-OOP版电子词典

    做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对比的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词.显示词性和中文释义. ...

  3. 趋势科技4月移动client病毒报告

    2014年4月移动client安全威胁概况 截至2014年4月30日,中国区移动client病毒码1.669.60,大小9,792,484字节,能够检測病毒约221万个.移动client病毒约12万个 ...

  4. WPF(布局)

      WPF编程学习——布局   本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面 ...

  5. android内存的一点优化

    android手机给应用分配的内存通常是8兆左右,如果处理内存处理不当很容易造成OutOfMemoryError,我们的产品出现最多的错误也是OutOfMemoryError的异常, 在解决这个异常时 ...

  6. BZOJ 3585: mex( 离线 + 线段树 )

    离线, 询问排序. 先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了 ------------------------ ...

  7. SmartGit 试用过期

    smartgit是见过的最好用的git客户端, 要解决其试用版过期的问题,如下: 1.定位到文件夹 Windows: %APPDATA%\syntevo\SmartGit\OS X: ~/Librar ...

  8. 在JS中,一个自定义函数如何调用另一个自定义函数中的变量

    function aa1511() { var chengshi="马鞍山"; var shengfen="安徽省"; return shengfen+&quo ...

  9. Qt布局管理

    原地址:http://blog.csdn.net/lastsoup/article/details/7028243 设计软件中各个部件的位置排列,有两种方法: 1.设置widget的在父窗体中的坐标和 ...

  10. HBase零基础高阶应用实战(CDH5、二级索引、实践、DBA)

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...