Spring最佳实践- 9.3 集成Java消息服务

15 篇文章 0 订阅
1 篇文章 0 订阅

Spring核心技术与最佳实践- 9.3 集成Java消息服务

 

 

9.3 集成Java消息服务

 

Java消息服务,即JMS(Java Message Service),是JavaEE标准中为企业应用程序提供消息传递服务的API标准,JMS使得异步发送和接受事件通知的应用程序变得容易设计和实现。

       在Spring框架中,同样为JMS提供了非常好的封装,使JMS使用起来更加方便。

 

 

 

9.3.1 Java消息服务概述

 

大多数时候,应用程序内容的各个对象间都是以同步的方式进行方法调用的。当一个方法被调用的时,当前线程的控制权就转移到了这个方法中,知道方法执行完毕,线程的控制权才返回给调用者。

 

如果要执行一个非常耗时的方法,会使当前线程的执行变得缓慢,从而引起用户长时间等待。为了避免同步调用来执行一个耗时的任务,可以在一个新的线程中执行这个耗时的任务,原来的线程则不必等待,就可以立刻继续执行下去。

 

       相当于多线程模型,使用消息机制能更好的实现异步调用,而不必处理复杂的线程管理问题。JMS为Java应用程序提供了完整的一部消息服务机制。

 

       读者可能会问,Spring的ApplicationContext容器本身也支持事件发布,类似消息传递,能否替代JMS呢?答案是否定的。因为Spring的ApplicationContext容器不支持异步事件处理,同步会使应用程序性能大打折扣。此外,JMS并不要求通信双方一定要在同一台机器上,可以将发送消息和处理消息的应用程序部署在不同的机器上。JMS还提供了持久化服务,这是Spring的ApplicationContext容器无法做到的。

 

直接使用JMS API比较复杂,而Spring对JMS做了非常方便的封装,读者需要注意,在Spring1.x版本中,仅对发送JMS消息进行了封装,而接受JMS消息的封装在Spring2.0版本中才被添加进来。

 

 

 

 

9.3.2 JMS编程模型

 

JMS支持两种消息发送模式:点对点模式和发布-订阅模式。

在点对点模式下,消息的发送是一对一的,消息在两个实体间进行单项传递。点对点模式使用Queue来传递消息:

 

 

 

在发布-订阅模式下,消息的发送是一对多的。消息的发送者只需要发送消息,而凡是订阅了该消息的实体都可以接收到消息。

 

 

 

 

 

 

最初的JMS1.0 规范对这两种模式定义的接口是不同的,这意味着开发人员在编写JMS代码时,必须清楚地知道使用那种模式来发送消息。辛运的是,在JMS1.1 标准中,这两种模式的接口完全统一了,开发人员不必关心究竟使用哪种模式来发送消息,而使用何种消息模式被定义在了服务器的相关配置中,也就是说,使用点对点模式还是发布订阅模式只需要修改服务器的设置即可。JMS1.1 中统一的API使得JMS代码更简单,更易于维护,并且代码复用性也更好。

 

 

 

以下表中显示了点对点模型和发布-订阅模型的主要接口,以及在JMS1.1中同一的接口。

点对点模型

发布-订阅模型

JMS1.1 的同一接口

QueueConnectionFactory

TopicConnectionFactory

ConnectionFactory

QueueConection

TopicConnection

Connection

Queue

Topic

Destination

QueueSession

TopicSession

Session

QueueSender

TopicPublisher

MessageProducer

QueueReceiver

TopicSubscnber

MessageConsumer

 

 

使用JMS1.1 就无需关心两种模式的不同的接口,而只需使用同一的接口。

 

 

 

 

9.3.3 使用JMSAPI

 

为了在命令程序中使用JMS测试,需要一个JMS服务器的实现。SUN提供了一个免费的mom4j的JMS实现,它完整地支持JMS1.1标准,可以从http://mom4j.sourceforge.net下载,不过,在使用mom4j之前,还需要手动下载JMS接口库和mom4j依赖的几个第三方库,然后用Ant编译源代码。

 

 

 

 

 

 

 

 

 

 

在Eclipse中建立如下的JMS工程。

 

Mom4jUtil负责初始化并启动JMS服务器,同时绑定ConnectionFactory和Queue到JNDI上,然后,在Sender类中,就可以发送JMS消息了。

 

 

 

public class Sender extends Thread {

 

    public void run() {

        try {

        //初始化上下文,获取一个JNDI连接

            Context ctx = new InitialContext();

            //查找一个JMS连接工厂

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

            //创建一个JMS目的地队列(Queue)

            Destination destination = (Destination) ctx.lookup("jms/queue");

            for(;;) {

                Connection connection = null;

                try {

                  //通过JMS连接工厂创建连接

                    connection = factory.createConnection();

                    //创建JMS会话

                    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

                    //创建消息生产者

                    MessageProducer producer = session.createProducer(destination);

                    String text = "Hello, it is " +new Date();

                    System.out.println("   Send: " + text);

                    //创建一个文本消息

                    Message message = session.createTextMessage(text);

                    producer.send(message); //发送消息

                    producer.close();

                    session.close();

                }finally {

                    if(connection!=null){

                       connection.close();

                    }                       

                }

                Thread.sleep(1000 + (long)(Math.random() * 5000));

            }

        }catch(Exception e) {

            e.printStackTrace();

        }

    }

}

 

