ÔÚµ±½ñ»¥ÁªÍøºÍµçÉÌÊ¢ÐеÄÇé¿öÏ£¬ÍøÕ¾µÄÐÔÄÜÊܵ½Á˼«´óµØÌôÕ½¡£´óÊý¾Ý£¬¸ß²¢·¢³ÉΪ´óÐÍÍøÕ¾µÄ±êÖ¾¡£ÎÞÂÛÌÔ±¦µÄË«11ÓŻݣ¬»¹ÊÇСÃ×ÇÀ¹º£¬ËüÃǶ¼ÓÐÒ»¸ö¹²Í¬µÄÌØµã£¬ÄǾÍÊÇÔÚ¶Ìʱ¼äÄÚ£¬Í»È»Ó¿È볬³öƽʱÊý±¶µÄÓû§¡£
Èç¹ûÿ¸öÓû§´ÓÇëÇ󣬵½¶©µ¥´¦Àí£¬ÔÙµ½ÏìÓ¦·µ»Ø¾ùÔÚÒ»¸öÇëÇóÖÐͬ²½´¦ÀíµÄ»°£¬Óû§µÄÏìӦʱ¼ä½«»áËæ×Ų¢·¢Á¿µÄÌá¸ßÔ½À´Ô½¾Ã£¬Ö±µ½×îºó·þÎñÆ÷±ÀÀ£¡£ÔÚÕâÖÖÇé¿öÏ£¬¿ÉÒÔʹÓÃJMSÏûÏ¢¶ÓÁУ¬Òì²½´¦Àí¶©µ¥¡£Óû§·¢³öÇëÇ󣬷þÎñÆ÷½ÓÊÕÇëÇóÒÔºó£¬ÏòÏûÏ¢¶ÓÁÐÖз¢ËÍÒ»¸öÏûÏ¢£¬¾ÍÁ¢¿Ì·µ»Ø¡°¶©µ¥Õý´¦Àí¡±µÄÏûÏ¢¸øÓû§¡£¶ø¶©µ¥´¦Àí·þÎñÆ÷¿ÉÒÔ²»Í£µÄ´ÓÏûÏ¢¶ÓÁÐÖÐÈ¡³öÏûÏ¢£¬°´ÕÕ×Ô¼ºµÄ½Ú×à½øÐд¦Àí¡£Õâ¾ÍÏñÉú²úÕß-Ïû·ÑÕßģʽһÑù¡£Í¨¹ýÕâÖÖÒì²½µÄ´¦Àí·½Ê½£¬Óû§ÏìӦʱ¼äµÃµ½Ëõ¼õ£¬·þÎñÆ÷µÄѹÁ¦Ò²¿ÉÒÔ±»Ê±¼ä·Öµ££¬´Ó¶ø±Ü¹ýºé·åÆÚ¡£
ÔÚ֮ǰµÄÎÄÕ JavaMail·¢ËÍgoogle email ÖУ¬ÎÒʹÓõÄÊÇͬ²½·½Ê½·¢ËÍemail£¬¿ÉÒÔÒ»¸öÓû§µÄÏìÓ¦ÓжàÂý¡£½ñÌìÎÒ½«Ê¹ÓÃJMSµÄ·½Ê½£¬¸Ä½øÓʼþ·¢ËÍϵͳ¡£
JMS
Ê×ÏÈ»¹ÊÇÒª¼òµ¥µÄ½éÉÜÏÂJMS£¨Java Messaging Service£©¡£Ì«»ù´¡µÄ¾Í²»ÔÙßëß¶ÁË£¬ÕâÀïÖ»ÁгöJMSµÄÁ½ÖÖÏûϢģʽ£º
PTPģʽ
PTPģʽÖУ¬ÏûÏ¢ÊÇQueueµÄÐÎʽ´ÓÒ»¶Ëµ½ÁíÒ»¶Ë¡£ÎÞÂÛclient2ÊÇ·ñÁ¬½Ó£¬ÔËÐÐÖУ¬
JMSµÄ¿É¿¿ÐÔʹµÃ Msg¶¼²»»á¶ªÊ§¡£µ±client2»Ö¸´ÔËÐÐʱ£¬Queue»á¼ÌÐø´«Êä¡£QueueµÄÁ½¶Ë¿ÉÒÔÓжà¸öclients£¬µ«ÊÇÿһ¸öÏûÏ¢£¬Ö»Äܱ»Ò»¸öconsumer
clientÏû·Ñ¡£ËùÒÔ£¬¶ÔÓÚÏû·Ñ¿Í»§¶ËÃǶøÑÔ£¬Ò²ÊôÓÚÕùÇÀʽÏû·Ñ¡£

