该模式的作用是发布者和订阅者 可以相互发送消息

发布者和订阅者都充当 生产者和消费者

发布者

package publisher.to.subscriber;

import java.awt.font.TextMeasurer;

import javax.jms.Connection;
import javax.jms.Destination;

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;

public class Publisher implements MessageListener {

/**
* @param args
* @throws JMSException
*/
public static void main(String[] args) throws JMSException {
// TODO Auto-generated method stub
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

Connection connection = factory.createConnection();
connection.start();
// 第一个参数设置是否需要事务支持
Session session = connection.createSession(true,
Session.AUTO_ACKNOWLEDGE);
// 发送消息 而 订阅者接受消息必须有个topic 名字也叫 msg.send
Destination sendTopic = new ActiveMQTopic("msg.message");
// 接受消息 而 订阅者发送消息必须有个topic 名字也叫 msg.receive
Destination sendReceive = new ActiveMQTopic("msg.control");
MessageProducer producer = session.createProducer(sendTopic);
MessageConsumer consumer = session.createConsumer(sendReceive);
Rec rec = new Rec(consumer,session,connection,producer);
rec.start();

}

public void onMessage(Message msg) {
// TODO Auto-generated method stub

}

}

class Rec extends Thread {
private MessageConsumer consumer = null;
private Session session = null;
private Connection connection=null;
MessageProducer producer=null;
public Rec(MessageConsumer consumer, Session session,Connection connection,MessageProducer producer) {
this.consumer = consumer;
this.session = session;
this.connection=connection;
this.producer=producer;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
TextMessage smsg = session.createTextMessage("hello my name is liaomin");
producer.send(smsg);
session.commit();
TextMessage msg = (TextMessage) consumer.receive();
System.out.println(msg.getText());
// 接收时必须提交以下 否则会出现上次收到的旧数据
session.commit();
session.close();
connection.close();
break;
} catch (Exception e) {
}

}
}

}

订阅者

package publisher.to.subscriber;

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;

public class Subscriber {

/**
* @param args
* @throws JMSException
*/
public static void main(String[] args) throws JMSException {
// TODO Auto-generated method stub
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

Connection connection = factory.createConnection();
connection.start();
// 第一个参数设置是否需要事务支持
Session session = connection.createSession(true,
Session.AUTO_ACKNOWLEDGE);
//订阅者接受消息
Destination receiveTopic = new ActiveMQTopic("msg.message");
//订阅者发送消息
Destination sendTopic = new ActiveMQTopic("msg.control");
MessageProducer producer = session.createProducer(sendTopic);
MessageConsumer consumer = session.createConsumer(receiveTopic);
Rec1 rec = new Rec1(consumer,session,connection,producer);
rec.start();

}

public void onMessage(Message msg) {
// TODO Auto-generated method stub

}

}
class Rec1 extends Thread {
private MessageConsumer consumer = null;
private Session session = null;
private Connection connection;
private MessageProducer producer;
public Rec1(MessageConsumer consumer, Session session,Connection connection,MessageProducer producer) {
this.consumer = consumer;
this.session = session;
this.connection=connection;
this.producer=producer;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
TextMessage msg = (TextMessage) consumer.receive();
session.commit();
System.out.println(msg.getText());
TextMessage remsg = session.createTextMessage("ok receive");
producer.send(remsg);

// 接收时必须提交以下 否则会出现上次收到的旧数据
session.commit();
session.close();
connection.close();
break;
} catch (Exception e) {
}

}
}

}

先运行 订阅者 在运行 发布者