Sender类以随机的间隔发送TextMessage消息。为了能够发送JMS消息,需要从JNDI获得ConnectionFactory和Destination对象。ConnectionFactory将用于创建到JMS服务器的链接,Destination则指定了消息的目的地,即消息将发向何处。

 

 

       接受JMS消息和发送类似,也需要通过ConnectionFactory创建到JMS服务器的链接,Destination指定从何处接受消息。此外,接受者必须实现MessageListener接口以便服务器回调。Receiver类将接收到的TextMessage打印出来。

 

 

public class Receiver extends Threadimplements MessageListener {

 

    public void run() {

        try {

            Context ctx = new InitialContext();

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

            Destination destination = (Destination) ctx.lookup("jms/queue");

            Connection connection = null;

 

            try {

                connection = factory.createConnection();

                Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

                //创建消息接受者

                MessageConsumer consumer = session.createConsumer(destination);

                consumer.setMessageListener(this);

                connection.start();//启动JMS连接,允许传从消息

                Thread.sleep(20000);

            }finally {

                if(connection!=null){

                  connection.close();

                }

            }

        }catch(Exception e) {

            e.printStackTrace();

        }

    }

 

    /**

     * 接受来自MessageProducer的消息

     */

    public void onMessage(Message message) {

        if(messageinstanceof TextMessage) {

            TextMessage text = (TextMessage) message;

            try {

                System.out.println("Receive: " + text.getText());

            }

            catch(JMSException e) {

                e.printStackTrace();

            }

        }

    }

}

 

在main方法中启动JMS服务器,然后分别启动发送和接受线程。

 

public class Main {

 

    public static void main(String[] args)throws Exception {

        Mom4jUtil.startJmsServer(); //启动 jms服务

       

        new Sender().start();//发送消息

        new Receiver().start();//接受消息

       

        Thread.sleep(30000); //主程序等待30秒退出

        System.exit(0);

    }

}

 

 

可以看到如下输出:

 

   Send: Hello, it is Sun Apr 22 16:10:03 CST 2012

Receive: Hello, it is Sun Apr 22 16:10:03 CST 2012

   Send: Hello, it is Sun Apr 22 16:10:07 CST 2012

Receive: Hello, it is Sun Apr 22 16:10:07 CST 2012

   Send: Hello, it is Sun Apr 22 16:10:12 CST 2012

Receive: Hello, it is Sun Apr 22 16:10:12 CST 2012

 

 

从上面的例子可以看到,直接使用JMS API发送和接受消息都是比较复杂的,并且没有很好的封装成组建。幸运的是,Spring对JMS提供了非常简单的封装。通过使用Spring提供的JmsTemplate模板,操作JMS就易如反掌了。下面,我们看看在Spring中配置JMS组组件的方法。

 

 

 

9.3.4 Spring如何封装JMS

为了演示在Spring环境下操作JMS,我们建立了一个JMS_Spring工程。

Spring提供了JmsTemplate模板来简化JMS操作。利用JmsTemplate,Sender只需被注入JmsTemplate,发送的消息通过MessageCreator以回调的方式创建,这个发送过程非常简单。

 

public class Sender {

 

    private JmsTemplatejmsTemplate;

 

    public void setJmsTemplate(JmsTemplate jmsTemplate) {

        this.jmsTemplate = jmsTemplate;

    }

 

    public void send(final String text) {

        System.out.println("   Send: " + text);

        jmsTemplate.send(new MessageCreator() {

            public Message createMessage(Session session)throws JMSException {

                return session.createTextMessage(text);

            }

        });

    }

}

 

其所需要的JMS资源全部定义在XML配置文件中。

 

<beanid="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">

    <propertyname="jndiName"value="QueueConnectionFactory"/>

</bean>

<beanid="jmsQueue"class="org.springframework.jndi.JndiObjectFactoryBean">

    <propertyname="jndiName"value="jms/queue"/>

</bean>

<beanid="jmsTemplate"class="org.springframework.jms.core.JmsTemplate">

    <propertyname="connectionFactory"ref="jmsConnectionFactory"/>

    <propertyname="defaultDestination"ref="jmsQueue"/>

</bean>

<beanid="sender"class="com.zsw.spring.jms.Sender">

    <propertyname="jmsTemplate"ref="jmsTemplate"/>

</bean>

 

对于接受消息的Receiver类,则仅实现了MessageListener接口,甚至没有注入任何JMS资源。

 

public class Receiver implements MessageListener {

 

    @Override

    public void onMessage(Message message) {

        if(messageinstanceof TextMessage) {

            TextMessage text = (TextMessage) message;

            try {

                System.out.println("Receive: " + text.getText());

            }catch(JMSException e) {

              e.printStackTrace();

            }

        }

    }

}

 

Spring提供了MessageListener容器来包裹MessageListener。通常情况下,使用DefaultMessageListenerContainer就足够了,只需要在XML配置文件中定义。

 

<beanid="receiver"class="com.zsw.spring.jms.Receiver"/>

<beanid="listenerContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer">

    <propertyname="connectionFactory"ref="jmsConnectionFactory"/>

    <propertyname="destination"ref="jmsQueue"/>

    <propertyname="messageListener"ref="receiver"/>

</bean>

 

编写测试程序如下:

public class Main {

    public static void main(String[] args)throws Exception {

        Mom4jUtil.startJmsServer();

        ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");

        Sender sender = (Sender) context.getBean("sender");

        for(int i=0; i<10; i++) {

            sender.send("Hello, it is " +new Date());

            Thread.sleep(1000);

        }

        System.exit(0);

    }

}

 

运行程序,输出结构与直接使用JMS的工程类似,但是发送和接受JMS消息的编码被大大简化了。需要注意的一点是,必须保证MessageListener的实现类时线程安全的,因为onMessage()方法可能被多个线程同时调用。

 

在EJB2.0 中使用消息驱动Bean(Message – Driven  Bean )也能够大大简化JMS的编程,但是消息驱动Bean也是EJB的一种,必须运行在EJB容器中。相别之下,Spring提供了以POJO形式的包裹Bean,能非常方便的处理JMS消息。

 

对于仅支持JMS1.02  版本规范的服务器,Spring提供了一个兼容的JmsTemplate102(表示JMS1.02版本)模板类,JmsTemplate102需要知道究竟使用Queue还是Topic 方式,通过设置属性pubSubDomain=true指定了Topic方式,如果不设定,则默认为Queue方式。

 

 

 

 

 

 

9.3.5 自动转换消息

大多时候,除了简单的TextMessage外,需要发送消息都应当被封装在Java类中,例如,一个电子邮件消息应该通过一个MailMessage对象来表示。通常,ObjectMessage可以自动实现Java对象的序列化,不过,很多时候仍需要将消息以BytesMessage等其他形式发送,为此,Spring提供了一个MessageConverter接口来方便地实现Java类和JMS消息的转化。

 

 

 

 

 

public interface MessageConverter{

Object fromMessage(Message message);

Message toMessage(Object object,Session session);

}

 

 

同时,Spring内置的SimpleMessageConverter已经能够满足大多数消息的转化,它支持String和TextMessage、byte[]和ByteMessage,以及Map和MapMessage之间的转化。要在发送消息时自动将Java对象转化为消息,可以调用JmsTemplate的convertAndSend()。JmsTemplate默认使用SimpleMessageConverter作为默认的MessageConverter,要编写一个自定义的MessageConverter也是极其容易的,这里不再给出示例代码。

 

 

 

9.3.6 同步接受消息

 

虽说绝多数,JMS消息都是异步传输的,但是某些时候也确实需要同步接受一条消息,JmsTemplate提供了多个重载的receive()方法,可以同步地接受消息。需要注意的是,使用receive()方法要格外小心,在接受到消息之前,当前线程将被阻塞。

 

 

9.3.7 使用JMS发送E-mail

 

在Web应用程序中,常常需要给用户发送邮件通知,例如,注册成功的欢迎邮件、订单确认邮件,由于发送邮件是非常耗时的任务,对于需要实时发送的邮件,以同步的方式在一个HTTP请求中完成将影响用户浏览,在新的线程中发送则需要自己管理线程池。这时,利用JMS提供的一部编程模型,借助Spring框架可以在一个简单的POJO中非常方便地处理邮件发送的任务。

 

 

9.3.8 在服务器中发送消息

 

上面的例子中,我们使用的是独立的第三方JMS实现库,对于调试JMS程序来说是比较方便的。但是,一旦产品部署在服务器上,就应当使用服务器提供的JMS服务。常见的JavaEE服务器提供了JMS的实现,少数高端JavaEE服务器还支持JMS集群。只需要对服务器做一定的配置,就可以直接在应用程序中使用JMS服务了。

 

在这里,我们以Resin服务器为例,演示如何在服务器环境中使用JMS。首先,在Eclipse中新建JMS_Servlet工程。(这这里要说下,关于Eclipse与Resin集成,可以参考这篇文章:http://blog.csdn.net/sz_bdqn/article/details/7488221)

 

在Resin3.1服务器中配置JMS相当简便,可以参考Resin根目录下的配置文件/conf/resin.conf.我们在工程根目录下创建一个新的resin.conf,然后编写一个简单的配置,只需加入下面的内容即可:

 

<!-- Resin 3.1 configuration file -->

<resin xmlns="http://caucho.com/ns/resin"

       xmlns:resin="http://caucho.com/ns/resin/core">

      

    <log name="" level="info" path="stdout:"/>

   

    <cluster id="">

    <!-- web应用发布目录 -->

        <root-directory>D:\Development\spring2.5.6\JMS_Servlet\WebContent</root-directory>

         <server id="">

            <http port="8080"/>

        </server>

        <resource jndi-name="jms/factory" type="com.caucho.jms.ConnectionFactoryImpl"/>

        <resource jndi-name="jms/queue" type="com.caucho.jms.memory.MemoryQueue"/>

         <!-- resin安装目录下,为app-default.xml的绝对路径。此处不能使用相对路径。 -->

        <resin:import path="D:/Java/OpenSourceJavaSourceCode/resin-3.x/resin-3.1.12/conf/app-default.xml"/>

      

        <host id="" root-directory=".">

        <!-- web应用发布目录 -->

            <web-app id="/" root-directory="D:\Development\spring2.5.6\JMS_Servlet\WebContent"/>

        </host>

    </cluster>

</resin>

 

 

然后,编写SendMessageController以便结接受用户输入,并将用户输入的内容作为TextMessage发送出去,为了简化程序,这里没有使用MVC架构,而是直接输出到response对象。

public class SendMessageController implements Controller {

 

    private JmsTemplatejmsTemplate;

 

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)throws Exception {

        final String text = request.getParameter("text");

        response.setContentType("text/html;charset=UTF-8");

        response.setCharacterEncoding("UTF-8");

        PrintWriter writer = response.getWriter();

        if(text!=null && !text.equals("")) {

            jmsTemplate.send(new MessageCreator() {

                public Message createMessage(Session session)throws JMSException {

                    return session.createTextMessage(text);

                }

            });

            writer.write("发送成功!<a href='index.html'>返回</a>");

            writer.flush();

        }else {

            writer.write("发送失败!<a href='index.html'>返回</a>");

            writer.flush();

        }

        return null;

    }

 

    public void setJmsTemplate(JmsTemplate jmsTemplate) {

       this.jmsTemplate = jmsTemplate;

    }

}

 

编写简单的index.html,接受用户输入并将表单发送给SendMessageController处理。

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>

    <title>发送JMS</title></head>

    <body>

        <formname="form1"method="post"action="sendMessage.jms">

            输入消息:

            <inputname="text"type="text"id="text"maxlength="255">

            <inputtype="submit"name="Submit"value="发送">

        </form>

    </body>

</html>

 

 

Receiver类和前面说的JMS_Spring工程中的完全相同,这里不再重复。最后一步便是在Xml配置文件中将他们全部装配出来。注意:由于是WEB应用程序,XML配置文件被放在/web/WEB-INF目录下,命名为dispatcher-servlet.xml

 

<beanid="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">

    <propertyname="jndiName"value="java:comp/env/jms/factory"/>

</bean>

 

<beanid="jmsQueue"class="org.springframework.jndi.JndiObjectFactoryBean">

    <propertyname="jndiName"value="java:comp/env/jms/queue"/>

</bean>

 

<beanid="jmsTemplate"class="org.springframework.jms.core.JmsTemplate">

    <propertyname="connectionFactory"ref="jmsConnectionFactory"/>

    <propertyname="defaultDestination"ref="jmsQueue"/>

</bean>

 

<beanid="receiver"class="com.zsw.springmvc.jms.Receiver"/>

 

<beanid="listenerContainer"class="org.springframework.jms.listener.DefaultMessageListenerContainer">

    <propertyname="connectionFactory"ref="jmsConnectionFactory"/>

    <propertyname="destination"ref="jmsQueue"/>

    <propertyname="messageListener"ref="receiver"/>

</bean>

 

<beanname="/sendMessage.jms"class="com.zsw.springmvc.jms.SendMessageController">

    <propertyname="jmsTemplate"ref="jmsTemplate"/>

</bean>

 

最后,在/web/WEB-INF/目录下配置好web.xml

<servlet>

    <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>dispatcher</servlet-name>

    <url-pattern>*.jms</url-pattern>

</servlet-mapping>

 

运行start_resin.bat,启动Resin服务器,然后打开浏览器,输入地址http://localhost:8080/,如图9-11所示。

 

单击“发送”按钮,就将表单发送给SendMessageController处理,若发送成功,将显示发送成功的页面。

 

在Resin的控制台可以看到Receiver对象已经打印出了接受的消息:

