通过同一EJB将JMS消息发送到主题或队列 - 由单个MDB消耗?

时间:2017-03-03 20:13:05

标签: java java-ee asynchronous ejb jms

在我学习JMS异步消息的过程中,我创建了一个简单的应用程序。

有一个消息生产者(无状态bean),它正在向队列发送消息(在Wildfly 10上配置)。消息驱动的bean消耗来自队列的消息。还有一个servlet调用我的消息生成器bean的"SendToQueue(MailEvent mailEvent)"方法。

现在我有一个想法是在同一个bean中创建另一个方法"SendToTopic(MailEvent mailEvent)",以便可以从另一个servlet中调用它。

  • 使用两种方法向主题或队列发送消息是否是正确的方法?

  • 单个MDB也可以使用这些消息吗? 什么被认为是这种情况下的最佳做法?

  • 从OOP角度创建一个具有"SendToQueue(MailEvent mailEvent)""SendToTopic(MailEvent mailEvent)"方法的接口是一个好主意吗?

我只是在学习,所以可能会遗漏某些东西,并会对任何建议或批评表示感激。

@Stateless(name = "EmailSessionBean")
public class EmailSessionBean {

    public EmailSessionBean() {
    }

    @Resource(mappedName = "java:/ConnectionFactory")
    private ConnectionFactory connectionFactory;

    @Resource(mappedName = "java:/jms/queue/MyQueue")
    private Queue queue;

    public void SendToQueue(MailEvent mailEvent) {

    try {
        Connection connection = connectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer messageProducer = session.createProducer(queue);

        ObjectMessage objMsg = session.createObjectMessage();
        objMsg.setObject(mailEvent);

        messageProducer.send(objMsg);
        out.println("Sent ObjectMessage to the Queue");
        session.close();

    } catch (JMSException e) {
        e.printStackTrace();
    }
}

MDB

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(
                propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(
                propertyName = "destination", propertyValue = "java:/jms/queue/MyQueue") })

public class EmailMDB implements javax.jms.MessageListener {
    @Resource(mappedName = "java:jboss/mail/Gmail")
    private Session mailSession;

    public void onMessage(Message message){
        try {
            if (message instanceof ObjectMessage) {
                System.out.println("Queue: I received an ObjectMessage " +
                        " at " + new Date());
                ObjectMessage objectMessage = (ObjectMessage) message;
                MailEvent mailEvent = (MailEvent) objectMessage.getObject();

                InternetAddress fromAddress = InternetAddress.getLocalAddress(mailSession);
                String fromString = fromAddress.getAddress();

                javax.mail.Message msg = new MimeMessage(mailSession);

                //msg.setFrom(fromAddress);
                msg.setFrom(new InternetAddress(fromString,"From me to you"));
                InternetAddress[] address = {new InternetAddress(mailEvent.get_To())};
                msg.setRecipients(javax.mail.Message.RecipientType.TO, address);
                msg.setSubject(mailEvent.getSubject());
                msg.setSentDate(new java.util.Date());
                msg.setContent(mailEvent.getMessage(), "text/html");
                System.out.println("MDB: Sending Message...");

                Transport.send(msg);

                System.out.println("MDB: Message Sent");
            }
            else {
                System.out.println("Invalid message ");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

0 个答案:

没有答案