为啥 jmsTemplate 总是为空?使用 spring 和 Apache ActiveMQ [重复]

Posted

技术标签:

【中文标题】为啥 jmsTemplate 总是为空?使用 spring 和 Apache ActiveMQ [重复]【英文标题】:Why is jmsTemplate always null? Using spring and Apache ActiveMQ [duplicate]为什么 jmsTemplate 总是为空?使用 spring 和 Apache ActiveMQ [重复] 【发布时间】:2016-01-18 12:57:23 【问题描述】:

我对 Spring 和 JMS 非常陌生。我一直在尝试提出一个涉及activemq和Spring的实现,如下所示。

spring-context.xml
<bean id="sampleApacheConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" lazy-init="true">
    <property name="brokerURL" value="tcp://localhost:61616"/>
    <property name="userName" value=“kodeseeker"/>
    <property name="password" value=“mypassword"/>

</bean>

 <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="sampleApacheConnectionFactory" />
    </bean>

    <!--  Default Destination Queue Definition-->
    <bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="test.Foo"/>
    </bean>

    <!-- JmsTemplate Definition -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="defaultDestination" />
    </bean>

    <!-- Message Sender Definition -->
    <bean id="messageSender" class="com.mypackage.Publisher2">
    </bean>

<!-- Message Receiver Definition -->
    <bean id="messageReceiver" class="com.mypackage.Listener">

    </bean>
       <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destinationName" value="test.Foo" />
        <property name="messageListener" ref="messageReceiver" />
    </bean>

</beans>

Publisher2.java

public class Publisher2 

 @Autowired
 protected JmsTemplate jmsTemplate;
 .......
// function called to perform update.
  public void publishUpdate(final CustomMessage payload) throws JMSException 
      LOGGER.entry();
      try 
          JmsTemplate jmsTemp= this.jmsTemplate;
          if(jmsTemp ==null)
        //jmsTemplate is ALWAYS null.
           LOGGER.error("Jms Template is never initialized!!");
           return;
          
          jmsTemp.send(new MessageCreator()
         @Override
         public Message createMessage(Session session) throws JMSException 
             Message message = message(payload,session);    
             LOGGER.info("Sending message");
             return message;
        
        );
       catch (Exception jmsExcpetion) 
          LOGGER.error("Error placing message on Queue",jmsExcpetion);
     
      
      LOGGER.exit();
  

为了初始化jmsTemplate,我有什么特别需要做的吗?如有必要,我很乐意提供更多详细信息。

编辑 1: 类调用publishupdate

public class UpdateHandlerImpl implements UpdateHandler 
    private final Publisher2 publisher;
    ....
    public UpdateHandlerImpl() 
        this(new Publisher2());
    
    public UpdateHandlerImpl(
            final Publisher2 publisher) 
           this. publisher = publisher;
    
    ....
    @Override
    public void  handle(final CustomMessage entity) 
        try 
                     publisher. publishUpdate(entity);
         catch (final JMSException e) 
            LOGGER.error("Error sending message", e);
        

            
   …..
    

编辑 3: 基于@keith 输入的UpdateHandlerImpl 更新版本

public class UpdateHandlerImpl implements UpdateHandler 
    //Hoping spring wires this?
    Publisher2 publisher;
    @Override
    public void  handle(final CustomMessage entity) 
        try 
                     publisher. publishUpdate(entity);
         catch (final JMSException e) 
            LOGGER.error("Error sending message", e);
        

            
   …..
    

编辑 2: spring 上下文在启动时使用以下注释通过 mule(这是一个 mule 应用程序)加载。

<spring:beans>
        <spring:import resource="classpath:spring-context.xml" />
    </spring:beans>

【问题讨论】:

显示你正在调用的课程publishUpdate @chrylis 。添加了详细信息。我希望它有所有必需的信息,如果不能随意询问。我可以提供更多背景信息。 【参考方案1】:

如果您使用new 创建Publisher2,您将不会将依赖关系连接到您创建的实例上。相反,在您的上下文文件中将其定义为 Spring bean 并从那里获取它。

编辑

正如我所怀疑的,在您对问题的最新更新中,您确认您正在使用新创建一个 Publisher2

public UpdateHandlerImpl() 
        this(new Publisher2());
    

这不是 Spring 的工作方式。请参阅 Spring Framework 文档中有关实例化 bean 的Section 6.3.2。 (简而言之,使用 context 创建 bean)

【讨论】:

感谢您的回答.. 但是根据您提供的链接,我不是已经在 spring-context 文件&lt;bean id="messageSender" class="com.mypackage.Publisher2"&gt; &lt;/bean&gt; 中这样做了。 您不应该在代码中实例化您希望 Spring 为您连接的 任何 对象。在这种情况下,new Publisher2()) 正在破坏您对依赖注入的使用,因为它不是由框架管理的 bean。 我在spring-context.xml 中添加了以下行。 &lt;beans&gt; &lt;bean name="publisher" class="com.mypackage.Publisher2"/&gt; &lt;/beans&gt; 并删除了实例化。 IE。制作了像this 这样的新课程。但 jmsTemplate 继续为空。我错过了什么? 春天不适用于“希望”。您必须告诉 Spring 在类中注入依赖项,或者使用字段上的 Autowired 注释和类上的 Component(使其成为 Spring bean)或使用 XML 中的 bean 定义(您还必须将 UpdateHandlerImpl 定义为春豆)。 希望....太有趣了,但听了很失望。

以上是关于为啥 jmsTemplate 总是为空?使用 spring 和 Apache ActiveMQ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥“req.user”在使用sails-auth 验证后总是在/user/me 控制器中为空?

iOS UI测试中元素lastSnapshot的子属性总是为空,为啥?

为啥检查字符串是不是为空的函数总是返回true? [关闭]

为啥在 Visual Studio 2017 中调试 Cordova 应用程序时 DOM Explorer 总是为空?

为啥我的一个ajax请求总是被取消,回复data为空

为啥在 MVC 项目中返回的表单值为空?