如何将TomEE资源注入我的Spring应用程序的上下文?

时间:2018-03-09 17:48:16

标签: spring activemq cdi tomee

我试图利用内置在TomEE容器中的ActiveMQ。我可以在启动的控制台输出中看到资源MyJmsConnectionFactory是由TomEE配置的。但我似乎无法将它注入我的Spring Bean中。关于CDI和Spring的文档缺乏。甚至缺少TomEE站点上的解释性文档。如果我编写一个更纯粹的JEE应用程序,我只能找到如何使用TomEE的JMS,而不是如何将这些容器资源与Spring Framework集成。

如果有人有任何链接或提示启发我,这是我第一次在StackOverflow上提问而不是找到已经问过的问题(并在这里回答)这很奇怪因为CDI / Spring聊天我在网上找到的可以追溯到2011年;甚至是2009年。我不知道国际技术人员社会是不是经常在网上讨论这个问题和解决方案?

1 个答案:

答案 0 :(得分:0)

放弃CDI让我畅通无阻。我没有依赖将ActiveMQ bean注入我的Spring webapp但是由Tomcat容器创建,而是在我的代码中自己创建了自己的ActiveMQ连接bean。

我正在使用Spring 5.0.3-RELEASE和activemq-client 5.15.3。我不需要maven阴影超级罐子activemq-all中的所有东西。

@Configuration
public class MyConfig {

  @Bean
  public SingleConnectionFactory connectionFactory() {
      ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
      ((ActiveMQConnectionFactory) connectionFactory)
            // See http://activemq.apache.org/objectmessage.html why we set trusted packages
            .setTrustedPackages(new ArrayList<String>(Arrays.asList("com.mydomain", "java.util")));
    return new SingleConnectionFactory(connectionFactory);
}

  @Bean
  @Scope("prototype")
  public JmsTemplate jmsTemplate() {
      return new JmsTemplate(connectionFactory());
  }

  @Bean
  public Queue myQueue() throws JMSException {
      Connection connection = connectionFactory().createConnection();
      connection.start();
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      Queue queue = session.createQueue("message-updates");
      return queue;
  }
}

@Component
public class MyQueueImpl implements MyQueue {

  @Inject
  private JmsTemplate jmsTemplate;

  @Inject
  private Queue myQueue;

  @PostConstruct
  public void init() {
   jmsTemplate.setReceiveTimeout(JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
  }

  @Override
  public void enqueue(Widget widget) {
      jmsTemplate.send(myQueue, new MessageCreator() {
          @Override
          public Message createMessage(Session session) throws JMSException {
              return session.createObjectMessage(widget);
          }
      });
  }

  @Override
  public Optional<Widget> dequeue() {
    Optional<Widget> widget = Optional.empty();
    ObjectMessage message = (ObjectMessage) jmsTemplate.receive(myQueue);
    try {
        if (message != null) {
            widget = Optional.ofNullable((Widget) message.getObject());
            message.acknowledge();
        }
    } catch (JMSException e) {
        throw new UncategorizedJmsException(e);
    }

    return widget;
  }
}

这是帮助我解锁自己的网页 - https://www.logicbig.com/tutorials/spring-framework/spring-integration/jms-template.html