Pub/Subģʽ
ÔÚ·¢²¼¶©ÔĵÄģʽÖУ¬ÔòÊÇÒÔtopic£¬subscription£¬clientµÄ·½Ê½¡£ËùÓеĶ©ÔÄÕß¾ù¿ÉÊܵ½ÏûÏ¢£¬Ò»¸öÏûÏ¢»á±»Öظ´µÄ·¢Ë͸ø²»Í¬µÄÏû·ÑÕß¡£

Ò»¸ötopicÏÂÃæ¿ÉÒԹҺܶàµÄsubscription£¬µ«ÊÇÕâЩsubscriptionÖ»ÓÐ4ÖÖÀàÐÍ£¬Õâ4ÖÐÀàÐÍÈçÏÂͼ£º

Subscription£ºÖ»ÄÜÓÐÒ»¸öclient£¬µ±client¶Ï¿ªÁ¬½Ó£¬subscriptionÔò×Ô¶¯Ïú»Ù¡£
Durable Subscription£ºÖ»ÄÜÓÐÒ»¸öclient£¬µ±client¶Ï¿ªÁ¬½Óºó£¬Message»á±»´æÔÚsubscriptionÖУ¬Ò»µ©clientÖØÐÂÁ¬½Ó£¬Ôò¼ÌÐø·¢ËÍÏûÏ¢¡£
Shared Subscription£º¿ÉÒÔÓжà¸öclientͬʱ¹ÒÔÚÒ»¸ösubscriptionÉÏ£¬ÕâÑù¿ÉÒÔÓжà¸öclient²¢ÐеĴ¦Àí´ËSubscriptionϵÄÏûÏ¢¡£¼Çס£¬ÏûÏ¢Ö»Äܱ»ÆäÖÐÒ»¸öclientËùÏû·Ñ£¬²»Äܱ»¶à¸öclientͬʱÏû·Ñ¡£
Shared Durable Subscription£ºÇø±ðÔÚdurableÉÏ£¬¼´client¶ÏÏߣ¬subscription»á¼ÌÐø´æÔÚ¡£
PTPÊʺϵ¥Ò»ÏûÏ¢ÀàÐÍ£¬µ¥Ò»Ïû·ÑÕßÀàÐÍ¡£¶øPub/SubÊʺ϶àÖÖÀàÏûÏ¢£¬ºÍ¶àÖÖÏû·ÑÕßÀàÐÍ¡£
´ËÍ⣬ÏûÏ¢¿ÉÒÔÊǿɳ־û¯µÄ£¬Ò²¿ÉÒÔÊǷdz־û¯µÄ¡£³Ö¾Ã»¯µÄÏûÏ¢½«±»Ð´ÈëÓ²ÅÌ£¬µ±MQ serverÖØÆôºó£¬ÏûÏ¢²»»á¶ªÊ§¡£
ÏûÏ¢µÄÏû·Ñ·½Ê½Ò²´æÔÚÁ½ÖÖģʽ£º
JMS client APIµ÷ÓᣴËÖÖ·½Ê½µÄȱµãÔÚÓÚ£¬ÐèÒª×Ô¼ºÎ¬»¤¶àÏ̡߳£
MDB£¨Message Driven Bean£©¡£Ê¹ÓÃEJBµÄ·½Ê½£¬¿ÉÒÔÓÉEJBÈÝÆ÷°ïæ¹ÜÀí¶àÏ̡߳£ÆäÖÐMDBÊǶàʵÀýµÄ£¬Ã¿¸öÏûÏ¢¹ýÀ´¶¼ÊÇÒ»¸öеÄÏ̡߳£
JMS·þÎñÆ÷
Ò»°ã£¬³ÆÎªMQ server¡£µ±Ç°×î»ðµÄÊÇApache ActiveMQ£¬Ò²ÓÐʹÓÃJBoss MessagingµÄ¡£µ«±¾ÎĽ«Ê¹ÓÃOracleµÄGlassfish
Open MQ¡£
Open MQÊÇOracle GlassfishϵÄÒ»¿îMQ server£¬ËüÊǵÚÒ»¸öʵÏÖÁËJMS2.0±ê×¼µÄMQ
server¡£Ëü¿ÉÒÔµ¥¶ÀʹÓ㬴¼¯Èº£¬Ò²¿ÉÒÔÄÚǶµ½GlassfishÖÐʹÓá£ÔÚGlassfish4ÖУ¬OpenMQÒѾ¼¯³ÉÔÚGlassfish4ÖС£Glassfish4¿ÉÒÔʹÓÃÄÚǶµÄOpenMQÀ´Âú×ãСÐÍÍøÕ¾µÄÒì²½ÏûÏ¢´¦Àí£¬Ò²¿ÉÒÔʹÓÃÍⲿµÄOpemMQ¼¯ÈºÀ´Âú×ã´óÐÍÍøÕ¾µÄÒì²½ÏûÏ¢´¦Àí¡£
ÓÐÈË»áºÜ¾À½á£¬ActiveMQ£¬OpenMQµ½µ×ÄÄÒ»¸öºÃ£¿ÆäʵÎÒ¾õµÃÿһ¿îÈí¼þ¶¼Óи÷×ÔµÄÌØµã£¬ËüÃǾùÄÜÖ§³ÅÆðÒ»¸ö´óÐÍÍøÕ¾µÄ¼Ü¹¹£¬ÎÊÌâÔÚÓÚÄãÈçºÎʹÓÃËüÃÇ¡£GlassfishÊÇÒ»¸öËõСÐ͵ÄWebLogic£¬ÇáÇÉÒ×Óá£OpenMQÖ§³ÖJMS2.0£¬Ò×¼¯³ÉÓÚGlassfish£¬ÓÖΪOracleÖ§³ÖµÄ¿ªÔ´ÏîÄ¿£¬ÆäÄÜÁ¦Ò»ÑùÇ¿º·¡£Î¨Ò»µÄȱµãÊÇ£¬¼¯³ÉÓÚGlassfishÖеÄOpenMQ²»Ö§³ÖC¿Í»§¶Ë¡£
½ÓÏÂÀ´£¬ÎÒ½«Ê¹ÓÃJMSÏûÏ¢¶ÓÁÐÀ´ÓÅ»¯Óʼþ·¢ËÍϵͳ¡£
СÐÍÍøÕ¾µÄÓʼþ·¢ËÍϵͳ
±Ø±¸Èí¼þ
Glassfish4£¬°æ±¾4ÊDZØÐëµÄ£¬ÒòΪ4Öм¯³ÉÁËOpenMQ£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÔÚGlassfish4ÖÐʹÓñ¾µØJMS·þÎñ¡£Õë¶Ô´óÐÍÍøÕ¾µÄÔ¶³ÌJMS·þÎñ£¬ÎÒÃǽ«ÔÚÏÂһƪÎÄÕÂÖÐʵÏÖ¡£
¸ÄÔì·½°¸
±¾ÎĽ«³¢ÊÔÁ½ÖÖ¸ÄÔì·½°¸£º
JMS client API + threadPool£¬×Ô¼ºÔÚºǫ́Æô¶¯Ï̼߳àÌý£¬²¢¹ÜÀí¶àÏ̡߳£
MDB£¬ EJBÈÝÆ÷½øÐÐMessage¼àÌý£¬²¢°ïÖú¹ÜÀí¶àÏ̡߳£
Ó¦¸ÃʹÓöàÉÙỊ̈߳¿ Ï̵߳ÄÊýÁ¿ÓëCPUµÄÊýÁ¿ºÍIO×èÈûʱ¼äÓйØÏµ¡£Èç¹ûÏß³ÌûÓÐÈκÎIO×èÈû£¬ÄÇô£¬Ïß³ÌÊýÁ¿Ó¦¸ÃºÍCPUÊýÁ¿Ïàͬ¡£ÒòΪ¶àÓàµÄÏß³ÌÐèÒªµÈ´ýCPU¡£Èç¹û´æÔÚIO×èÈû£¬ÔòÐèÒª¶àÓàCPUÊýÁ¿µÄỊ̈߳¬Ò»¸öÏß³Ì×èÈûÔÚIOÉϵÄʱºò£¬CPU²»ÖÁÓÚ¿ÕÏУ¬¿ÉÒÔÈ¥Ö´ÐÐÆäËüÏ̡߳£×ÐÏ¸ÍÆµ¼£¬¿ÉÒÔÄÜͨ¹ýIO×èÈûʱ¼ä¸úÔËÐÐʱ¼äµÄ±ÈÀý£¬¿ÉÒÔ¼ÆËã³öËùÐèÏ̵߳ÄÊýÁ¿
¡£
ÏÔÈ»£¬·½°¸¶þÊÇ×îÃ÷ÖǵÄ×ö·¨¡£¼ÒÏÂÀ´£¬¿ªÊ¼ÊµÏÖ·½°¸¶þ¡£
ÅäÖÃJMS Resources
´ò¿ªGlassfish¹ÜÀíÒ³Ãæ http://localhost:4848
ÅäÖÃJMS ConnectionFactory¡£¿ÉÒÔʹÓÃglassfishĬÈϵġ£

