在我学习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();
}
}
}