Java JMS和线程池问题?

Java JMS和线程池问题?,java,spring,jms,threadpool,activemq,Java,Spring,Jms,Threadpool,Activemq,我希望jms在一个线程处理消息时接收消息(threadPool提交一个可调用的消息)。 消息由主线程接收。 以下哪种方式更好: 我使用spring 3.0.5: ApplicationContext context = new ClassPathXmlApplicationContext( "application-context.xml"); jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate"); destinat

我希望jms在一个线程处理消息时接收消息(threadPool提交一个可调用的消息)。 消息由主线程接收。 以下哪种方式更好:

我使用spring 3.0.5:

ApplicationContext context = new ClassPathXmlApplicationContext(
        "application-context.xml");
jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
destination = (Destination) context.getBean("destination");
_log4j.debug("ThreadSize in xml\t"
        + appConfig.getThumbCreatorThreadSize());
在主线程方式1中:

while (countFlag < 0) {
    try {
        TextMessage msg = (TextMessage) jmsTemplate
                .receive(destination);
        // prehandle ,then give to sub workers.
        if (msg != null) {
            _log4j.debug("JMSMessageID:\t" + msg.getJMSMessageID()
                    + "\t" + msg.getText());
            IConsumer thumbConsumerImpl = null;
            thumbConsumerImpl = new ThumbConsumerTaskImpl(msg);
            Future<List<ThumbCreatorInfo>> result = threadPool
                    .submit((Callable<List<ThumbCreatorInfo>>) thumbConsumerImpl);
        }
    } catch (IllegalArgumentException e) {
        _log4j.warn(e.getMessage(), e);
    } catch (JMSException e) {
        _log4j.error("Please check the queue server!JMSException!", e);
    } catch (Exception e) {
        _log4j.error("", e);
    }
}
while(countFlag<0){
试一试{
TextMessage msg=(TextMessage)jmsTemplate
.接收(目的地);
//预处理,然后交给下级工人。
如果(msg!=null){
_log4j.debug(“JMSMessageID:\t”+msg.getJMSMessageID()
+“\t”+msg.getText());
i消费者thumbConsumerImpl=null;
ThumbConsumerTrimpl=新的ThumbConsumerTaskImpl(msg);
未来结果=线程池
.submit((可调用)thumbpl);
}
}捕获(IllegalArgumentException e){
_log4j.warn(e.getMessage(),e);
}捕获(JME){
_log4j.error(“请检查队列服务器!jmsceception!”,e);
}捕获(例外e){
_log4j.错误(“,e);
}
}
在主螺纹方式2中:

    TextMessage msg = (TextMessage) jmsTemplate.receive(destination);
    do {
        try {
            // prehandle ,then give to sub workers.
            if (msg != null) {
                _log4j.debug("JMSMessageID:\t" + msg.getJMSMessageID()
                        + "\t" + msg.getText());
                IConsumer thumbConsumerImpl = null;
                thumbConsumerImpl = new ThumbConsumerTaskImpl(msg);
                Future<List<ThumbCreatorInfo>> result = threadPool
                        .submit((Callable<List<ThumbCreatorInfo>>) thumbConsumerImpl);
            }
            msg = (TextMessage) jmsTemplate.receive(destination);
        } catch (IllegalArgumentException e) {
            _log4j.warn(e.getMessage(), e);
        } catch (JMSException e) {
            _log4j.error("Please check the queue server!JMSException!", e);
        } catch (Exception e) {
            _log4j.error("", e);
        }
    } while (countFlag < 0);
TextMessage msg=(TextMessage)jmsTemplate.receive(目的地);
做{
试一试{
//预处理,然后交给下级工人。
如果(msg!=null){
_log4j.debug(“JMSMessageID:\t”+msg.getJMSMessageID()
+“\t”+msg.getText());
i消费者thumbConsumerImpl=null;
ThumbConsumerTrimpl=新的ThumbConsumerTaskImpl(msg);
未来结果=线程池
.submit((可调用)thumbpl);
}
msg=(TextMessage)jmsTemplate.receive(目的地);
}捕获(IllegalArgumentException e){
_log4j.warn(e.getMessage(),e);
}捕获(JME){
_log4j.error(“请检查队列服务器!jmsceception!”,e);
}捕获(例外e){
_log4j.错误(“,e);
}
}而(countFlag<0);

我不确定我是否明白您的意图。如果您试图同时处理多条消息,请远离JmsTemplate并使用with。也可通过

例如,您可以扔掉问题中显示的所有代码,改用以下代码:

<jms:listener-container concurrency="10">
    <jms:listener destination="some.queue" ref="fooService" method="handleNewFoo"/>
</jms:listener-container>

有一个主类启动JMS代理并启动Spring。当Spring启动时,它初始化一个bean,开始发送JMS消息。还有一个如上所述的Spring消息侦听器,它使用消息并将消息传递给生成消息的同一个bean,该bean将消息打印到stdout。

为什么不使用MDP呢?看起来您正在重新创建Spring功能

MDP示例:

public class MyMDP implements MessageListener {
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            ...do whatever...
        }
    }
}

我对SpringJMS不太了解。我如何确保这些消息都是子线程呢?代码应该是:新的ThumbConsumerTaskImpl(jmsTemplate,destination);在子线程中:(TextMessage)jmsTemplate.receive(destination);还有MDP,你的主意太好了。MDP如何与jmsTemplate建立关系?我的消费者只让一个线程进行调度。然后让子线程进行处理。@user808032:对,您似乎正在重写Spring已经完成的工作。我更新了我的答案。检查一下。哦,那么,只有一个客户端连接有10个线程吗?谢谢!默认情况下,除非正在使用外部事务管理器,否则为“是”。将创建单个连接。该连接将用于创建单个会话。该会话将用于为10个指定线程中的每一个创建使用者。我是,你好,瑞安。我不熟悉。你能给我一个完整的电子邮件地址吗linzuxiong1988@gmail.com谢谢
public class MyMDP implements MessageListener {
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            ...do whatever...
        }
    }
}