ÅäÖÃDestination Resources. Õ¹¿ªResources->JMS
Resources->Destination Resources. ´´½¨Ò»¸öQueue resource¡£

ÅäÖÃJava Mail Session
ÇëÔÚÉÏһƪÎÄÕÂÖÐ http://my.oschina.net/xpbug/blog/263974#OSC_h2_3
ÕÒµ½GmailµÄÅäÖ÷½·¨¡£
´´½¨Ò»¸öWebÏîÄ¿
´´½¨Ò»¸öÃûΪsampleµÄwebÏîÄ¿¡£
´´½¨MDB
´´½¨½ÓÊÕJMSÏûÏ¢µÄMDB£¬ÎÒÃÇʹÓüòµ¥µÄtext message¡£emailµØÖ·ÔÚmessageÌåÖС£MDB»áÏòµØÖ·Öз¢ËÍÒ»¸ö¼òµ¥Óʼþ¡£
package com.mycompany;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
*
* @author none2
*/
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class EmailMessageBean implements MessageListener {
private final Session mySession;
public EmailMessageBean() throws NamingException {
Context initCtx = new InitialContext();
mySession = (Session) initCtx.lookup("mail/mySession");
}
@Override
public void onMessage(Message message) {
try {
String address = message.getBody(String.class);
javax.mail.Message mail = new MimeMessage(mySession);
mail.setFrom(new InternetAddress("joey.zhangpeng@gmail.com"));
Address toAddress = new InternetAddress(address);
mail.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);
mail.setSubject("Hello");
mail.setText("A notification.");
Transport.send(mail);
} catch (MessagingException | JMSException ex) {
Logger.getLogger(EmailMessageBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
|
index.html
´´½¨ÍøÕ¾µÄĬÈÏÒ³Ãæ
<html> <head> <title>TODO supply a title</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <form method="post" action="/sample/NotifyServlet"> Email:<input name="email" value=""/> <input type="submit" value="Buy" name="submit"/> </form> </body> </html> |
´´½¨NotifyServlet
ÔÚservletÖУ¬Ê¹ÓÃjms client£¬·¢ËÍjmsÏûÏ¢µ½queueÖС£
package com.mycompany;
import java.io.IOException;
import java.io.PrintWriter;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.Queue;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author none2
*/
@WebServlet(name = "NotifyServlet",
urlPatterns = {"/NotifyServlet"})
public class NotifyServlet extends HttpServlet
{
@Resource(lookup = "java:comp/DefaultJMSConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(lookup = "jms/myQueue")
private Queue queue;
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String email = request.getParameter("email");
try (JMSContext context = connectionFactory.createContext();)
{
context.createProducer().send(queue, email);
}
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following
sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet NotifyServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>You have send a notification
to " + email + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
} |
×îºó£¬½øÐÐÏîÄ¿´ò°ü²¢²¿Êð¡£·ÃÎÊ http://localhost:8080/sample/
À´²âÊÔһϡ£
|