核心概念:

Ø连接工厂(ConnectionFactory)客户端用来创建连接的管理对象。
Ø连接(Connection)代表一个与JMS提供者的活动连接。
Ø目的(Destination)标识消息接收方式。
Ø会话(Session)接收和发送消息的会话线程。
Ø消息生产者(MessageProducer)会话使用它把消息发送到目的地。
Ø消息消费者(MessageConsumer)会话使用它从目的地接收消息生产者发送的消息
1.发送消息的客户端使用JMS的过程

(1)使用JNDI查询管理对象ConnectionFactory和Destination

(2)使用管理对象ConnectionFactory建立连接Connection

(3)使用连接Connection建立会话Session

(4)使用会话Session和管理对象Destination创建消息生产者MessagerProducer

(5)使用消息生产者MessagerPriducer发送消息

2.接收消息的客户端使用JMS的过程

(1)使用JNDI查询管理对象ConnectionFactory和Destination

(2)使用管理对象ConnectionFactory建立连接Connection

(3)使用连接Connection建立会话Session

(4)使用会话Session和管理对象Destination创建消息生产者MessagerProducer

(5)使用消息生产者MessagerConsumer接收消息

3. JMS中支持两种事务方式:事务性会话和JTA事务

  a)创建事务性会话的代码:

  qsession=qcon.createQueueSession(true; //在PTP方式下创建事务性会话

  Session.AUTO_ACKNOWLEDGE

  );

  tsession=tcon.createTopicSession(

  true; //在Pub/Sub方式下创建事务性会话

  Session.AUTO_ACKNOWLEDGE

  );

b)JTA事务:JTA支持跨数据源的事务,步骤如下:

(1)创建非事务性会话

QueuesSession session=connection.createQueueSession(

false,Session.AUTO_ACKNOWLEGE);

(2)使用JNDI查询JTA事务引用

Context ctx = new InitialContext();

UserTansaction ux=(UserTansaction)ctx.lookup

(“javax.transaction.UserTansaction”);

(3)开始事务

ux.begin();

(4)执行业务操作

(5)提交或回滚事务

提交事务:ux.commit();

回滚事务:ux.rollback();

服务区端代码

package test.jms;

import javax.jms.*;
import javax.naming.*;

public class Server {
  private static Server instance = new Server();
  private  TopicSession tsession = null;
  private  Topic topic = null;
  private  TopicPublisher tpub = null;

private TopicConnectionFactory tcf = null;
  private TopicConnection tconn = null;
  private Context ctx = null;

private Server() {
    init();
  }

public static Server getInstance(){
    return instance;
  }

public void sendMessage(MessageInfo msgInfo){
    int tryTimes = 0;
      while(true){
        try {
          if(msgInfo == null){
            break;
          }
          Message msg = tsession.createMessage();
          msg.setStringProperty("xxxx", msgInfo.getxxxx());
          msg.setStringProperty("xxxx", msgInfo.getxxxx());
          msg.setStringProperty("xxxx", msgInfo.getxxxx());
          msg.setStringProperty("xxxx", msgInfo.getxxxx());
          msg.setStringProperty("xxxx", msgInfo.getxxxx());
          msg.setIntProperty("xxxx", msgInfo.getxxxx());

tpub.publish(msg);
          break;
        }
        catch (Exception e) {
          if (!init()) {
            if (tryTimes < 20) { //默认15分钟可以恢复数据库连接,这里冗余一部分
              tryTimes++;
              try{
                Thread.sleep(60000); //一分种后重试
              }
              catch(Exception ex){
                Logger.log(Logger.DEBUG_TYPE,ex);
              }
              continue;
            }
            else{
              System.out.println("系统消息机制异常,系统将自动退出!请进行系统恢复!");
              SysTool.exit(0);
              return;
            }
          }
        }
      }

}

private boolean init() {
    try {
      try{
        tpub.close();
      }
      catch(Exception ex){ }
      try{
        tsession.close();
      }
      catch(Exception ex){  }
      try{
        tconn.close();
      }
      catch(Exception ex){  }
      try{
        ctx.close();
      }
      catch(Exception ex){ }

ctx = new InitialContext();
      tcf = (TopicConnectionFactory)ctx.lookup(
        "ConnectionFactory");
      tconn = tcf.createTopicConnection();
      tsession = tconn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
      topic = (Topic)ctx.lookup("topic/xxxxTopic");
      tpub = tsession.createPublisher(topic);
      tconn.start();
      return true;
    }
    catch (Exception e) {
      Logger.log(Logger.DEBUG_TYPE, e);
      return false;
    }
  }

}

客户端代码

