Java 在weblogic和SpringJMS模板中,同一模块中有多个队列,只有一个连接工厂

Java 在weblogic和SpringJMS模板中,同一模块中有多个队列,只有一个连接工厂,java,jms,message-queue,weblogic12c,spring-jms,Java,Jms,Message Queue,Weblogic12c,Spring Jms,我不熟悉JMS和队列。请原谅我的知识 服务器:Weblogic 12.x 框架:Spring、Hibernate、SpringJMS和JMSTemplate 我有一个业务案例,其中调度器每X分钟唤醒一次,处理记录并将其推送到队列中。事实上,我们有两个调度器执行相同的操作,但用于不同的表。因此,在本例中,我为JMS模板实现了一种无xml方法(完全注释)。我在weblogic中设置了一个模块,其中包含一个连接工厂和两个队列。我已经测试过了,它工作得很好 但是, 这是一种使用两个队列和一个conn工厂

我不熟悉JMS和队列。请原谅我的知识

服务器:Weblogic 12.x 框架:Spring、Hibernate、SpringJMS和JMSTemplate

我有一个业务案例,其中调度器每X分钟唤醒一次,处理记录并将其推送到队列中。事实上,我们有两个调度器执行相同的操作,但用于不同的表。因此,在本例中,我为JMS模板实现了一种无xml方法(完全注释)。我在weblogic中设置了一个模块,其中包含一个连接工厂和两个队列。我已经测试过了,它工作得很好

但是,

  • 这是一种使用两个队列和一个conn工厂的好方法吗
  • 在QueueMessageSender中,我使用以下注释发送消息

        @Autowired
            private JmsTemplate jmsTemplate_Queue_1;
            @Autowired
            private JmsTemplate jmsTemplate_Queue_2;
    
            jmsTemplate_Queue_1.send(wrapMessage("Hello"));
            jmsTemplate_Queue_1.send(wrapMessage("test"));
    
    private MessageCreator wrapMessage(final String msg) {
            return new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    ObjectMessage om = session.createObjectMessage();
                    om.setObject(msg);                
                    return om;
                }
            };
    }
    
  • 这样做对吗? 如果这不是一个正确的方法,将来我可能会遇到什么问题

    关于这个主题的任何建议都可能对我有所帮助。您可以为JMS和基于示例的spring方法推荐任何好书都将非常棒

    以下是java中的配置文件:

    @Configuration
    @EnableJms
    @ComponentScan({ "com.xxxx.xxx.config" })
    @PropertySource("classpath:application.properties")
    public class JmsConfiguration{
    
        @Autowired
        private Environment environment;
    
        @Bean
        public JndiTemplate jndiTemplate() {
            JndiTemplate jndiTemplate = new JndiTemplate();
            Properties jndiProps = new Properties();
    
            jndiProps.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
            Properties props = System.getProperties() ;
            jndiProps.setProperty("java.naming.provider.url","t3://localhost:7001"); 
            jndiTemplate.setEnvironment(jndiProps);
            return jndiTemplate;
        }
    
        @Bean
        public JndiObjectFactoryBean jmsConnectionFactory() {
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    
            jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
            jndiObjectFactoryBean.setJndiName(environment.getProperty("jms.connectionFactory"));
    
            return jndiObjectFactoryBean;
        }
    
        @Bean
        public JndiObjectFactoryBean queue_one() {
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    
            jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
            jndiObjectFactoryBean.setJndiName(environment.getProperty("jms.queue_one")); 
            return jndiObjectFactoryBean;
        }
    
        @Bean
        public JndiObjectFactoryBean queue_two() {
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    
            jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
            jndiObjectFactoryBean.setJndiName(environment.getProperty("queue_two")); 
            return jndiObjectFactoryBean;
        }
    
        @Bean
        public TransactionAwareConnectionFactoryProxy connectionFactoryProxy() {
            return new TransactionAwareConnectionFactoryProxy((ConnectionFactory) jmsConnectionFactory().getObject());
        }
    
        @Bean(name="jmsTemplate_Queue_1")
        public JmsTemplate jmsTemplate_Queue_1() {
            JmsTemplate jmsTemplate = new JmsTemplate(connectionFactoryProxy());
    
            jmsTemplate.setSessionTransacted(false);
            jmsTemplate.setReceiveTimeout(5000);
            jmsTemplate.setDefaultDestination((Destination) queue_one().getObject());
    
            return jmsTemplate;
        }
    
        @Bean(name="jmsTemplate_Queue_2")
        public JmsTemplate jmsTemplate_Queue_2() {
            JmsTemplate jmsTemplate = new JmsTemplate(connectionFactoryProxy());
    
            jmsTemplate.setSessionTransacted(false);
            jmsTemplate.setReceiveTimeout(5000);
            jmsTemplate.setDefaultDestination((Destination) queue_two().getObject());
    
            return jmsTemplate;
        }
        //Thank you for looking the code till here. I don't want to be rude by not saying thank you! 
        @Bean
        public QueueMessageSender queueMessageSender() {        
            return  new QueueMessageSender();
        }
    

    你所拥有的一切都是美好的;因为它们都使用相同的连接工厂,所以您可以使用单个
    JmsTemplate
    ,并在每次发送时传入目标,但是没有必要只使用两个队列。如果您有很多队列,那么管理起来可能会更容易

    然而,没有这样的方法

    jmsTemplate_Queue_1.send("Hello");
    
    。。。我想你是说

    jmsTemplate_Queue_1.convertAndSend("Hello");
    

    …因为字符串必须转换为JMS消息。

    我的错误,先生。我已经用另一种方法编辑了消息部分。另外,你能为新手推荐一本关于JMS和spring队列/主题消息传递的好书吗。JMS设置和配置是否特定于weblogic/Jboss等服务器?中的章节应该包含您需要的大部分内容。是的,设置代理依赖于供应商,但通常,从Spring配置的角度来看,它只意味着
    目的地(队列/主题)和连接工厂bean定义的不同类名,或者使用JNDI从服务器获取它们。这使得在不同的代理中使用相同的Spring应用程序非常容易。例如,一个嵌入的ActuMeq代理经常用于CI集成测试。您可能需要考虑使用<代码>转换和发送> <代码>方法。这样,
    字符串
    将作为
    文本消息
    发送。始终发送
    ObjectMessage
    不一定是最好的选择。