|
以下使用一個簡單的範例,示範如何在Stateless Session Bean上使用Timer服務,客戶端可以指定時間啟動Timer,排定在某個時間送訊息給Message-Driven Bean。
首先定義一個簡單的介面:
package onlyfun.caterpillar;
import java.util.Date; import javax.ejb.Local;
@Local public interface IMaintain { public void scheduleMessage(Date expiration, String message); }
在Stateless Session Bean實作部份,使用@Resource注入TimerService、ConnectionFactory與Destination:
package onlyfun.caterpillar;
import java.util.Date; import javax.annotation.Resource; import java.util.logging.*; import javax.ejb.*; import javax.jms.*;
@Stateless public class MaintainBean implements IMaintain { @Resource(name="jms/HelloQueueFactory") private ConnectionFactory connectionFactory; @Resource(name="jms/HelloQueue") private Destination queue; @Resource private TimerService timerService;
public void scheduleMessage(Date expiration, String message) { timerService.createTimer(expiration, message); }
@Timeout public void sendMessage(Timer timer) { try { String message = (String) timer.getInfo();
Connection connection = connectionFactory.createConnection(); Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(queue); TextMessage textMessage = session.createTextMessage(); textMessage.setText(message); producer.send(textMessage);
producer.close(); session.close(); connection.close(); } catch (JMSException ex) { Logger.getLogger( MaintainBean.class.getName()).log(Level.SEVERE, null, ex); } } }
如果您想要從EJBContext中取得TimerService,則可以如下:
...
@Resource
private SessionContext context;
public void scheduleMessage(Date expiration, String message) {
TimerService timerService = context.getTimerService();
timerService.createTimer(expiration, message);
}
....
若不使用@Timeout標註,則您要實作TimedObject介面,實作其void ejbTimeout(Timer timer)方法。
為了配合這個範例,改寫一下 第
一個 Message-Driven Bean 中的Message-Driven Bean範例:
package onlyfun.caterpillar;
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.jms.TextMessage;
@MessageDriven(mappedName = "jms/HelloQueue", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") }) public class HelloMessageBean implements MessageListener { public void onMessage(Message message) { try { TextMessage txtMessage = (TextMessage) message; System.out.println(txtMessage.getText() + " processed....Orz"); } catch (JMSException ex) { Logger.getLogger(HelloMessageBean.class.getName()) .log(Level.SEVERE, null, ex); } } }
以下是個簡單的Servlet客戶端測試,排定在呼叫後的10秒鐘執行:
package onlyfun.caterpillar;
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import javax.ejb.EJB;
public class HelloServlet extends HttpServlet { @EJB private IMaintain maintain; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MILLISECOND, 10000); maintain.scheduleMessage(calendar.getTime(), "save me....XD"); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
public String getServletInfo() { return "Short description"; } }
|