package test;
import java.util.Hashtable;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class JMSClinet {
  public static void main(String[] args) {

while(true){
        try {
            TopicSession tsession = null;

TopicSubscriber tsub = null;
            Hashtable ht = new Hashtable();
            ht.put(Context.INITIAL_CONTEXT_FACTORY,
                    "org.jnp.interfaces.NamingContextFactory");
            ht.put(Context.PROVIDER_URL, "ip地址:1099");
            ht.put("java.naming.rmi.security.manager", "yes");
            ht.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");

Context ctx = new InitialContext(ht);

TopicConnectionFactory factory = (TopicConnectionFactory) ctx
                    .lookup("ConnectionFactory");

TopicConnection connection = factory.createTopicConnection();

TopicSession session = connection.createTopicSession(false,
                    Session.AUTO_ACKNOWLEDGE);

Topic topic = (Topic) ctx.lookup("topic/logInAndOutTopic");

tsub = session.createSubscriber(topic);

connection.start();
            Message msg = tsub.receive();
            String xxxx= msg.getStringProperty("xxxx");
            String xxxx= msg.getStringProperty("xxxx");
            String xxxx= msg.getStringProperty("xxxx");
            String xxxx= msg.getStringProperty("xxxx");
            String xxxx= msg.getStringProperty("xxxx");
            int xxxx= msg.getIntProperty("xxxx");     
            connection.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        }
    }

}

配置文件

<mbean code="org.jboss.mq.server.jmx.Topic"
  name="jboss.mq.destination:service=Topic,name=xxxxTopic">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    <depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
    <attribute name="SecurityConf">
       <security>
         <role name="xxxx" read="true" write="true"/>
         <role name="xxxx" read="true" write="true" create="false"/>
         <role name="xxxx" read="true" write="true" create="true"/>
      </security>
    </attribute>
 </mbean>

转载于:https://www.cnblogs.com/davidwang456/archive/2013/01/22/2871924.html

jms在jboss上的简单应用相关推荐

  1. openshift学习_在OpenShift上将JMS与JBoss A-MQ结合使用。 学习了有关远程客户端和加密的经验。...

    openshift学习 OpenShift是"红帽开发的开放式混合云应用程序平台". 它具有不同的风格,对于大多数您想做的事情,最有趣的部分是公共云应用程序开发和托管平台" ...

  2. 在OpenShift上将JMS与JBoss A-MQ结合使用。 从远程客户端和加密中学到的经验教训。...

    OpenShift是"红帽开发的开放式混合云应用程序平台". 它具有不同的风格,对于大多数您想做的事情,最有趣的部分是公共云应用程序开发和托管平台" OpenShift ...

  3. 史上最简单的openshift免费空间上传代码教程!没有之一!

    史上最简单的openshift免费空间上传代码教程!没有之一! 最近因为想弄一个免费的空间,而且最好是java的空间,找了一大片,jsp的空间少不说,免费的更是寥寥无几.  找了一大推垃圾空间,终于让 ...

  4. linux只有上传文件到站点,史上最简单的上传文件到linux系统方法

    史上最简单的上传文件到linux系统方法 工具/原料 linux,windows filezilla 方法/步骤 1 下载 Filezilla client工具,此客户端为免费软件,下载完成后安装,安 ...

  5. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    最新Finchley版本请访问: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 或者 http://blog.csd ...

  6. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  7. 2016第18本:世界上最简单的会计书

    从周叶的微信公众号zyea_com中发现了这本书<世界上最简单的会计书>,自己也听说过资产负债表.损益表和现金流量表等名词,但从来没搞清楚过这些表格的意思.所以读此书的目的是想着理财过程中 ...

  8. 历史上最简单的一道Java面试题,但无人能通过

    作者:方志宏 来源:zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道java面试题了. 题目很简单,完成代码,判断一个整数是否是奇数: public boolea ...

  9. 在Windows Server 2008上创建 简单卷

    简单卷 一个简单卷就是驻留在一个动态磁盘上的单一的卷.简单卷是物理磁盘的一部分,但它工作时就好像是物理上的一个独立单元.我们可以从动态磁盘的未分配空间来创建简单卷,但当只有一个动态磁盘时,简单卷是我们 ...

最新文章

  1. matlab的yalmip为什么这么慢,Yalmip问题请教
  2. 【剑指offer - C++/Java】8、跳台阶
  3. android 16 登陆,那些年我们一起养过的电子鸡登陆Android平台
  4. Windows Vista和局域网聊天的计算机
  5. Pandas数据类型及操作
  6. windows创建任务计划(周期执行bat脚本)
  7. 使用postman测试post类型请求
  8. python与开源gis_Python与开源GIS:数据处理、空间分析与地图制图
  9. 使用Laravel和Vue.js2.5进行服务器端渲染
  10. AntDesign 表格设置背景色
  11. 中国气象台API(2017.09)
  12. 揭秘你所看不见的技术原理 - 广告推荐系统
  13. java socket 聊天室_java利用Socket实现聊天室功能实例
  14. AWS中国(北京)区域正式在中国商用
  15. 苹果xr截屏怎么截_原来苹果手机自带长截屏功能!以前一直不知道,真让人相见恨晚...
  16. 【病毒】【CPU使用率为100%】Linux 被 kdevtmpfsi 挖矿病毒入侵
  17. 在5G智慧园区的“保龄球道”上,目标全垒打的征途
  18. 在 F1 Delta Time 大奖赛中找到对速度的热爱
  19. C语言extren关键字详解
  20. 啤酒游戏及其牛鞭效应的模拟之二级模式

热门文章

  1. pemicro识别不了驱动_usb驱动无法识别怎么办-usb驱动无法识别通常解决办法 - 河东软件园...
  2. 会员直推奖php程序_PHP自适应卡益源码 前台直销源码 报单费 直推奖 有内部商城...
  3. abaqus单位怎么设置_ABAQUS-怎样模拟塑料瓶的抗挤压能力?
  4. oracle dataguard in-memory,Oracle 11g Dataguard 物理备库配置(一)之Duplicate配置
  5. android打开视频噔_android: 播放视频
  6. 新版pycharm,亮瞎我的狗眼
  7. 网狐棋牌客户端连接服务器修改方法6,网狐游戏服务器 客户端连接
  8. python链表翻转_反转链表(两种Python解法)
  9. visual studio输入法打不了中文_目前比较满意的手机输入法方案:Gboard + 搜狗词库...
  10. 6-spark学习笔记-spark core 数据与存储