JMS - 基于JMS的RPC

现在试试通过JMS,在应用程序之间发送消息。
先看看spring提供的RPC方案(其实还有其他方案,只是没见过谁用)。
需要使用到这两个类:
·org.springframework.jms.remoting.JmsInvokerServiceExporter将bean导出为基于消息的服务
·org.springframework.jms.remoting.JmsInvokerProxyFactoryBean让客户端调用服务

比较一下JmsInvokerServiceExporter和RmiServiceExporter:

package pac.testcase.jms;
public interface JmsRmiService {
    String doServe(String requestedNum);
}
package pac.testcase.jms;
import org.springframework.stereotype.Service;
@Service
public class JmsRmiServiceImpl implements JmsRmiService {

    public String doServe(String content) {
        System.out.println(content.concat(" has been requested!!"));
        return "your message::".concat(content).concat(":::length:")+content.length();
    }
}

将这个pojo声明为服务,在spring配置文件中配置:

<bean id="serverService" class="org.springframework.jms.remoting.JmsInvokerServiceExporter"
    p:serviceInterface="pac.testcase.jms.JmsRmiService"
    p:service-ref="JmsRmiServiceImpl">
</bean>

需将他设置为jms监听器,配置方法和一般的jmsMessageListener的配置相同:

<amq:connectionFactory id="jmsFactory" />
<jms:listener-container
    destination-type="queue"
    connection-factory="jmsFactory"
    concurrency="3"
    container-type="simple">
    <jms:listener  destination="sparta" ref="serverService"  />
</jms:listener-container>

container-type有simple和default,根据不同的type也可以使用task-Executor,这里先简单记录一下。

先启动jms broker再启动:

new ClassPathXmlApplicationContext("classpath:applicationContext-*.xml").getBean(JmsRmiService.class);

client这边我需要一个调用代理帮我去调用接口,也就是JmsInvokerProxyFactoryBean;
配置如下:

<amq:connectionFactory id="connectionFactory" />
<bean id="clientService" class="org.springframework.jms.remoting.JmsInvokerProxyFactoryBean"
    p:serviceInterface="pac.test.jms.SenderRmiService"
    p:connectionFactory-ref="connectionFactory"
    p:queueName="sparta"/>

配置中的serviceInterface是client端中根据要调用的方法创建的一个接口。

main方法试着调用看看:

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    SenderRmiService service = (SenderRmiService)context.getBean("clientService");
    System.out.println(service.doServe("这才是斯巴达!!"));
}

server端输出:

client端输出:

时间: 2024-10-13 16:29:48

JMS - 基于JMS的RPC的相关文章

基于JMS的消息传送

简单的介绍下基于JMS的消息传送 Java消息队列JMS整体设计结构 基本要素:生产者(producer),消费者(consumere),消息服务(broker) 交互模型: JMS两种消息传送模式 点对点(Point-to-Point):专门用于使用队列Queue传送消息: 发布/订阅(Publish/Subscribe):专门用于使用主题Topic传送消息 两种传送方式比较 基于队列Queue的点对点消息只能被一个消费者消费,如多个消费者都注册到同一个消息队列上,当生产者发送一条消息后,而只

Spring整合JMS——基于ActiveMQ实现

1.1     JMS简介 JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑.对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应:另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. 1.2  

基于Netty打造RPC服务器设计经验谈

自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热情的反馈和若干个优化建议,于是利用闲暇时间,打算对原来NettyRPC中不合理的模块进行重构,并且增强了一些特性,主要的优化点如下: 在原来编码解码器:JDK原生的对象序列化方式.kryo.hessian,新增了:protostuff. 优化了NettyRPC服务端的线程池模型,支持LinkedBl

基于kryonet的RPC,使用kryo进行序列化

Kryo是一个序列化框架. Kryonet是一个基于kryo的RPC框架,它实现了一套高效简洁的API,它通过NIO实现了TCP和UDP通讯,目前还不支持Http. 自己写了一个测试代码,运行了下,感觉还不错,记录下来. 1.listener package com.mytestcodes.kryonet; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; i

Java编写基于netty的RPC框架

一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞I/O在调用InputStream.read()方法是阻塞的,一直等到数据到来时才返回,同样ServerSocket.accept()方法时,也是阻塞,直到有客户端连接才返回,I/O通信模式如下: 图片描述(最多50字) 缺点:当客户端多时,会创建大量的处理线程,并且为每一个线程分配一定的资源;阻塞

spring整合JMS - 基于ActiveMQ实现

一. 开篇语 继上一篇apache ActiveMQ之初体验后, 由于近期一直在复习spring的东西, 所以本文就使用spring整合下JMS. 二. 环境准备 1. ActiveMQ5.2.0 (activemq-all-5.2.0.jar) 2. spring2.5 (spring.jar) 3. JavaEE5 4. JDK1.6 注意: 測试前请先启动ActiveMQserver 三. 代码測试(P2P) 1. MsgSender: 消息生产者 /** * message sender

3,ActiveMQ-入门(基于JMS发布订阅模型)

一.Pub/Sub-发布/订阅消息传递模型 在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端.在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic.topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端. 发布订阅模型就像订阅报纸.我们可以选择一份或者多份报纸,比如:北京日报.人民日报.这些报纸就相当于发布订阅模型中的topic.如果有很多人订阅了相同的报纸,那我们就在同一个topic中注册,对于报纸发行方,它就和

深入浅出JMS(一)--JMS基本概念

摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely

基于ActiveMQ的RPC实现

        上一篇文章<RPC的简单实现>中提到,可以利用MOM来实现RPC.这里就用实例来讲解如何使用Spring+ActiveMQ实现简易的rpc(这里简易的概念是指基本的远程调用,没有监控等功能) 和传统的RPC框架(dubbo,hsf)一样,生产者需要有接口和实现,消费者需要有接口,接口最好以jar包的方式deploy到maven中. 生产者    接口类代码 public interface IService{ String getString(); } 实现类代码 public