1

我是 Spring 集成的新手。我缺乏它的基础知识。

我们需要轮询一个状态为 0 的 oracle 数据库表,并将该记录以 XML 格式发送到 JMS 队列。

jdbc:inbound 通道适配器正在获取一条记录并连接到 jms 出站通道适配器,这应该很简单。但我有以下两个问题

1)我看到在activeMQ管理控制台中有1个消费者满足我的要求和配置,队列上不应该有任何监听我想要的只是将消息发送到队列。

2)事务未提交。当我点击它时,我看到了消息,没有消息。如果停止我的进程消息正在提交。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:task="http://www.springframework.org/schema/task" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc" 
    xmlns:int-jms="http://www.springframework.org/schema/integration/jms" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:stream="http://www.springframework.org/schema/integration/stream"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/integration/jdbc http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd
        http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
        http://www.springframework.org/schema/integration/stream http://www.springframework.org/schema/integration/stream/spring-integration-stream-2.0.xsd">

<!--    <import resource="context.xml"/> -->
<!--     <context:Resource name="jms/mqConnectionFactory"   -->
<!--               auth="Container"   -->
<!--               type="org.apache.activemq.ActiveMQConnectionFactory"   -->
<!--               description="JMS Connection Factory"   -->
<!--              factory="org.apache.activemq.jndi.JNDIReferenceFactory"   -->
<!--               brokerURL="tcp://localhost:61616" />   -->
    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
          <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL">
              <value>${activemq.brokerurl}</value>
            </property>
          </bean>
        </property>
     </bean>

     <bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="${jms.queue.name}"/>
    </bean>

<!--         <context:Resource name="jms/CM_TO_UIS"   -->
<!--               auth="Container"   -->
<!--               type="org.apache.activemq.command.ActiveMQQueue"   -->
<!--               factory="org.apache.activemq.jndi.JNDIReferenceFactory"   -->
<!--               physicalName="TEST_AMQ"/>  -->
    <bean id="splitterBean" class="edu.bc.academic.coursepolling.integration.MessageSplitter" />
    <bean id="contentTransformerBean" class="edu.bc.academic.coursepolling.integration.ContentTransformer" />
    <bean id="productRouterBean" class="edu.bc.academic.coursepolling.integration.ProductRouter" />
    <poller default="true" max-messages-per-poll="1" receive-timeout="5000"
        fixed-delay="5000"
        xmlns="http://www.springframework.org/schema/integration">
        <transactional />
    </poller>

    <int:channel id="jdbcChannel">
        <int:interceptors>
            <int:wire-tap channel="logger" />
        </int:interceptors>
    </int:channel>

    <int:logging-channel-adapter id="logger" level="ERROR" />

    <int-jdbc:inbound-channel-adapter 
    channel="jdbcChannel" 
    query="${int.poll.query}" 
         data-source="dataSource" max-rows-per-poll="1"

        update="update COURSE_POLLER_T set status=1 where COURSE_POLLER_ID in (:COURSE_POLLER_ID)">

    </int-jdbc:inbound-channel-adapter>

    <int-jdbc:outbound-channel-adapter
        query="update COURSE_POLLER_T set status=-1 where COURSE_POLLER_ID in (:payload[COURSE_POLLER_ID])"
        data-source="dataSource" channel="rejectedMessagesChannel" />

    <int:publish-subscribe-channel id="rejectedMessagesChannel" />

    <int:chain input-channel="jdbcChannel" >
        <int:splitter ref="splitterBean"/>
<!--        <int:service-activator ref="service" method="process" /> -->
        <int:router ref="productRouterBean" method="route" />
<!--        <int:transformer ref="contentTransformerBean" method="transform"/> -->
    </int:chain>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${int.jdbc.driver}" />
        <property name="url" value="${int.jdbc.url}" />
        <property name="username" value="${int.jdbc.user}" />
        <property name="password" value="${int.jdbc.password}" />
    </bean>

    <bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:int-${ENVIRONMENT}.properties" />
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="order" value="1" />
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="service" class="edu.bc.academic.coursepolling.integration.CoursePollerService" />

<!--    <stream:stdout-channel-adapter id="replyChannel"></stream:stdout-channel-adapter> -->

<!--    <bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> -->
<!--        <property name="poolSize" value="${int.scheduler.pool.size}" /> -->
<!--    </bean> -->

<!--    <int-jms:outbound-channel-adapter id="jmsOut" destination="outQueue"  channel="exampleChannel"/> -->
<!--   connection-factory="jmsFactory"
     destination="defaultDestination"-->
    <int-jms:channel id="jmsSenderChannel" queue="defaultDestination" connection-factory="jmsFactory" />
    <int-jms:outbound-channel-adapter id="jmsOut"   channel="jmsSenderChannel" 
     jms-template="jmsOutputTemplate" >
    </int-jms:outbound-channel-adapter>


   <bean id="jmsOutputTemplate" class="org.springframework.jms.core.JmsTemplate">
      <property name="connectionFactory" ref="jmsFactory"/>
      <property name="defaultDestination" ref="defaultDestination"/>
      <property name="deliveryPersistent" value="true"/>
      <property name="sessionTransacted" value="true"/>
      <property name="sessionAcknowledgeMode" value="0"/>
   </bean>
</beans>

提前致谢

4

0 回答 0