Publisher/Subscriber(发布/订阅者)消息模式开发流程的更多相关文章

  1. JavaScript实现的发布/订阅(Pub/Sub)模式

    JavaScript实现的发布/订阅(Pub/Sub)模式 时间 2016-05-02 18:47:58  GiantMing's blog 原文  http://giantming.net/java ...

  2. Kafka 分布式的,基于发布/订阅的消息系统

    Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 高吞吐量:即使是非常 ...

  3. kafka高吞吐量的分布式发布订阅的消息队列系统

    一:kafka介绍kafka(官网地址:http://kafka.apache.org)是一种高吞吐量的分布式发布订阅的消息队列系统,具有高性能和高吞吐率. 1.1 术语介绍BrokerKafka集群 ...

  4. node-amqp 使用fanout发布订阅rabbitmq消息

    publisher代码 const amqp = require('amqp'); let option = { host: 'server-ip', port: 5672, login: 'gues ...

  5. redis实现消息队列&发布/订阅模式使用

    在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面做记录.   Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性 ...

  6. JMS 企业开发流程实现

    关于JMS的一些介绍参见[http://blog.csdn.net/aking21alinjuju/article/details/6051421] [补充] 消息的组成 1. 头(head) 每条J ...

  7. “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式

    在上一篇,“一切都是消息”--MSF(消息服务框架)之[请求-响应]模式 ,我们演示了MSF实现简单的请求-响应模式的示例,今天来看看如何实现[发布-订阅]模式.简单来说,该模式的工作过程是: 客户端 ...

  8. “一切都是消息”--iMSF(即时消息服务框架)之【发布-订阅】模式

    MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately)消息,所以iMSF就是 immediately Message S ...

  9. 【EasyNetQ】- 发布/订阅模式

    EasyNetQ支持的最简单的消息传递模式是发布/ 订阅.这种模式是消除消费者信息提供者的绝佳方式.出版商简单地向全世界说,“这已经发生了”或“我现在有了这些信息”.它不关心是否有人正在倾听,他们可能 ...

随机推荐

  1. jQuery滚动条插件 – jquery.slimscroll.js

    jquery.slimscroll.js插件是一个支持把内容放在一个盒子里面,固定一个高度,超出的则使用滚动.jquery.slimscroll.js不仅可以定义高度.宽度,还可以定义位置.滚动条大小 ...

  2. 浅谈 Android 开发文化

    Hello,亲爱的读者朋友们(希望你们是 Android 开发者,或者正在成为 Androider 的路上-)! 质量从用户反馈很清凉然后我们就只能看 CPU 原来的想法是但是事实上不是这些但是我们可 ...

  3. Java运算符(一)equals方法与“==”

    超类Object的equals只是比较两者之间的引用对象是否相同,这一点跟操作符“==”是一样的. 在基本数据类型中,“==”用于比较两者之间的值(内容)是否相等. 在引用类型中,“==”用于比较两者 ...

  4. [OJ] Lowest Common Ancestor

    LintCode 88. Lowest Common Ancestor (Medium) LeetCode 236. Lowest Common Ancestor of a Binary Tree ( ...

  5. 转载:win7JDK环境配置

    [win7JDK环境配置] 网址:http://blog.sina.com.cn/s/blog_6a9df2330100ms9q.html 系统变量下: (1) 新建->变量名:JAVA_HOM ...

  6. 33个优秀的HTML5应用演示 (转)

    33个优秀的HTML5应用演示 (转) HTML5能做什么?取代Flash?制作动画?开发程序应用?这些都只是HTML5的一小部分功能而已. 大家可能听到很多关于Flash是否会被HTML5取代的讨论 ...

  7. bzoj2186

    首先我们看到题目要求的是1~N!内有M!互质的个数 N!>M!,而我们是知道在M!以内与M!互质的数的个数,即phi(M!) 但是M!~N!内与M!互质的数有多少个呢? 对于每个互质的数,如果我 ...

  8. CUDA编程-(2)其实写个矩阵相乘并不是那么难

    程序代码及图解析: #include <iostream> #include "book.h" __global__ void add( int a, int b, i ...

  9. Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1841  Solved: 598[Submit][Status] ...

  10. Python运行机制

    闲来无事,简单画了一下Python的运行机制,纯属娱乐: