Spring Integration集成框架之Message-Channel

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Spring对Java企业开发的影响是巨大的,从2004年发布到现在,一直都是Java开发主要的框架,随处可见Spring的身影。我读的Spring源码不多,但不代表我对她理解的不深刻。大众熟知Struts,Hibernate其实我都一知半解,还是上学的时候听“大虾”们说的他们很厉害才学了一些,现在已经放下了好几年了。我喜欢Spring的风格和架构,也是我开发的利器。Spring发展到现在有很多的子项目,如:Spring Batch,Spring Data Redis,Spring Data Neo4j, Spring Data Hadoop, Spring Security等。哦,还有Spring Integration。

如你所见,Integration,集成!也是Spring集大成者。我是这么认为的。

Sping Integration的介绍见:http://blog.csdn.net/slivefox/article/details/3740541

Spring Integration本身并不做任何事,它通过更高层次的抽象把各种技术杂合到一起,组成一个无缝的系统。如果你熟悉UML,你就懂得抽象在软件工程的重要性。

说了这么多,Spring Integration适合做什么?如果你的系统处在各个系统的中间,需要JMS交互,又需要Database/Redis/MongoDB,还需要监听Tcp/UDP等,还有固定的文件转移,分析。还面对着时不时的更改需求的风险。那么,它再适合不过了。

Spring Integration中,Message是它的基础构件和核心,所有的流程都围绕着Message运转。如:

Spring Integration集成框架之Message-Channel_第1张图片


payload是他可以携带的任何Object对象,Header是她包含的一些头信息。如发mail时就需要,fromtocc等信息。正文是一段text或者html可以存储在payload中。Message总是由外部系统触发而产生,我们称他为消息生产者Producer。这也很像事件驱动模型。如:

Spring Integration集成框架之Message-Channel_第2张图片

每个Message交互的时候都需要channel。从一个channel进入,从另一个channel流出。同时另一个channel又是下一个系统的流入端。如:

Spring Integration集成框架之Message-Channel_第3张图片

他们都通过一个适配器,把Message导向每一个需要的地方,而不伤害结构。也就是说如果更改了一个地方,我们只需要更改一个适配器。

Spring Integration集成框架之Message-Channel_第4张图片

我通过一个jms做一个简单的示例。

一个简单的Bean

public class JmsMessageBean implements Serializable {
    
    private String name = null;

    private Integer age = null;

    private Date birthday = null;

    private List manbers = null;

    //...getter and setter

}

一个MessageHandler

public class JmsMessageCustomerHandler implements MessageHandler {
    public JmsMessageCustomerHandler() {
    }

    @Override
    public void handleMessage(Message message) throws MessagingException {
        //输出.
        Object obj = message.getPayload();
        if(obj == null) {
            System.out.println("null");
        } else if(obj instanceof String) {
            System.out.println(obj);
        } else if(obj instanceof JmsMessageBean) {
            JmsMessageBean bean = (JmsMessageBean)obj;
            System.out.println(ReflectionToStringBuilder.reflectionToString(bean));
        } else {
            System.out.println(ReflectionToStringBuilder.reflectionToString(message));
        }
    }
}

一个消息的中转,因为我不是把消息传递给下一个系统,我只是把它简单的输出。

public class JmsMessageCustomerTransformer implements Transformer  {
    public JmsMessageCustomerTransformer() {
    }

    @Override
    public Message transform(Message message) {
        //不做任何事,原样返回
        return message;
    }
}
Spring schema:




    
    
        
            tcp://localhost:61616
        
    

    
        
        
        
    

    
    
        
    

    

    

    

    
    
        
        
        
    

    

    

    
        
    

    
    

测试类:

public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("jmsintegration/jmsIntSubscribeContext.xml");
        context.start();
        System.out.println("Please type something and hit return");
    }

我在本机开启了一个ActiveMQ,上述测试类运行了之后线程会阻塞,JDK不会退出。使之接收JMS消息。

我另写了一个测试类发送了一条消息。如:

@Test
    public void testSendJmsMessage() throws Exception {
        System.out.println("=============================================");
        JmsMessageBean bean = new JmsMessageBean();
        bean.setAge(23);
        bean.setBirthday(new Date());
        bean.setManbers(Arrays.asList("123", "234", "345"));
        bean.setName("Jms");
        publisher.sendMessage(bean);
    }

接收消息如下:

net.dintegration.jms.JmsMessageBean@49c54f01[name=Jms,age=23,birthday=Thu Nov 01 20:19:35 CST 2012,manbers=[123, 234, 345]]


有人会问:这些代码是不是太罗嗦了?自己实现一个spring-jms都不会这么麻烦。

不知道你看到没有这样的代码:



    

    
        
    

    
    

inbound-channel-adapter是在把一个jms的输入源绑定到 jmsinchannel上, transformer使用这个输入源转给 jmsoutchannel jmsoutchannel又是下一个消费者的输入源。假如增加了从文件系统读取文件到jmsoutchannel呢?或者还有Tcp获得的数据到jmsoutchannel呢?因为inbound-channel-adapter可以把任何输入绑定到jmsinchannel

你觉得呢?


转载于:https://my.oschina.net/zhzhenqin/blog/86586

你可能感兴趣的:(Spring Integration集成框架之Message-Channel)