[2012/04/23 03:15:07.250] WebApp[http://localhost:8080] Initializing Spring FrameworkServlet 'dispatcher'

Receive: Hello World!

 

如果这是一个在线聊天的应用,Receiver就可以将消息转发给其他用户。

对于其他JavaEE服务器,可以参考其他的说明文档,只要正确设置了JNDI名称,应用程序的代码不用更改就可以直接部署在相应的服务器上。


Demo下载地址:http://download.csdn.net/detail/sz_bdqn/4250143


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2.3.1. 命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.1.1. Setter注入 3.3.1.2. 构造器注入 3.3.1.3. 一些例子 3.3.2. 构造器参数的解析 3.3.2.1. 构造器参数类型匹配 3.3.2.2. 构造器参数的索引 3.3.3. bean属性及构造器参数详解 3.3.3.1. 直接量(基本类型、Strings类型等。) 3.3.3.2. 引用其它的bean(协作者) 3.3.3.3. 内部bean 3.3.3.4. 集合 3.3.3.5. Nulls 3.3.3.6. XML-based configuration metadata shortcuts 3.3.3.7. 组合属性名称 3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.6.1. 设置Bean使自动装配失效 3.3.7. 依赖检查 3.3.8. 方法注入 3.3.8.1. Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.3.1. 初始化web配置 3.4.3.2. Request作用域 3.4.3.3. Session作用域 3.4.3.4. global session作用域 3.4.3.5. 作用域bean与依赖 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.1.1. 初始化回调 3.5.1.2. 析构回调 3.5.2. 了解自己 3.5.2.1. BeanFactoryAware 3.5.2.2. BeanNameAware 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.2.1. PropertyPlaceholderConfigurer示例 3.7.2.2. PropertyOverrideConfigurer示例 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ClassPathResource 4.3.3. FileSystemResource 4.3.4. ServletContextResource 4.3.5. InputStreamResource 4.3.6. ByteArrayResource 4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.1.1. 创建 ClassPathXmlApplicationContext 实例 - 简介 4.7.2. Application context构造器中资源路径的通配符 4.7.2.1. Ant风格的pattern 4.7.2.2. classpath*: 前缀 4.7.2.3. 其他关于通配符的说明 4.7.3. FileSystemResource 提示 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点表达式 6.2.3.3. 共享常见的切入点(pointcut)定义 6.2.3.4. 示例 6.2.4. 声明通知 6.2.4.1. 前置通知(Before advice) 6.2.4.2. 返回后通知(After returning advice) 6.2.4.3. 抛出后通知(After throwing advice) 6.2.4.4. 后通知(After (finally) advice) 6.2.4.5. 环绕通知(Around Advice) 6.2.4.6. 通知参数(Advice parameters) 6.2.4.7. 通知(Advice)顺序 6.2.5. 引入(Introductions) 6.2.6. 切面实例化模型 6.2.7. 例子 6.3. Schema-based AOP support 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明通知 6.3.3.1. 通知(Advice) 6.3.3.2. 返回后通知(After returning advice) 6.3.3.3. 抛出异常后通知(After throwing advice) 6.3.3.4. 后通知(After (finally) advice) 6.3.3.5. 通知 6.3.3.6. 通知参数 6.3.3.7. 通知顺序 6.3.4. 引入 6.3.5. 切面实例化模型 6.3.6. Advisors 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是完全用AspectJ? 6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.7. 编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入点实现 7.2.4.1. 静态切入点 7.2.4.2. 动态切入点 7.2.5. 切入点的基类 7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator 7.9.1.3. AbstractAdvisorAutoProxyCreator 7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. 简介 9.2. 动机 9.3. 关键抽象 9.4. 使用资源同步的事务 9.4.1. 高层次方案 9.4.2. 低层次方案 9.4.3. TransactionAwareDataSourceProxy 9.5. 声明式事务管理 9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程式事务管理 9.6.1. 使用 TransactionTemplate 9.6.2. 使用 PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 11.2.6. 执行SQL语句 11.2.7. 执行查询 11.2.8. 更新数据库 11.3. 控制数据库连接 11.3.1. DataSourceUtils类 11.3.2. SmartDataSource接口 11.3.3. AbstractDataSource类 11.3.4. SingleConnectionDataSource类 11.3.5. DriverManagerDataSource类 11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4. Oracle TopLink 12.4.1. SessionFactory 抽象层 12.4.2. TopLinkTemplate 和 TopLinkDaoSupport 12.4.3. 基于原生的TopLink API的DAO实现 12.4.4. 事务管理 12.5. iBATIS SQL Maps 12.5.1. iBATIS 1.x和2.x的概览与区别 12.5.2. iBATIS SQL Maps 1.x 12.5.2.1. 创建SqlMap 12.5.2.2. 使用 SqlMapTemplate 和 SqlMapDaoSupport 12.5.3. iBATIS SQL Maps 2.x 12.5.3.1. 创建SqlMapClient 12.5.3.2. 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport 12.5.3.3. 基于原生的iBATIS API的DAO实现 12.6. JPA 12.6.1. 在Spring环境中建立JPA 12.6.1.1. LocalEntityManagerFactoryBean 12.6.1.2. LocalContainerEntityManagerFactoryBean 12.6.1.3. 处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 13.1.2. Spring Web MVC框架的特点 13.2. DispatcherServlet 13.3. 控制器 13.3.1. AbstractController 和 WebContentGenerator 13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:前缀 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2. CookieLocaleResolver 13.6.3. SessionLocaleResolver 13.6.4. LocaleChangeInterceptor 13.7. 使用主题 13.7.1. 简介 13.7.2. 如何定义主题 13.7.3. 主题解析器 13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password标签 13.9.7. select标签 13.9.8. option标签 13.9.9. options标签 13.9.10. textarea标签 13.9.11. hidden标签 13.9.12. errors标签 13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 14.1. 简介 14.2. JSP和JSTL 14.2.1. 视图解析器 14.2.2. 'Plain-old' JSPs versus JSTL 'Plain-old' JSP与JSTL 14.2.3. 帮助简化开发的额外的标签 14.3. Tiles 14.3.1. 需要的资源 14.3.2. 如何集成Tiles 14.3.2.1. InternalResourceViewResolver 14.3.2.2. ResourceBundleViewResolver 14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.4.1. velocity.properties 14.4.4.2. FreeMarker 14.4.5. 绑定支持和表单处理 14.4.5.1. 用于绑定的宏 14.4.5.2. 简单绑定 14.4.5.3. 表单输入生成宏 14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML 14.5. XSLT 14.5.1. 写在段首 14.5.1.1. Bean 定义 14.5.1.2. 标准MVC控制器代码 14.5.1.3. 把模型数据转化为XML 14.5.1.4. 定义视图属性 14.5.1.5. 文档转换 14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.6.2.1. 文档视图定义 14.6.2.2. Controller 代码 14.6.2.3. Excel视图子类 14.6.2.4. PDF视图子类 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.2.1. 配置ViewResolver 14.7.2.2. 配置View 14.7.2.3. 关于报表文件 14.7.2.4. 使用 JasperReportsMultiFormatView 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.4.1. 配置子报表文件 14.7.4.2. 配置子报表数据源 14.7.5. 配置Exporter的参数 15. 集成其它Web框架 15.1. 简介 15.2. 通用配置 15.3. JavaServer Faces 15.3.1. DelegatingVariableResolver 15.3.2. FacesContextUtils 15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.1.1. DelegatingRequestProcessor 15.4.1.2. DelegatingActionProxy 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.5.1.1. 将 Spring Beans 注入到 Tapestry 页面中 15.5.1.2. 组件定义文件 15.5.1.3. 添加抽象访问方法 15.5.1.4. 将 Spring Beans 注入到 Tapestry 页面中 - Tapestry 4.0+ 风格 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - MVC中的C 16.1.2. 视图 - MVC中的V 16.1.3. Web作用范围的Bean 16.2. DispatcherPortlet 16.3. ViewRendererServlet 16.4. 控制器 16.4.1. AbstractController和PortletContentGenerator 16.4.2. 其它简单的控制器 16.4.3. Command控制器 16.4.4. PortletWrappingController 16.5. 处理器映射 16.5.1. PortletModeHandlerMapping 16.5.2. ParameterHandlerMapping 16.5.3. PortletModeParameterHandlerMapping 16.5.4. 增加 HandlerInterceptor 16.5.5. HandlerInterceptorAdapter 16.5.6. ParameterMappingInterceptor 16.6. 视图和它们的解析 16.7. Multipart文件上传支持 16.7.1. 使用PortletMultipartResolver 16.7.2. 处理表单里的文件上传 16.8. 异常处理 16.9. Portlet应用的部署 IV. 整合 17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为Hessian配置DispatcherServlet 17.3.2. 使用HessianServiceExporter暴露你的bean 17.3.3. 客户端连接服务 17.3.4. 使用Burlap 17.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP基础认证 17.4. 使用HTTP调用器暴露服务 17.4.1. 暴露服务对象 17.4.2. 在客户端连接服务 17.5. Web服务 17.5.1. 使用JAXI-RPC暴露服务 17.5.2. 访问Web服务 17.5.3. 注册bean映射 17.5.4. 注册自己的处理方法 17.5.5. 使用XFire来暴露Web服务 17.6. 对远程接口不提供自动探测 17.7. 在选择这些技术时的一些考虑 18. Enterprise Java Bean(EJB)集成 18.1. 简介 18.2. 访问EJB 18.2.1. 概念 18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问远程SLSB 18.3. 使用Spring提供的辅助类实现EJB组件 19. JMS 19.1. 简介 19.2. 使用Spring JMS 19.2.1. JmsTemplate 19.2.2. 连接工厂 19.2.3. (消息)目的地管理 19.2.4. 消息侦听容器 19.2.4.1. SimpleMessageListenerContainer 19.2.4.2. DefaultMessageListenerContainer 19.2.4.3. ServerSessionMessageListenerContainer 19.2.5. 事务管理 19.3. 发送一条消息 19.3.1. 使用消息转换器 19.3.2. SessionCallback 和ProducerCallback 19.4. 接收消息 19.4.1. 同步接收 19.4.2. 异步接收 - 消息驱动的POJOs 19.4.3. SessionAwareMessageListener 接口 19.4.4. MessageListenerAdapter 19.4.5. 事务中的多方参与 20. JMX 20.1. 介绍 20.2. 输出bean到JMX 20.2.1. 创建一个MBeanServer 20.2.2. 复用现有的MBeanServer 20.2.3. MBean的惰性初始化 20.2.4. MBean的自动注册 20.2.5. 控制注册行为 20.3. 控制bean的管理接口 20.3.1. MBeanInfoAssembler 接口 20.3.2. 使用源码级元数据 20.3.3. 使用JDK 5.0注解 20.3.4. 源代码级的元数据类型 20.3.5. 接口AutodetectCapableMBeanInfoAssembler 20.3.6. 用Java接口定义管理接口 20.3.7. 使用MethodNameBasedMBeanInfoAssembler 20.4. 控制bean的 ObjectName 20.4.1. 从Properties中读取ObjectName 20.4.2. 使用 MetadataNamingStrategy 20.5. JSR-160连接器 20.5.1. 服务器端连接器 20.5.2. 客户端连接器 20.5.3. 基于Burlap/Hessian/SOAP的JMX 20.6. 通过代理访问MBeans 20.7. 通知 20.7.1. 为通知注册监听器 20.7.2. 发布通知 20.8. 更多资源 21. JCA CCI 21.1. 介绍 21.2. 配置CCI 21.2.1. 连接器配置 21.2.2. 在Spring中配置ConnectionFactory 21.2.3. 配置CCI连接 21.2.4. 使用一个 CCI 单连接 21.3. 使用Spring的 CCI访问支持 21.3.1. 记录转换 21.3.2. CciTemplate 类 21.3.3. DAO支持 21.3.4. 自动输出记录生成 21.3.5. 总结 21.3.6. 直接使用一个 CCI Connection 接口和Interaction接口 21.3.7. CciTemplate 使用示例 21.4. 建模CCI访问为操作对象 21.4.1. MappingRecordOperation 21.4.2. MappingCommAreaOperation 21.4.3. 自动输出记录生成 21.4.4. 总结 21.4.5. MappingRecordOperation 使用示例 21.4.6. MappingCommAreaOperation 使用示例 21.5. 事务 22. Spring邮件抽象层 22.1. 简介 22.2. Spring邮件抽象结构 22.3. 使用Spring邮件抽象 22.3.1. 可插拔的MailSender实现 22.4. 使用 JavaMail MimeMessageHelper 22.4.1. 创建一条简单的MimeMessage,并且发送出去 22.4.2. 发送附件和嵌入式资源(inline resources) 23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling) 23.1. 简介 23.2. 使用OpenSymphony Quartz 调度器 23.2.1. 使用JobDetailBean 23.2.2. 使用 MethodInvokingJobDetailFactoryBean 23.2.3. 使用triggers和SchedulerFactoryBean来包装任务 23.3. 使用JDK Timer支持类 23.3.1. 创建定制的timers 23.3.2. 使用 MethodInvokingTimerTaskFactoryBean类 23.3.3. 打包:使用TimerFactoryBean来设置任务 23.4. SpringTaskExecutor抽象 23.4.1. TaskExecutor接口 23.4.2. 何时使用TaskExecutor接口 23.4.3. TaskExecutor类型 23.4.4. 使用TaskExecutor接口 24. 动态语言支持 24.1. 介绍 24.2. 第一个例子 24.3. 定义动态语言支持的bean 24.3.1. 公共概念 24.3.1.1. <lang:language/> 元素 24.3.1.2. Refreshable bean 24.3.1.3. 内置动态语言源文件 24.3.1.4. 理解dynamic-language-backed bean context的构造器注入 24.3.2. JRuby beans 24.3.3. Groovy beans 24.3.4. BeanShell beans 24.4. 场景 24.4.1. Spring MVC控制器脚本化 24.4.2. Validator脚本化 24.5. 更多的资源 25. 注解和源代码级的元数据支持 25.1. 简介 25.2. Spring的元数据支持 25.3. 注解 25.3.1. @Required 25.3.2. Spring中的其它@Annotations 25.4. 集成Jakarta Commons Attributes 25.5. 元数据和Spring AOP自动代理 25.5.1. 基本原理 25.5.2. 声明式事务管理 25.5.3. 缓冲 25.5.4. 自定义元数据 25.6. 使用属性来减少MVC web层配置 25.7. 元数据属性的其它用法 25.8. 增加对额外元数据API的支持 A. XML Schema-based configuration A.1. Introduction A.2. XML Schema-based configuration A.2.1. Referencing the schemas A.2.2. The util schema A.2.2.1. <util:constant/> A.2.2.2. <util:property-path/> A.2.2.3. <util:properties/> A.2.2.4. <util:list/> A.2.2.5. <util:map/> A.2.2.6. <util:set/> A.2.3. The jee schema A.2.3.1. <jee:jndi-lookup/> (simple) A.2.3.2. <jee:jndi-lookup/> (with single JNDI environment setting) A.2.3.3. <jee:jndi-lookup/> (with multiple JNDI environment settings) A.2.3.4. <jee:jndi-lookup/> (complex) A.2.3.5. <jee:local-slsb/> (simple) A.2.3.6. <jee:local-slsb/> (complex) A.2.3.7. <jee:remote-slsb/> A.2.4. The lang schema A.2.5. The tx (transaction) schema A.2.6. The aop schema A.2.7. The tool schema A.2.8. The beans schema A.3. Setting up your IDE A.3.1. Setting up Eclipse A.3.2. Setting up IntelliJ IDEA A.3.3. Integration issues A.3.3.1. XML parsing errors in the Resin v.3 application server B. Extensible XML authoring B.1. Introduction B.2. Authoring the schema B.3. Coding a NamespaceHandler B.4. Coding a BeanDefinitionParser B.5. Registering the handler and the schema B.5.1. META-INF/spring.handlers B.5.2. META-INF/spring.schemas C. spring-beans-2.0.dtd D. spring.tld D.1. Introduction D.2. The bind tag D.3. The escapeBody tag D.4. The hasBindErrors tag D.5. The htmlEscape tag D.6. The message tag D.7. The nestedPath tag D.8. The theme tag D.9. The transform tag E. spring-form.tld E.1. Introduction E.2. The checkbox tag E.3. The errors tag E.4. The form tag E.5. The hidden tag E.6. The input tag E.7. The label tag E.8. The option tag E.9. The options tag E.10. The password tag E.11. The radiobutton tag E.12. The select tag E.13. The textarea tag F. Spring 2.0 开发手册中文化项目 F.1. 声明 F.2. 致谢 F.3. 参与人员及任务分配 F.4. Spring 2.0 正式版开发手册翻译说明 F.5. 项目历程 F.5.1. Spring 2.0 RC2 开发手册翻译项目 F.5.2. Spring 2.0 正式版开发手册翻译项目
Spring Integration提供了对MQTT协议的支持,这使得我们可以很容易地集成MQTT消息传递机制到我们的Spring应用程序中。 以下是一个简单的示例,演示了如何使用Spring Integration和MQTT来发布和订阅消息。 首先,我们需要在我们的Maven项目中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>${spring.integration.version}</version> </dependency> ``` 接下来,我们需要配置我们的Spring应用程序以使用MQTT。这可以通过在Spring配置文件中添加以下bean来实现: ```xml <bean id="mqttClientFactory" class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory"> <property name="userName" value="YOUR_MQTT_USERNAME"/> <property name="password" value="YOUR_MQTT_PASSWORD"/> </bean> <bean id="mqttClient" class="org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler"> <constructor-arg name="clientId" value="YOUR_MQTT_CLIENT_ID"/> <constructor-arg ref="mqttClientFactory"/> <property name="defaultTopic" value="YOUR_MQTT_TOPIC"/> </bean> <int-mqtt:message-driven-channel-adapter id="mqttInbound" client-id="YOUR_MQTT_CLIENT_ID" url="tcp://localhost:1883" topics="YOUR_MQTT_TOPIC" client-factory="mqttClientFactory" channel="mqttInputChannel"/> <int:channel id="mqttInputChannel"/> <int:service-activator input-channel="mqttInputChannel" ref="mqttMessageHandler" method="handleMessage"/> <bean id="mqttMessageHandler" class="com.example.MqttMessageHandler"/> ``` 在上面的配置中,我们定义了一个MQTT客户端工厂和一个MQTT消息处理程序。我们还定义了一个MQTT驱动的通道适配器,用于从指定的主题接收消息,并将其发送到我们的输入通道中。最后,我们定义了一个服务激活器,它将接收来自输入通道的消息,并将其传递给我们的消息处理程序进行处理。 现在,我们可以创建我们的消息处理程序,以便在接收到来自MQTT的消息时进行处理。以下是一个简单的示例: ```java public class MqttMessageHandler { public void handleMessage(Message<String> message) { String payload = message.getPayload(); System.out.println("Received message: " + payload); } } ``` 最后,我们可以在我们的应用程序中使用我们的MQTT客户端来发布消息。以下是一个简单的示例: ```java @Autowired private MessageChannel mqttOutputChannel; public void sendMqttMessage(String message) { mqttOutputChannel.send(MessageBuilder.withPayload(message).build()); } ``` 在上面的代码中,我们使用自动装配来注入我们的MQTT输出通道。我们可以使用此通道将消息发送到MQTT主题。 现在,我们已经成功地集成了MQTT到我们的Spring应用程序中。我们可以使用上述示例代码来发布和订阅MQTT消息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值