`
234390216
  • 浏览: 10192381 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460747
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771676
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395339
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393855
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678187
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529242
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178648
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461678
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150089
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66813
社区版块
存档分类
最新评论

Spring整合JMS(三)——MessageConverter介绍

阅读更多

1.4     消息转换器MessageConverter

MessageConverter的作用主要有两方面,一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候;另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候。

下面我们就拿发送一个对象消息来举例,假设我们有这样一个需求:我们平台有一个发送邮件的功能,进行发送的时候我们只是把我们的相关信息封装成一个JMS消息,然后利用JMS进行发送,在对应的消息监听器进行接收到的消息处理时才真正的进行消息发送。

假设我们有这么一个Email对象:

 

public class Email implements Serializable {
 
    private static final long serialVersionUID = -658250125732806493L;
 
    private String receiver;
    private String title;
    private String content;
 
    public Email(String receiver, String title, String content) {
        this.receiver = receiver;
        this.title = title;
        this.content = content;
    }
 
    public String getReceiver() {
        return receiver;
    }
 
    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
 
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Email [receiver=").append(receiver).append(", title=")
                .append(title).append(", content=").append(content).append("]");
        return builder.toString();
    }
    
}

       这个Email对象包含了一个简单的接收者email地址、邮件主题和邮件内容。我们在发送的时候就把这个对象封装成一个ObjectMessage进行发送。代码如下所示:

public class ProducerServiceImpl implements ProducerService {
 
    @Autowired
    private JmsTemplate jmsTemplate;    

    public void sendMessage(Destination destination, final Serializable obj) {
        jmsTemplate.send(destination, new MessageCreator() {
 
            public Message createMessage(Session session) throws JMSException {
                ObjectMessage objMessage = session.createObjectMessage(obj);
                return objMessage;
            }
            
        });
    }
 
}

       这是对应的在没有使用MessageConverter的时候我们需要new一个MessageCreator接口对象,然后在其抽象方法createMessage内部使用session创建一个对应的消息。在使用了MessageConverter的时候我们在使用JmsTemplate进行消息发送时只需要调用其对应的convertAndSend方法即可。如:

 

    public void sendMessage(Destination destination, final Serializable obj) {
        //未使用MessageConverter的情况
        /*jmsTemplate.send(destination, new MessageCreator() {
 
            public Message createMessage(Session session) throws JMSException {
                ObjectMessage objMessage = session.createObjectMessage(obj);
                return objMessage;
            }
            
        });*/
        //使用MessageConverter的情况
        jmsTemplate.convertAndSend(destination, obj);
    }

这样JmsTemplate就会在其内部调用预定的MessageConverter对我们的消息对象进行转换,然后再进行发送。

       这个时候我们就需要定义我们的MessageConverter了。要定义自己的MessageConverter很简单,只需要实现Spring为我们提供的MessageConverter接口即可。我们先来看一下MessageConverter接口的定义:

public interface MessageConverter {
 
    Message toMessage(Object object, Session session) throws JMSException, MessageConversionException;
 
    Object fromMessage(Message message) throws JMSException, MessageConversionException;
 
}

       我们可以看到其中一共定义了两个方法fromMessagetoMessagefromMessage是用来把一个JMS Message转换成对应的Java对象,而toMessage方法是用来把一个Java对象转换成对应的JMS Message。因为我们已经知道上面要发送的对象就是一个Email对象,所以在这里我们就简单地定义一个EmailMessageConverter用来把Email对象和对应的ObjectMessage进行转换,其代码如下:

 

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
 
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;
 
public class EmailMessageConverter implements MessageConverter {
 
    public Message toMessage(Object object, Session session)
            throws JMSException, MessageConversionException {
        return session.createObjectMessage((Serializable) object);
    }
 
    public Object fromMessage(Message message) throws JMSException,
            MessageConversionException {
        ObjectMessage objMessage = (ObjectMessage) message;
        return objMessage.getObject();
    }
 
}

 

       这样当我们利用JmsTemplateconvertAndSend方法发送一个Email对象的时候就会把对应的Email对象当做参数调用我们定义好的EmailMessageConvertertoMessage方法。

       定义好我们的EmailMessageConverter之后就需要指定我们用来发送Email对象的JmsTemplate对象的messageConverterEmailMessageConverter,这里我们在Spring的配置文件中定义JmsTemplate bean的时候就指定:

 

    <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
        <property name="connectionFactory" ref="connectionFactory"/>
        <!-- 消息转换器 -->
        <property name="messageConverter" ref="emailMessageConverter"/>
    </bean>
    <!-- 类型转换器 -->
    <bean id="emailMessageConverter" class="com.tiantian.springintejms.converter.EmailMessageConverter"/>

    

       到此我们的MessageConverter就定义好了,也能够进行使用了,接着我们来进行测试一下,定义测试代码如下所示:

 

    @Test
    public void testObjectMessage() {
        Email email = new Email("zhangsan@xxx.com", "主题", "内容");
        producerService.sendMessage(destination, email);
    }

 

       上面destination对应的接收处理的MessageListener方法如下所示:

 

public class ConsumerMessageListener implements MessageListener {
 
    public void onMessage(Message message) {
        
        if (message instanceof ObjectMessage) {
            ObjectMessage objMessage = (ObjectMessage) message;
            try {
                Object obj = objMessage.getObject();
                Email email = (Email) obj;
                System.out.println("接收到一个ObjectMessage,包含Email对象。");
                System.out.println(email);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
 
}

 

       之前说了MessageConverter有两方面的功能,除了把Java对象转换成对应的Jms Message之外还可以把Jms Message转换成对应的Java对象。我们看上面的消息监听器在接收消息的时候接收到的就是一个Jms Message,如果我们要利用MessageConverter来把它转换成对应的Java对象的话,只能是我们往里面注入一个对应的MessageConverter,然后在里面手动的调用,如:

 

public class ConsumerMessageListener implements MessageListener {
 
    private MessageConverter messageConverter;
    
    public void onMessage(Message message) {
        
        if (message instanceof ObjectMessage) {
            ObjectMessage objMessage = (ObjectMessage) message;
            try {
                /*Object obj = objMessage.getObject();
                Email email = (Email) obj;*/
                Email email = (Email) messageConverter.fromMessage(objMessage);
                System.out.println("接收到一个ObjectMessage,包含Email对象。");
                System.out.println(email);
            } catch (JMSException e) {
                e.printStackTrace();
            }
            
        }
    }
 
    public MessageConverter getMessageConverter() {
        return messageConverter;
    }
 
    public void setMessageConverter(MessageConverter messageConverter) {
        this.messageConverter = messageConverter;
    }
 
}

 

       当我们使用MessageListenerAdapter来作为消息监听器的时候,我们可以为它指定一个对应的MessageConverter,这样Spring在处理接收到的消息的时候就会自动地利用我们指定的MessageConverter对它进行转换,然后把转换后的Java对象作为参数调用指定的消息处理方法。这里我们再把前面讲解MessageListenerAdapter时定义的MessageListenerAdapter拿来做一个测试,我们指定它的MessageConverter为我们定义好的EmailMessageConverter

 

    <!-- 消息监听适配器 -->
    <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        <property name="delegate">
            <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>
        </property>
        <property name="defaultListenerMethod" value="receiveMessage"/>
        <property name="messageConverter" ref="emailMessageConverter"/>
    </bean>
    <!-- 消息监听适配器对应的监听容器 -->
    <bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="adapterQueue"/>
        <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter来作为消息监听器 -->
    </bean>

 

       然后在我们的真正用于处理接收到的消息的ConsumerListener中添加一个receiveMessage方法,添加后其代码如下所示:

 

public class ConsumerListener {
 
    public void receiveMessage(String message) {
        System.out.println("ConsumerListener通过receiveMessage接收到一个纯文本消息,消息内容是:" + message);
    }
    
    public void receiveMessage(Email email) {
        System.out.println("接收到一个包含Email的ObjectMessage。");
        System.out.println(email);
    }
    
}

 

       然后我们定义如下测试代码:

 

    @Test
    public void testObjectMessage() {
        Email email = new Email("zhangsan@xxx.com", "主题", "内容");
        producerService.sendMessage(adapterQueue, email);
    }

 

       因为我们给MessageListenerAdapter指定了一个MessageConverter,而且是一个EmailMessageConverter,所以当MessageListenerAdapter接收到一个消息后,它会调用我们指定的MessageConverterfromMessage方法把它转换成一个Java对象,根据定义这里会转换成一个Email对象,然后会把这个Email对象作为参数调用我们通过defaultListenerMethod属性指定的默认处理器方法,根据定义这里就是receiveMessage方法,但是我们可以看到在ConsumerListener中我们一共定义了两个receiveMessage方法,因为是通过转换后的Email对象作为参数进行方法调用的,所以这里调用的就应该是参数类型为EmailreceiveMessage方法了。上述测试代码运行后会输出如下结果:

       
说到这里可能有读者就会有疑问了,说我们在之前讲解MessageListenerAdapter的时候不是没有指定对应的MessageConverter,然后发送了一个TextMessage,结果Spring还是把它转换成一个String对象,调用了ConsumerListener参数类型为StringreceiveMessage方法吗?那你这个MessageConverterMessageListenerAdapter进行消息接收的时候也没什么用啊。

       其实还是有用的,在我们使用MessageListenerAdapter时,在对其进行初始化也就是调用其构造方法时,它会默认new一个Spring已经为我们实现了的MessageConverter——SimpleMessageConverter作为其默认的MessageConverter,这也就是为什么我们在使用MessageListenerAdapter的时候不需要指定MessageConverter但是消息还是会转换成对应的Java对象的原因。所以默认情况下我们使用MessageListenerAdapter时其对应的MessageListener的处理器方法参数类型必须是一个普通Java对象,而不能是对应的Jms Message对象。

       那如果我们在处理Jms Message的时候想使用MessageListenerAdapter,然后又希望处理最原始的Message,而不是经过MessageConverter进行转换后的Message该怎么办呢?这个时候我们只需要在定义MessageListenerAdapter的时候指定其MessageConverter为空就可以了。

 

    <!-- 消息监听适配器 -->
    <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        <property name="delegate">
            <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>
        </property>
        <property name="defaultListenerMethod" value="receiveMessage"/>
        <property name="messageConverter">
            <null/>
        </property>
    </bean>

 

       那么这个时候我们的真实MessageListener的处理器方法参数类型就应该是Jms Message或对应的Jms Message子类型了,不然就会调用不到对应的处理方法了。这里因为我们发送的是一个ObjectMessage,所以这里就添加一个对应的参数类型为ObjectMessagereceiveMessage方法了。

 

    public void receiveMessage(ObjectMessage message) throws JMSException {
        System.out.println(message.getObject());
    }

 

       刚刚讲到Spring已经为我们实现了一个简单的MessageConverter,即org.springframework.jms.support.converter.SimpleMessageConverter,其实Spring在初始化JmsTemplate的时候也指定了其对应的MessageConverter为一个SimpleMessageConverter,所以如果我们平常没有什么特殊要求的时候可以直接使用JmsTemplateconvertAndSend系列方法进行消息发送,而不必繁琐的在调用send方法时自己new一个MessageCreator进行相应Message的创建。

这里我们也来看一下SimpleMessageConverter的定义,如果觉得它不能满足你的要求,那我们可以对它里面的部分方法进行重写,或者是完全实现自己的MessageConverter

public class SimpleMessageConverter implements MessageConverter {
 
    public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
        if (object instanceof Message) {
            return (Message) object;
        }
        else if (object instanceof String) {
            return createMessageForString((String) object, session);
        }
        else if (object instanceof byte[]) {
            return createMessageForByteArray((byte[]) object, session);
        }
        else if (object instanceof Map) {
            return createMessageForMap((Map) object, session);
        }
        else if (object instanceof Serializable) {
            return createMessageForSerializable(((Serializable) object), session);
        }

        else {
            throw new MessageConversionException("Cannot convert object of type [" +
                    ObjectUtils.nullSafeClassName(object) + "] to JMS message. Supported message " +
                    "payloads are: String, byte array, Map<String,?>, Serializable object.");
        }
    }
 
    public Object fromMessage(Message message) throws JMSException, MessageConversionException {
        if (message instanceof TextMessage) {
            return extractStringFromMessage((TextMessage) message);
        }
        else if (message instanceof BytesMessage) {
            return extractByteArrayFromMessage((BytesMessage) message);
        }
        else if (message instanceof MapMessage) {
            return extractMapFromMessage((MapMessage) message);
        }
        else if (message instanceof ObjectMessage) {
            return extractSerializableFromMessage((ObjectMessage) message);
        }
        else {
            return message;
        }
    }
 
    protected TextMessage createMessageForString(String text, Session session) throws JMSException {
        return session.createTextMessage(text);
    }
 
    protected BytesMessage createMessageForByteArray(byte[] bytes, Session session) throws JMSException {
        BytesMessage message = session.createBytesMessage();
        message.writeBytes(bytes);
        return message;
    }
 
    protected MapMessage createMessageForMap(Map<?, ?> map, Session session) throws JMSException {
        MapMessage message = session.createMapMessage();
        for (Map.Entry entry : map.entrySet()) {
            if (!(entry.getKey() instanceof String)) {
                throw new MessageConversionException("Cannot convert non-String key of type [" +
                        ObjectUtils.nullSafeClassName(entry.getKey()) + "] to JMS MapMessage entry");
            }
            message.setObject((String) entry.getKey(), entry.getValue());
        }
        return message;
    }
 
    protected ObjectMessage createMessageForSerializable(Serializable object, Session session) throws JMSException {
        return session.createObjectMessage(object);
    }
 
 
    protected String extractStringFromMessage(TextMessage message) throws JMSException {
        return message.getText();
    }
 
    protected byte[] extractByteArrayFromMessage(BytesMessage message) throws JMSException {
        byte[] bytes = new byte[(int) message.getBodyLength()];
        message.readBytes(bytes);
        return bytes;
    }
 
    protected Map extractMapFromMessage(MapMessage message) throws JMSException {
        Map<String, Object> map = new HashMap<String, Object>();
        Enumeration en = message.getMapNames();
        while (en.hasMoreElements()) {
            String key = (String) en.nextElement();
            map.put(key, message.getObject(key));
        }
        return map;
    }
 
    protected Serializable extractSerializableFromMessage(ObjectMessage message) throws JMSException {
        return message.getObject();
    }
 
}

附:

 

  • 大小: 2.4 KB
15
0
分享到:
评论
16 楼 u010390820 2017-03-24  
     谢谢
15 楼 panamera 2016-08-07  
如果ActiveMQ服务器没有启动,这个时候消息生产者使用JmsTemplate 向ActiveMQ服务器送消息,程序没有报连接异常,而是一直处于等待中。这个问题怎么避免?
14 楼 dongshuicen 2015-12-05  
阅读后,受益匪浅
13 楼 dulang0210 2015-03-03  
我也遇到了这个问题,我是ojdbc版本错误导致的,查了很久的MQ源码才发现的

2013-07-10 16:00:34,437 | ERROR | Failed to start Apache ActiveMQ (localhost, null). Reason: java.lang.NegativeArraySizeException | org.apache.activemq.broker.BrokerService | main
java.lang.NegativeArraySizeException
at org.apache.activemq.openwire.v6.BaseDataStreamMarshaller.looseUnmarshalByteSequence(BaseDataStreamMarshaller.java:639)
at org.apache.activemq.openwire.v6.WireFormatInfoMarshaller.looseUnmarshal(WireFormatInfoMarshaller.java:132)
at org.apache.activemq.openwire.OpenWireFormat.doUnmarshal(OpenWireFormat.java:373)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:210)
at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getLastMessageBrokerSequenceId(JDBCPersistenceAdapter.java:259)
at org.apache.activemq.broker.region.DestinationFactoryImpl.getLastMessageBrokerSequenceId(DestinationFactoryImpl.java:147)
at org.apache.activemq.broker.region.RegionBroker.<init>(RegionBroker.java:110)
at org.apache.activemq.broker.jmx.ManagedRegionBroker.<init>(ManagedRegionBroker.java:110)
at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2106)
at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2099)
at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:2056)
at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:890)
at org.apache.activemq.broker.BrokerService.getAdminConnectionContext(BrokerService.java:2327)
at org.apache.activemq.broker.BrokerService.startVirtualConsumerDestinations(BrokerService.java:2466)
at org.apache.activemq.broker.BrokerService.startDestinations(BrokerService.java:2318)
at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:625)
at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:617)
at org.apache.activemq.broker.BrokerService.start(BrokerService.java:553)
at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:101)
at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:101)
at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:65)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:125)
at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:84)
at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:150)
at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
at org.apache.activemq.console.Main.main(Main.java:115)
许久没上Iteye,待会我用Oracle试试有没有这个问题。
这个问题,可能是activeMQ的问题,我换了一个就没事了

12 楼 sxm1220 2013-07-15  
234390216 写道
sxm1220 写道
activemq5.8,消息持久化到oralce10g,现在是数据库内存在未消费的消息,amq就启动不了,把数据删掉就可以启动!搜了好多都没解决,求帮忙额谢谢!具体的错误信息为:
2013-07-10 16:00:34,437 | ERROR | Failed to start Apache ActiveMQ (localhost, null). Reason: java.lang.NegativeArraySizeException | org.apache.activemq.broker.BrokerService | main
java.lang.NegativeArraySizeException
	at org.apache.activemq.openwire.v6.BaseDataStreamMarshaller.looseUnmarshalByteSequence(BaseDataStreamMarshaller.java:639)
	at org.apache.activemq.openwire.v6.WireFormatInfoMarshaller.looseUnmarshal(WireFormatInfoMarshaller.java:132)
	at org.apache.activemq.openwire.OpenWireFormat.doUnmarshal(OpenWireFormat.java:373)
	at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:210)
	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getLastMessageBrokerSequenceId(JDBCPersistenceAdapter.java:259)
	at org.apache.activemq.broker.region.DestinationFactoryImpl.getLastMessageBrokerSequenceId(DestinationFactoryImpl.java:147)
	at org.apache.activemq.broker.region.RegionBroker.<init>(RegionBroker.java:110)
	at org.apache.activemq.broker.jmx.ManagedRegionBroker.<init>(ManagedRegionBroker.java:110)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2106)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2099)
	at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:2056)
	at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:890)
	at org.apache.activemq.broker.BrokerService.getAdminConnectionContext(BrokerService.java:2327)
	at org.apache.activemq.broker.BrokerService.startVirtualConsumerDestinations(BrokerService.java:2466)
	at org.apache.activemq.broker.BrokerService.startDestinations(BrokerService.java:2318)
	at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:625)
	at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:617)
	at org.apache.activemq.broker.BrokerService.start(BrokerService.java:553)
	at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
	at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:65)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
	at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:125)
	at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:84)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:150)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
	at org.apache.activemq.console.Main.main(Main.java:115)

许久没上Iteye,待会我用Oracle试试有没有这个问题。

这个问题,可能是activeMQ的问题,我换了一个就没事了
11 楼 234390216 2013-07-14  
lvwenwen 写道
麻烦楼主上传工程,谢谢

工程已上传。其实第一篇中的工程是包括这部分内容的。
10 楼 234390216 2013-07-14  
sxm1220 写道
activemq5.8,消息持久化到oralce10g,现在是数据库内存在未消费的消息,amq就启动不了,把数据删掉就可以启动!搜了好多都没解决,求帮忙额谢谢!具体的错误信息为:
2013-07-10 16:00:34,437 | ERROR | Failed to start Apache ActiveMQ (localhost, null). Reason: java.lang.NegativeArraySizeException | org.apache.activemq.broker.BrokerService | main
java.lang.NegativeArraySizeException
	at org.apache.activemq.openwire.v6.BaseDataStreamMarshaller.looseUnmarshalByteSequence(BaseDataStreamMarshaller.java:639)
	at org.apache.activemq.openwire.v6.WireFormatInfoMarshaller.looseUnmarshal(WireFormatInfoMarshaller.java:132)
	at org.apache.activemq.openwire.OpenWireFormat.doUnmarshal(OpenWireFormat.java:373)
	at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:210)
	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getLastMessageBrokerSequenceId(JDBCPersistenceAdapter.java:259)
	at org.apache.activemq.broker.region.DestinationFactoryImpl.getLastMessageBrokerSequenceId(DestinationFactoryImpl.java:147)
	at org.apache.activemq.broker.region.RegionBroker.<init>(RegionBroker.java:110)
	at org.apache.activemq.broker.jmx.ManagedRegionBroker.<init>(ManagedRegionBroker.java:110)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2106)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2099)
	at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:2056)
	at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:890)
	at org.apache.activemq.broker.BrokerService.getAdminConnectionContext(BrokerService.java:2327)
	at org.apache.activemq.broker.BrokerService.startVirtualConsumerDestinations(BrokerService.java:2466)
	at org.apache.activemq.broker.BrokerService.startDestinations(BrokerService.java:2318)
	at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:625)
	at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:617)
	at org.apache.activemq.broker.BrokerService.start(BrokerService.java:553)
	at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
	at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:65)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
	at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:125)
	at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:84)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:150)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
	at org.apache.activemq.console.Main.main(Main.java:115)

许久没上Iteye,待会我用Oracle试试有没有这个问题。
9 楼 chenying998179 2013-07-10  
楼下的也贪心了吧  
8 楼 lvwenwen 2013-07-10  
麻烦楼主上传工程,谢谢
7 楼 sxm1220 2013-07-10  
activemq5.8,消息持久化到oralce10g,现在是数据库内存在未消费的消息,amq就启动不了,把数据删掉就可以启动!搜了好多都没解决,求帮忙额谢谢!具体的错误信息为:
2013-07-10 16:00:34,437 | ERROR | Failed to start Apache ActiveMQ (localhost, null). Reason: java.lang.NegativeArraySizeException | org.apache.activemq.broker.BrokerService | main
java.lang.NegativeArraySizeException
	at org.apache.activemq.openwire.v6.BaseDataStreamMarshaller.looseUnmarshalByteSequence(BaseDataStreamMarshaller.java:639)
	at org.apache.activemq.openwire.v6.WireFormatInfoMarshaller.looseUnmarshal(WireFormatInfoMarshaller.java:132)
	at org.apache.activemq.openwire.OpenWireFormat.doUnmarshal(OpenWireFormat.java:373)
	at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:210)
	at org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getLastMessageBrokerSequenceId(JDBCPersistenceAdapter.java:259)
	at org.apache.activemq.broker.region.DestinationFactoryImpl.getLastMessageBrokerSequenceId(DestinationFactoryImpl.java:147)
	at org.apache.activemq.broker.region.RegionBroker.<init>(RegionBroker.java:110)
	at org.apache.activemq.broker.jmx.ManagedRegionBroker.<init>(ManagedRegionBroker.java:110)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2106)
	at org.apache.activemq.broker.BrokerService.createRegionBroker(BrokerService.java:2099)
	at org.apache.activemq.broker.BrokerService.createBroker(BrokerService.java:2056)
	at org.apache.activemq.broker.BrokerService.getBroker(BrokerService.java:890)
	at org.apache.activemq.broker.BrokerService.getAdminConnectionContext(BrokerService.java:2327)
	at org.apache.activemq.broker.BrokerService.startVirtualConsumerDestinations(BrokerService.java:2466)
	at org.apache.activemq.broker.BrokerService.startDestinations(BrokerService.java:2318)
	at org.apache.activemq.broker.BrokerService.doStartBroker(BrokerService.java:625)
	at org.apache.activemq.broker.BrokerService.startBroker(BrokerService.java:617)
	at org.apache.activemq.broker.BrokerService.start(BrokerService.java:553)
	at org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:60)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1522)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
	at org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
	at org.apache.activemq.xbean.XBeanBrokerFactory$1.<init>(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:101)
	at org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:65)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
	at org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
	at org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:125)
	at org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:84)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:150)
	at org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
	at org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:104)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.activemq.console.Main.runTaskClass(Main.java:262)
	at org.apache.activemq.console.Main.main(Main.java:115)
6 楼 chenying998179 2013-07-09  
本人也是纯为研究的兴趣 目前没有实现跨语言的需求  网上的例子貌似生产者和消费者都是同一种语言的(有C#的例子)
5 楼 234390216 2013-07-09  
chenying998179 写道
234390216 写道
chenying998179 写道
博主写得很专业,本人受益匪浅,我看了那本 消息服务,spring集成jms有专门的标签,消息监听容器可以设置监听多个目的地[队列或主题](默认的bean标签只能设置一个监听目的地),比设置bean方便
有朋友问我消息服务能不能跨平台,我说这个序列化好像不能跨平台,不过好像哪里看到可以用类似webservice的soap方式传递消息,本人还没具体实践过

关于Spring对JMS支持的标签将在后续讲到。
JMS的全称是JAVA Message Service,是基于Java的,所以我觉得跨平台是没有问题的,此外它还有一个重要作用是可以实现不同系统之间的信息交互。

哦 我说错了一点,不经意说成了跨平台,其实我要说的是跨语言,呵呵
因为后面接着说的是类似公共格式的soap

关于跨语言的问题,我觉得如果可以的话这部分应该由厂商来提供。打个比方如果说有厂商提供的JMS是同时支持Java和C的,那么这个时候你通过Java来生产,通过C来消费是没有问题的,这样就实现了跨语言了;或者如果厂商提供的JMS实现只支持一种语言,但是又需要跨语言的话,这种情况你就看能否自己来做一个转换了。对于JMS跨语言这块我没有什么研究,现在C都忘了,熟悉的也就是Java了。
4 楼 chenying998179 2013-07-09  
此外它还有一个重要作用是可以实现不同系统之间的信息交互。
jms是基于消息中间件的存储转发的异步通信机制,实现系统之间的解耦合,缓解系统性能瓶颈
3 楼 chenying998179 2013-07-09  
234390216 写道
chenying998179 写道
博主写得很专业,本人受益匪浅,我看了那本 消息服务,spring集成jms有专门的标签,消息监听容器可以设置监听多个目的地[队列或主题](默认的bean标签只能设置一个监听目的地),比设置bean方便
有朋友问我消息服务能不能跨平台,我说这个序列化好像不能跨平台,不过好像哪里看到可以用类似webservice的soap方式传递消息,本人还没具体实践过

关于Spring对JMS支持的标签将在后续讲到。
JMS的全称是JAVA Message Service,是基于Java的,所以我觉得跨平台是没有问题的,此外它还有一个重要作用是可以实现不同系统之间的信息交互。

哦 我说错了一点,不经意说成了跨平台,其实我要说的是跨语言,呵呵
因为后面接着说的是类似公共格式的soap
2 楼 234390216 2013-07-09  
chenying998179 写道
博主写得很专业,本人受益匪浅,我看了那本 消息服务,spring集成jms有专门的标签,消息监听容器可以设置监听多个目的地[队列或主题](默认的bean标签只能设置一个监听目的地),比设置bean方便
有朋友问我消息服务能不能跨平台,我说这个序列化好像不能跨平台,不过好像哪里看到可以用类似webservice的soap方式传递消息,本人还没具体实践过

关于Spring对JMS支持的标签将在后续讲到。
JMS的全称是JAVA Message Service,是基于Java的,所以我觉得跨平台是没有问题的,此外它还有一个重要作用是可以实现不同系统之间的信息交互。
1 楼 chenying998179 2013-07-09  
博主写得很专业,本人受益匪浅,我看了那本 消息服务,spring集成jms有专门的标签,消息监听容器可以设置监听多个目的地[队列或主题](默认的bean标签只能设置一个监听目的地),比设置bean方便
有朋友问我消息服务能不能跨平台,我说这个序列化好像不能跨平台,不过好像哪里看到可以用类似webservice的soap方式传递消息,本人还没具体实践过

相关推荐

    JMS入门Demo

    在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: &lt;bean id="jmsContainer" class="org.springframework.jms....

    SPRING API 2.0.CHM

    MessageConverter MessageCreator MessageEOFException MessageFormatException MessageListenerAdapter MessageListenerAdapter102 MessageNotReadableException MessageNotWriteableException ...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    几乎是网上 能找到的 日志脱敏的所有实现 1、基于正则表达式的 日志脱敏实现 ,扩展logback 、log4j 2、springmvc 返回报文脱敏。 3、基于注解方式的脱敏。 大家选择使用。

    spring-cloud-stream-rabbit

    春云流兔Spring Cloud Stream示例展示了各种消息交换模式。 该项目基于Baeldung构建的SCS示例,并进行了修改以与Elmhurst版本或更高版本一起使用。 示例包括: MessageConverter:样本处理器应用程序,它接收一条...

    excel-parser-spring-boot-starter:Excel解析器

    标头名称的多语言处理可通过MessageConverter函数进行。 它提供元数据缓存功能以启用快速解析。 有关其他各种功能和用法,请参阅页面。 兼容性 Spring Boot 2.2或更高版本 释放 最新版本:1.2.1 热门使用 这是...

    自定义日志脱敏组件,简单3 步完成 Spring Boot 的日志脱敏

    对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverter②书写一个脱敏工具类,在打印日志的时候对特定特字段进行脱敏返回。 两种方式各有优缺点:第一种方式需要修改代码,不符合开闭...

    zxs:洲鑫系统

    算法:算法原始分析:code-analysis设计模式手写mybatis手写spring,springMVC并发:并发螺纹池分布式:Distributed 生物,蔚来净值rmijdk:jdk分析反射安全杰姆克斯函数接口片断探究React性-x:React性-x API使用...

    基于springboot集成mybatis、durid和自定义消息转换项目

    基于springboot集成mybatis、durid和自定义消息转换项目,实现阿里巴巴的durid对数据库连接池的设置和自定义消息转换的messageconverter,能够快速开发自己的应用。

    lucene-test

    相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean, 配置一些messageconverter。即解决了@Controller注解的使用前提配置。

    annotation.txt

    配置一些messageconverter。即解决了@Controller注解的使用前提配置是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。 

    vizix-kafka-connect-rabbitmq

    在Eclipse中导入项目 确保bin / io / confluent / connect / rabbitmq / MessageConverter.class已编译 运行path.sh以在out / kafka-connect-rabbitmq-1.0.0-preview_patch.jar中生成修补的lib

Global site tag (gtag.js) - Google Analytics