文档章节

【java-activemq】 请求应答模式

_______-
 _______-
发布于 2017/09/06 16:16
字数 598
阅读 9
收藏 1
点赞 0
评论 0

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
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.broker.BrokerService;


/**
 *  这里server端要执行的过程和client端相反,它是先接收消息,在接收到消息后根据提供的JMSCorelationID来发送返回的消息
 * @author JS-007
 *
 */
public class Server  {
    private static String messageBrokerUrl;
 
    private Session session;
    private MessageProducer replyProducer;
 
    static {
        messageBrokerUrl = "tcp://localhost:61616";
    }
 
    public Server() {
        try {
            BrokerService broker = new BrokerService();
            broker.setPersistent(false);
            broker.setUseJmx(false);
            broker.addConnector(messageBrokerUrl);
            broker.start();
        } catch (Exception e) {
            
        }
 
        this.setupMessageQueueConsumer();
    }
 
    private void setupMessageQueueConsumer() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(messageBrokerUrl);
        Connection connection;
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            this.session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            
            //Producer
            this.replyProducer = this.session.createProducer(null); //设置一个消息生成器响应来自客户端的消息,我们将从一个消息发送到从jmsreplytoheader字段发送到的目的地
            this.replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            
            //consumer
            Destination adminQueue = this.session.createQueue("client.messages");
            MessageConsumer consumer = this.session.createConsumer(adminQueue);//设置消费者从管理队列中消费消息
            consumer.setMessageListener(new MessageListener(){

				@Override
				public void onMessage(Message message) {
					try {
			            TextMessage response = session.createTextMessage();
			            if (message instanceof TextMessage) {
			                TextMessage txtMsg = (TextMessage) message;
			                String messageText = txtMsg.getText();
			                
			                String responseText;
			                if ("MyProtocolMessage".equalsIgnoreCase(messageText)) {// 判断是否是client传过来的信息,在这里就可以做些解析
			                    responseText = "服务端返回给你消息了";
			                } else {
			                    responseText = "我不知道你传的是什么: " + messageText;
			                }
			                response.setText(responseText);
			            }
			 
			            //从接收到的消息中设置相关ID为响应消息的相关ID
			            //这可以让客户端识别该消息的响应
			            //向服务器发送的一个未完成的消息
			            response.setJMSCorrelationID(message.getJMSCorrelationID());
			 
			            //将响应发送到接收消息的JMSReplyTo字段指定的目的地,
			            //这大概是客户创建的临时队列
			           replyProducer.send(message.getJMSReplyTo(), response);
			        } catch (JMSException e) {
			            //妥善处理异常
			        }
				}
            	
            });
        } catch (JMSException e) {
            
        }
    }
 
 
    public static void main(String[] args) {
        new Server();
    }
}


import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.util.Random;


/**
 * 
 *client端创建一个临时队列并在发送的消息里指定了发送返回消息的destination以及correlationID。那么在处理消息的server端得到这个消息后就知道该发送给谁
 * @author JS-007
 *
 */
public class Client {
 
    private MessageProducer producer;
 
    public Client() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection;
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            
            //producer
            Destination adminQueue = session.createQueue("client.messages");
            producer = session.createProducer(adminQueue);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            
            //consumer
            Destination tempDest = session.createTemporaryQueue();
            MessageConsumer responseConsumer = session.createConsumer(tempDest);
            responseConsumer.setMessageListener(new MessageListener(){
				@Override
				 public void onMessage(Message message) {
			        String messageText = null;
			        try {
			            if (message instanceof TextMessage) {
			                TextMessage textMessage = (TextMessage) message;
			                messageText = textMessage.getText();
			                System.out.println("客户端等待服务端应答 = " + messageText);
			            }
			        } catch (JMSException e) {
			           
			        }
			    }
            });
 
            TextMessage txtMessage= createTextMessage(session,tempDest);
            this.producer.send(txtMessage);
        } catch (JMSException e) {
        	
        }
    }
    
    private TextMessage createTextMessage(Session session,Destination tempDest) {
		TextMessage txtMessage=null;
		try {
			txtMessage = session.createTextMessage();
			txtMessage.setText("MyProtocolMessage1");
			txtMessage.setJMSReplyTo(tempDest);
			String correlationId = createRandomString();
			txtMessage.setJMSCorrelationID(correlationId);
		} catch (JMSException e) {
			e.printStackTrace();
		}
        return txtMessage;
    }
 
    private String createRandomString() {
        Random random = new Random(System.currentTimeMillis());
        long randomLong = random.nextLong();
        return Long.toHexString(randomLong);
    }
 
    public static void main(String[] args) {
        new Client();
    }
}

© 著作权归作者所有

