2016-08-21 121 views
0

我想從JMS隊列(使用ActiveMQ)讀取消息。我面臨的問題是,郵件正在從隊列中讀取,但未顯示在「服務激活器」中。春季集成 - JMS

任何幫助,非常感謝。

我的代碼是如下:

(1)彈簧配置

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:int-jms="http://www.springframework.org/schema/integration/jms" 
xmlns:jms="http://www.springframework.org/schema/jms" 
xmlns:int="http://www.springframework.org/schema/integration" 
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd 
    http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 


<!-- Component scan to find all Spring components --> 
<context:component-scan base-package="com.poc.springinteg._3" /> 

<!-- --> 
<bean id="remoteJndiTemplate" class="org.springframework.jndi.JndiTemplate" lazy-init="false"> 
    <property name="environment"> 
     <props> 
      <prop key="java.naming.provider.url">tcp://localhost:61616</prop> 
      <prop key="java.naming.factory.url.pkgs">org.apache.activemq.jndi</prop> 
      <prop key="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</prop> 
      <prop key="connectionFactoryNames">DefaultActiveMQConnectionFactory,QueueConnectionFactory</prop> 
      <prop key="queue.SendReceiveQueue">org.apache.geronimo.configs/activemq-ra/JCAAdminObject/SendReceiveQueue</prop> 
      <prop key="queue.SendQueue">org.apache.geronimo.configs/activemq-ra/JCAAdminObject/MDBTransferBeanOutQueue</prop> 
     </props> 
    </property> 
</bean> 

<bean id="remoteConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="false"> 
    <property name="jndiTemplate" ref="remoteJndiTemplate"/> 
    <property name="jndiName" value="QueueConnectionFactory"/> 
    <property name="lookupOnStartup" value="true" /> 
    <property name="proxyInterface" value="javax.jms.ConnectionFactory" /> 
</bean> 


<!-- Reading Queue --> 
<bean id="inputQueue" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg index="0"> 
     <value>InputQueue_3</value> 
    </constructor-arg> 
</bean> 

<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="remoteConnectionFactory"/> 
    <property name="destination" ref="inputQueue"/> 
    <property name="sessionTransacted" value="true"/> 
    <property name="maxConcurrentConsumers" value="1"/> 
    <property name="concurrentConsumers" value="1"/> 
    <property name="autoStartup" value="true"/>   
</bean> 

<int:channel id="inbound"/> 

<int-jms:message-driven-channel-adapter id="jmsIn" 
             channel="inbound" 
             container="messageListenerContainer" /> 


<int:service-activator input-channel="inbound" 
         ref="messageHandler" 
         method="onMessage"/> 


<bean id="messageHandler" class="com.poc.springinteg._3.HelloServiceImpl"/> 


</beans> 

(2)服務激活MDP:

package com.poc.springinteg._3; 
import javax.jms.Message; 
public class HelloServiceImpl 
{ 

public String onMessage(Message name) { 
    System.out.println("getHelloMessage:, " + name); 

    return "getHelloMessage:, " + name ; 
} 
} 

(3)應用啓動類:

import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class App { 

public static void main(String[] args) 
    { 
     ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:3_applicationContext.xml"); 

     applicationContext.registerShutdownHook(); 
    } 
} 

謝謝

回答

0

得到了解決我的問題:在方法 參數類型 「的onMessage」 應該是字符串:

import javax.jms.Message; 

public class HelloServiceImpl 
{ 

public String onMessage(String name) { 
    System.out.println("getHelloMessage:, " + name); 

    return "getHelloMessage:, " + name ; 
} 
} 
1

爲了讓您onMessage(javax.jms.Message name)工作,你應該在指定extract-payload="false"<int-jms:message-driven-channel-adapter>

/** 
* Specify whether the JMS request Message's body should be extracted prior 
* to converting into a Spring Integration Message. This value is set to 
* <code>true</code> by default. To send the JMS Message itself as a 
* Spring Integration Message payload, set this to <code>false</code>. 
* @param extractRequestPayload true if the request payload should be extracted. 
*/ 
public void setExtractRequestPayload(boolean extractRequestPayload) { 

並引用Reference Manual

如果extract-payload設置爲true(這是默認值),則接收到的JMS消息將通過MessageConverter傳遞。當依賴於默認的SimpleMessageConverter時,這意味着生成的Spring集成消息將擁有JMS消息的主體作爲其有效載荷。 JMS TextMessage將產生一個基於字符串的有效載荷,一個JMS BytesMessage將產生一個字節數組有效載荷,而一個JMS ObjectMessages Serializable實例將成爲Spring Integration Message的有效載荷。相反,如果您希望將原始JMS消息作爲Spring集成消息的有效內容,請將'extract-payload'設置爲false。