共有 人打赏支持
_______-
粉丝 3
博文 92
码字总数 36164
作品 0
浦东
程序员
ActiveMQ学习记录 之 消息持久化

1:前言 这一段给公司开发消息总线有机会研究ActiveMQ,今天撰文给大家介绍一下他的持久化消息。本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle。下面逐一介绍。 A:持久化为文件 这...

李格尔楞
2017/11/01
0
0
activemq基于jdbc的master/slave模式

activemq的jdbc master/slave模式,基于mysql数据库 1、添加数据源,在apache-activemq-5.11.1-1和apache-activemq-5.11.1-2的activemq.xml文件</broker>标签之后添加如下内容 <!--mysql jd......

chaun
2015/08/17
0
0
springJMS+activeMQ实践

运行环境:jdk1.6 ,javaEE5 , spring2.5 ,activeMQ5.4.3. 一定要注意activeMQ的版本与jdk的兼容性,最新的activeMQ版本估计要在jdk1.7以上才能运行。 先说一下activeMQ的安装: 1、下载:h...

wangrikui
2015/06/28
0
2
2.ActiveMQ消息队列安装使用

全程是MOM (Message Oriented Middleware) 消息中间件 消息中间件有很多,比如: 1.ActiveMQ java语言编写的和java系统结合紧密 2.RabbitMQ Erlong语言开发的,天生支持高并发,性能优于A...

小杰java
2017/10/26
0
0
JMS配置说明-----activeMQ-5.6

1 简介 activeMQ是一个完全支持JMS1.1 和J2EE规范的JMS Provider实现; 尽管规范出台已经是很久的事情了,但JMS在当今的J2EE应用中仍然扮演着特殊的地位; 特性列表 多种语言和协议编写客户端...

次渠龙哥
06/26
0
0
ActiveMQ 消息服务(二)

本文介绍ActiveMQ的几种通信方法: 本文转自:http://shmilyaw-hotmail-com.iteye.com/blog/1897635 这篇文章总结的太好了,不得不转啊! 简介 在前面一篇文章里讨论过几种应用系统集成的方式...

Andy市民
2015/11/06
0
0
ActiveMQ 5.15.x Release安装和配置--Linux篇

阅读目录: 1. 关闭防火墙和Selinux 2. 下载并安装ActiveMQ 5.15.x Release版本 3. 启动并验证 4.配置ActiveMQ 5.15.x Release自启动 5.注意事项以及说明 1. 关闭防火墙和Selinux Linux的防火...

loubobooo
2017/11/26
0
0
ActiveMQ:Communications link failure问题以及解决办法

ActiveMQ版本:5.5.1 MQ 所使用的 MySQL 是 InnoDB存储引擎 记录人:@郑昀现象: 业务表面现象:无。系统现象:无。 日志信息:业务系统发送 MQ 消息时,下面这种错误日志断断续续地一直都有...

旁观者-郑昀
2012/11/10
0
0
activeMQ5官方文档翻译-初始化配置

首先你需要把jar包加到classpath 所需的jar包 为了使ActiveMQ更容易使用,默认的activemq-all.jar包包含了所有需要用到的库文件。如果你喜欢以明确的控制jar包的方式来使用ActiveMQ,那下面是...

z_jordon
2015/05/29
0
0
Linux 安装ActiveMQ(使用Mac远程访问)

阅读本文需要安装JDK 一 ActiveMQ简介 activemq是用java语言编写的一款开源消息总线 activemq是apache出品 activemq消息的传递有两种类型 一种是点对点(即一个生产者和一个消费者一一对应) 另...

梦三
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

打印斐波那契数

package com.jerry.ch04;public class PrintFibonacci {public static void main(String[] args) {for (int i=0; i<10; i++) {System.out.print(fib(i) + " ");}......

JerryNing
11分钟前
0
0
shell编程

一、shell脚本介绍

人在艹木中
11分钟前
0
0
istio 0.8 遥测 案例

==============遥测===================================== 演示如何从网格中收集遥测信息。 分布式跟踪。如何配置代理以向Zipkin或Jaeger发送跟踪请求 收集度量标准和日志。此任务说明如何配...

xiaomin0322
13分钟前
0
0
ND4J求多元线性回归以及GPU和CPU计算性能对比

上一篇博客《梯度下降法求多元线性回归及Java实现》简单了介绍了梯度下降法,并用Java实现了一个梯度下降法求回归的例子。本篇博客,尝试用dl4j的张量运算库nd4j来实现梯度下降法求多元线性回...

冷血狂魔
15分钟前
0
0
springboot常用注解

@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration、@ComponentScan 通常用在主类上。 @Service: 用于标注业务层组件。 @RestController: 用于标注控制层组件(如strut...

GoldenVein
21分钟前
1
0
如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
35分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
35分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
46分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
今天
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部