转:http://blog.csdn.net/huwenfeng_2011/article/details/43457645

HTTP Service插件

这里的http接口插件是神马?

Openfire主要是在消息推送,那么与其他系统的的消息怎么结合呢,那么这里这个HTTP Service插件就提供了一个基于HTTP的接口。为什么要提供这样的接口?在有些互联网的场景。一个用户平台可以是web的,当然也会有移动终端的APP,那么web端要给移动终端的APP发送消息就依赖这样的接口了。当然这里只是一种实现方式。

首先查看在OF控制太的web页面

本人这里做新增了短信接口。有业务场景的不同这里就不提出来了。

接下来看看插件目录包:

下面编写一个个业务类:

JAVA部分

HttpServiceServlet:

  1. @SuppressWarnings("deprecation")
  2. public class HttpServiceServlet extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4. private HttpServicePlugin plugin;
  5. private RoutingTable routingTable;
  6. private SendMessageUtil sendMessageUtil;
  7. private SendMessageUtil messageUtil ;
  8. private static XmlPullParserFactory factory = null;
  9. private ThreadPool threadPool;
  10. static {
  11. try {
  12. factory = XmlPullParserFactory.newInstance(MXParser.class.getName(), null);
  13. factory.setNamespaceAware(true);
  14. }
  15. catch (XmlPullParserException e) {
  16. Log.error("Error creating a parser factory", e);
  17. }
  18. }
  19. @Override
  20. public void init(ServletConfig servletConfig) throws ServletException {
  21. super.init(servletConfig);
  22. plugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
  23. AuthCheckFilter.addExclude("httpedu/httpservice");
  24. if (null == routingTable)
  25. routingTable = XMPPServer.getInstance().getRoutingTable();
  26. if (null == sendMessageUtil)
  27. sendMessageUtil = new SendMessageUtil();
  28. if (null == threadPool)
  29. threadPool = new ThreadPool(10);
  30. }
  31. @SuppressWarnings("unused")
  32. @Override
  33. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  34. throws ServletException, IOException
  35. {
  36. PrintWriter out = response.getWriter();
  37. BufferedReader reader = request.getReader();
  38. StringBuffer buffer = new StringBuffer();
  39. String string="";
  40. while ((string = reader.readLine()) != null) {
  41. String x = new String(string.getBytes("ISO-8859-1"), "UTF-8");
  42. buffer.append(x);
  43. }
  44. reader.close();
  45. // Check that our plugin is enabled.
  46. if (!plugin.isEnabled()) {
  47. Log.warn("http service plugin is disabled: " + request.getQueryString());
  48. replyError("Error1002",response, out);
  49. return;
  50. }
  51. // Check the request type and process accordingly
  52. try {
  53. JSONObject object = new org.json.JSONObject(buffer.toString());
  54. if(null == object){
  55. Log.warn("json is null " + request.getQueryString());
  56. replyError("Error1003",response, out);
  57. return;
  58. }
  59. //参数
  60. String secret = object.getString("secret").trim();
  61. String optType = object.getString("optType").trim();
  62. String fromid = object.getString("sender").trim();
  63. String domain = object.getString("domain").trim();
  64. String resources = object.getString("resources").trim();
  65. ......
  66. String schoolid = object.getString("schoolid").trim();
  67. // Check this request is authorised
  68. if (secret == null || !secret.equals(plugin.getSecret())){
  69. Log.warn("secret is error: " + request.getQueryString());
  70. replyError("Error1004",response, out);
  71. return;
  72. }
  73. ......
  74. if (null == messageUtil)
  75. messageUtil = new SendMessageUtil();
  76. if ("1".equals(optType)){
  77. //Personal business to send separately
  78. if(toIds == null || "".equals(toIds)){
  79. Log.warn("toIds is error: " + request.getQueryString());
  80. replyError("Error1020",response, out);
  81. return;
  82. }
  83. try {
  84. threadPool.execute(createTask(object,routingTable));
  85. replyMessage("ok", response, out);
  86. } catch (Exception e) {
  87. Log.warn("toIds is error: " + request.getQueryString());
  88. }
  89. }
  90. else {
  91. Log.warn("opttype is error: " + request.getQueryString());
  92. replyError("Error1021",response, out);
  93. }
  94. }
  95. catch (IllegalArgumentException e) {
  96. Log.error("IllegalArgumentException: ", e);
  97. replyError("Ex1002",response, out);
  98. }
  99. catch (Exception e) {
  100. Log.error("Exception: ", e);
  101. replyError("Ex1001",response, out);
  102. }
  103. }
  104. @SuppressWarnings("unused")
  105. private void replyMessage(String message,HttpServletResponse response, PrintWriter out){
  106. response.setContentType("text/xml");
  107. out.println("<result>" + message + "</result>");
  108. out.flush();
  109. }
  110. private void replyError(String error,HttpServletResponse response, PrintWriter out){
  111. response.setContentType("text/xml");
  112. out.println("<error>" + error + "</error>");
  113. out.flush();
  114. }
  115. @Override
  116. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  117. throws ServletException, IOException {
  118. doGet(request, response);
  119. }
  120. @Override
  121. public void destroy() {
  122. threadPool.waitFinish();
  123. threadPool.closePool();
  124. super.destroy();
  125. // Release the excluded URL
  126. AuthCheckFilter.removeExclude("httpedu/httpservice");
  127. }
  128. private static Runnable createTask(final JSONObject object,final RoutingTable routingTable) {
  129. return new Runnable() {
  130. public void run() {
  131. SendMessageUtil messageUtil = new SendMessageUtil();
  132. try {
  133. messageUtil.sendSingleMessage(object,routingTable);
  134. } catch (JSONException e) {
  135. e.printStackTrace();
  136. }
  137. }
  138. };
  139. }
  140. }

HttpServicePlugin:

  1. /**
  2. * Plugin that allows the administration of https via HTTP requests.
  3. *
  4. * @author huwf
  5. */
  6. public class HttpServicePlugin implements Plugin, PropertyEventListener {
  7. private XMPPServer server;
  8. private String secret;
  9. private boolean enabled;
  10. private String smsAddrs;
  11. private SendThread sendThread;
  12. public void initializePlugin(PluginManager manager, File pluginDirectory) {
  13. server = XMPPServer.getInstance();
  14. secret = JiveGlobals.getProperty("plugin.httpservice.secret", "");
  15. // If no secret key has been assigned to the http service yet, assign a random one.
  16. if (secret.equals("")){
  17. secret = StringUtils.randomString(8);
  18. setSecret(secret);
  19. }
  20. // See if the service is enabled or not.
  21. enabled = JiveGlobals.getBooleanProperty("plugin.httpservice.enabled", false);
  22. // Get the list of IP addresses that can use this service. An empty list means that this filter is disabled.
  23. smsAddrs = JiveGlobals.getProperty("plugin.httpservice.smsAddrs", "");
  24. // Listen to system property events
  25. PropertyEventDispatcher.addListener(this);
  26. if (null == sendThread)
  27. sendThread = new SendThread();
  28. }
  29. public void destroyPlugin() {
  30. // Stop listening to system property events
  31. PropertyEventDispatcher.removeListener(this);
  32. }
  33. /**
  34. * Returns the secret key that only valid requests should know.
  35. *
  36. * @return the secret key.
  37. */
  38. public String getSecret() {
  39. return secret;
  40. }
  41. /**
  42. * Sets the secret key that grants permission to use the httpservice.
  43. *
  44. * @param secret the secret key.
  45. */
  46. public void setSecret(String secret) {
  47. JiveGlobals.setProperty("plugin.httpservice.secret", secret);
  48. this.secret = secret;
  49. }
  50. public String getSmsAddrs() {
  51. return smsAddrs;
  52. }
  53. public void setSmsAddrs(String smsAddrs) {
  54. JiveGlobals.setProperty("plugin.httpservice.smsAddrs", smsAddrs);
  55. this.smsAddrs = smsAddrs;
  56. }
  57. /**
  58. * Returns true if the http service is enabled. If not enabled, it will not accept
  59. * requests to create new accounts.
  60. *
  61. * @return true if the http service is enabled.
  62. */
  63. public boolean isEnabled() {
  64. return enabled;
  65. }
  66. /**
  67. * Enables or disables the http service. If not enabled, it will not accept
  68. * requests to create new accounts.
  69. *
  70. * @param enabled true if the http service should be enabled.
  71. */
  72. public void setEnabled(boolean enabled) {
  73. this.enabled = enabled;
  74. JiveGlobals.setProperty("plugin.httpservice.enabled",  enabled ? "true" : "false");
  75. }
  76. public void propertySet(String property, Map<String, Object> params) {
  77. if (property.equals("plugin.httpservice.secret")) {
  78. this.secret = (String)params.get("value");
  79. }
  80. else if (property.equals("plugin.httpservice.enabled")) {
  81. this.enabled = Boolean.parseBoolean((String)params.get("value"));
  82. }
  83. else if (property.equals("plugin.httpservice.smsAddrs")) {
  84. this.smsAddrs = (String)params.get("smsAddrs");
  85. }
  86. }
  87. public void propertyDeleted(String property, Map<String, Object> params) {
  88. if (property.equals("plugin.httpservice.secret")) {
  89. this.secret = "";
  90. }
  91. else if (property.equals("plugin.httpservice.enabled")) {
  92. this.enabled = false;
  93. }
  94. else if (property.equals("plugin.httpservice.smsAddrs")) {
  95. this.smsAddrs = "";
  96. }
  97. }
  98. public void xmlPropertySet(String property, Map<String, Object> params) {
  99. // Do nothing
  100. }
  101. public void xmlPropertyDeleted(String property, Map<String, Object> params) {
  102. // Do nothing
  103. }
  104. }

SendThread:

  1. public class SendThread {
  2. ......
  3. static{
  4. ssu = new SendSmsUtil();
  5. httpServicePlugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
  6. client = new HttpClient();
  7. initialize(client);
  8. executor = new ThreadPoolExecutor(1, 3, 3*1000, TimeUnit.MILLISECONDS, executeQueue, new RejectedHandler());
  9. }
  10. private static void initialize(HttpClient client){
  11. MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
  12. HttpConnectionManagerParams connectionParams = connectionManager.getParams();
  13. connectionParams.setConnectionTimeout(2000);
  14. connectionParams.setDefaultMaxConnectionsPerHost(500);
  15. connectionParams.setMaxTotalConnections(500);
  16. client.setHttpConnectionManager(connectionManager);
  17. HttpClientParams httpParams = client.getParams();
  18. httpParams.setParameter(HttpMethodParams.RETRY_HANDLER, new HttpMethodRetryHandler() {
  19. @Override
  20. public boolean retryMethod(HttpMethod method, IOException exception, int executionCount) {
  21. if(method == null){
  22. return false;
  23. }
  24. if(executionCount > MAX_RETRY_COUNT){
  25. return false;
  26. }
  27. if(!method.isRequestSent()){
  28. return true;
  29. }
  30. if(exception instanceof NoHttpResponseException){
  31. return true;
  32. }
  33. return false;
  34. }
  35. });
  36. }
  37. public static boolean push(SmsEnity msg){
  38. return push(msg, false);
  39. }
  40. public static boolean push(final SmsEnity msg, boolean reliable){
  41. PostMethod postMethod = null;
  42. try {
  43. String urlAddrs = httpServicePlugin.getSmsAddrs();
  44. postMethod = createPostMethod(msg, urlAddrs);
  45. client.executeMethod(postMethod);
  46. int statusCode = postMethod.getStatusCode();
  47. if(statusCode == HttpStatus.SC_OK){
  48. String retMsg = new String(postMethod.getResponseBody());
  49. retMsg = URLDecoder.decode(retMsg, "UTF-8");
  50. if("".equals(retMsg) || null == retMsg){
  51. LOG.info("sms send success! sendid: " + msg.getSendid() + " Receiveid: " + msg.getReceiveid() + " Content: " + msg.getContent());
  52. }else{
  53. throw new PushException(retMsg);
  54. }
  55. return true;
  56. }else if(statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR){
  57. throw new PushException("Push server internal error: " + HttpStatus.SC_INTERNAL_SERVER_ERROR);
  58. }
  59. }catch (IOException e1) {
  60. if(reliable){
  61. try {
  62. failQueue.put(new Runnable() {
  63. public void run() {
  64. push(msg,true);
  65. }
  66. });
  67. LOG.info(Thread.currentThread().getName()+": in the queue...");
  68. if(!start){
  69. startup();
  70. }
  71. } catch (InterruptedException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. }catch(PushException e2){
  76. LOG.info("The sms Push failure and throws PushException" + e2.getMessage() + "\n"
  77. + "sms content-> Sendid:" +  msg.getSendid() + " Receiveid: " + msg.getReceiveid() +
  78. " Content: " + msg.getContent() + " Sendtype:" + msg.getSendtype());
  79. }catch(Exception e3){
  80. LOG.info("The sms Push failure and throws PushException" + e3.getMessage() + "\n"
  81. + "sms content-> Sendid:" +  msg.getSendid() + " Receiveid: " + msg.getReceiveid() +
  82. " Content: " + msg.getContent() + " Sendtype:" + msg.getSendtype());
  83. }finally{
  84. postMethod.releaseConnection();
  85. }
  86. return false;
  87. }
  88. private static PostMethod createPostMethod(SmsEnity se, String uri) throws Exception{
  89. PostMethod postMethod = null;
  90. postMethod = new PostMethod(uri);
  91. if (null != se.getSendid() && !"".equals(se.getSendid()))
  92. postMethod.addParameter(new NameValuePair("sendid", se.getSendid()));
  93. if (null != se.getToken() && !"".equals(se.getSendid()))
  94. postMethod.addParameter(new NameValuePair("token", se.getToken()));
  95. postMethod.addParameter(new NameValuePair("sendtype", se.getSendtype() != null ? se.getSendtype() : ""));
  96. if (null != se.getReceiveid() && !"".equals(se.getReceiveid()))
  97. postMethod.addParameter(new NameValuePair("receiveid", se.getReceiveid()));
  98. if (null != se.getClassid() && !"".equals(se.getClassid()))
  99. postMethod.addParameter(new NameValuePair("classid", se.getClassid()));
  100. postMethod.addParameter(new NameValuePair("schoolid", se.getSchoolid() != null ? se.getSchoolid() : ""));
  101. if (null != se.getGroupid() && !"".equals(se.getGroupid()))
  102. postMethod.addParameter(new NameValuePair("groupid", se.getGroupid()));
  103. if (null != se.getSerial_num() && !"".equals(se.getSerial_num()))
  104. postMethod.addParameter(new NameValuePair("serial_num", se.getSerial_num()));
  105. if (null != se.getContent() && !"".equals(se.getContent()))
  106. postMethod.addParameter(new NameValuePair("content", se.getContent()));
  107. return postMethod;
  108. }
  109. /**
  110. * Start a background thread
  111. */
  112. private synchronized static void startup(){
  113. LOG.info(Thread.currentThread().getName()+" : Start a background thread...");
  114. if(!start){
  115. start = true;
  116. worker = new Thread(){
  117. @Override
  118. public void run() {
  119. workStart(this);
  120. }
  121. };
  122. worker.setName("worker thread");
  123. worker.start();
  124. }
  125. }
  126. /**
  127. * Submit to perform tasks
  128. * @param thread
  129. */
  130. private static void workStart(Thread thread){
  131. while(start && worker == thread){
  132. Runnable task = failQueue.poll();
  133. LOG.info(Thread.currentThread().getName()+" : The queue of the communist party of China has a number of tasks: " + failQueue.size());
  134. LOG.info(Thread.currentThread().getName()+" : From the queue"+task==null?"no":""+"Take out the task...");
  135. if(task != null){
  136. executor.execute(task);
  137. }else{
  138. try {
  139. Thread.sleep(5*1000);
  140. } catch (InterruptedException e) {
  141. e.printStackTrace();
  142. }
  143. }
  144. }
  145. }
  146. /**
  147. * Denial of service processing strategy
  148. */
  149. static class RejectedHandler implements RejectedExecutionHandler{
  150. public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
  151. if(!executor.isShutdown()){
  152. if(!executor.isTerminating()){
  153. try {
  154. failQueue.put(task);
  155. } catch (InterruptedException e) {
  156. e.printStackTrace();
  157. }
  158. }
  159. }
  160. }
  161. }
  162. }

ThreadPool:

  1. @SuppressWarnings("rawtypes")
  2. public class ThreadPool extends ThreadGroup {
  3. // thread pool closed
  4. private boolean isClosed = false;
  5. private LinkedList workQueue;
  6. private static int threadPoolID = 1;
  7. /**
  8. * created and started for work thread
  9. *
  10. * @param poolSize
  11. *            the thread size in pool
  12. */
  13. public ThreadPool(int poolSize) {
  14. super(threadPoolID + "");
  15. setDaemon(true);
  16. workQueue = new LinkedList();
  17. for (int i = 0; i < poolSize; i++) {
  18. new WorkThread(i).start();
  19. }
  20. }
  21. /**
  22. * Work queue to add a new task, the worker thread to execute the office
  23. *
  24. * @param task
  25. */
  26. @SuppressWarnings("unchecked")
  27. public synchronized void execute(Runnable task) {
  28. if (isClosed) {
  29. throw new IllegalStateException();
  30. }
  31. if (task != null) {
  32. // Adding a task to the queue
  33. workQueue.add(task);
  34. // Wake one being getTask () method to be the work of the task
  35. // threads
  36. notify();
  37. }
  38. }
  39. /**
  40. * Removed from the work queue a task, the worker thread will call this
  41. * method
  42. *
  43. * @param threadid
  44. * @return
  45. * @throws InterruptedException
  46. */
  47. private synchronized Runnable getTask(int threadid)
  48. throws InterruptedException {
  49. while (workQueue.size() == 0) {
  50. if (isClosed)
  51. return null;
  52. System.out.println("work thread:" + threadid + "wait task...");
  53. // If no work queue task waits for the task
  54. wait();
  55. }
  56. System.out.println("work thread:" + threadid + "start run task");
  57. // Inverse return the first element in the queue, and removed from the
  58. // queue
  59. return (Runnable) workQueue.removeFirst();
  60. }
  61. /**
  62. * close thread pool
  63. */
  64. public synchronized void closePool() {
  65. if (!isClosed) {
  66. // After waiting worker threads
  67. waitFinish();
  68. isClosed = true;
  69. // Empty the work queue and interrupt the thread pool thread for all
  70. // the work,
  71. // this method inherited from class ThreadGroup
  72. workQueue.clear();
  73. interrupt();
  74. }
  75. }
  76. /**
  77. * Waiting for a worker to perform all tasks completed
  78. */
  79. public void waitFinish() {
  80. synchronized (this) {
  81. isClosed = true;
  82. // Wake up all still getTask () method to wait for the task worker
  83. // thread
  84. notifyAll();
  85. }
  86. // Return of active threads in this thread group estimates.
  87. Thread[] threads = new Thread[activeCount()];
  88. // enumerate () method inherited from ThreadGroup class,
  89. // according to the estimated value of active threads in the thread
  90. // group to get
  91. // all currently active worker threads
  92. int count = enumerate(threads);
  93. for (int i = 0; i < count; i++) {
  94. try {
  95. threads[i].join();
  96. } catch (InterruptedException ex) {
  97. ex.printStackTrace();
  98. }
  99. }
  100. }
  101. /**
  102. * Inner classes, the worker thread is responsible for removing the task
  103. * from the work queue and executes
  104. *
  105. * @author huwf
  106. *
  107. */
  108. private class WorkThread extends Thread {
  109. private int id;
  110. public WorkThread(int id) {
  111. // Parent class constructor, the thread is added to the current
  112. // ThreadPool thread group
  113. super(ThreadPool.this, id + "");
  114. this.id = id;
  115. }
  116. public void run() {
  117. // isInterrupted () method inherited from the Thread class,
  118. // to determine whether the thread is interrupted
  119. while (!isInterrupted()) {
  120. Runnable task = null;
  121. try {
  122. task = getTask(id);
  123. } catch (InterruptedException ex) {
  124. ex.printStackTrace();
  125. }
  126. // If getTask () returns null or thread getTask () is
  127. // interrupted, then the end of this thread
  128. if (task == null)
  129. return;
  130. try {
  131. // run task;
  132. task.run();
  133. } catch (Throwable t) {
  134. t.printStackTrace();
  135. }
  136. }
  137. }
  138. }
  139. }

SendMessageUtil:

  1. public class SendMessageUtil {
  2. private static Map<Integer, XMPPPacketReader> parsers = new ConcurrentHashMap<Integer, XMPPPacketReader>();
  3. private static XmlPullParserFactory factory = null;
  4. private static final Logger log = LoggerFactory
  5. .getLogger(SendMessageUtil.class);
  6. /**
  7. * Send a single message interface
  8. * @throws JSONException
  9. */
  10. public String sendSingleMessage(JSONObject ae,RoutingTable routingTable) throws JSONException {
  11. String state = "failure";
  12. SmsEnity se = new SmsEnity();
  13. String fromid = ae.getString("sender");
  14. String domain = ae.getString("domain");
  15. String resources = ae.getString("resources");
  16. String toId = ae.getString("toIds");
  17. String msgType = ae.getString("msgType");
  18. String msgNo = ae.getString("msgNo");
  19. String smsType = ae.getString("smsType");
  20. //RoutingTable routingTable = ae.getRoutingTable();
  21. String token = "";//暂时为空
  22. String smsBody = ae.getString("smsBody");
  23. String schoolid = ae.getString("schoolid");
  24. //0指定用户发送,1给学生发送,2全班发送,3,多个班级发送 6.发给学生家长你那发给老师是0
  25. String rectype = ae.getString("rectype");
  26. String classid = "";
  27. if ("10014".equals(msgType)){
  28. classid = ae.getString("classId");
  29. }
  30. String sender = fromid + "@" + domain + "/" + resources;
  31. StringBuffer sb = new StringBuffer();
  32. if (toId.length() > 0) {
  33. String tos[] = toId.split(",");
  34. for (int i = 0; i < tos.length; i++) {
  35. String to = tos[i] + "@" + domain;
  36. Message packet;
  37. if (!sender.contains(to) && !sender.equals(to)) {
  38. packet = assemblyMessages(to, sender, "1", msgType, msgNo,
  39. null, null, null,classid);
  40. if ("2".equals(smsType))
  41. sb.append(tos[i] + ",");
  42. PacketRouter router = XMPPServer.getInstance().getPacketRouter();
  43. router.route(packet);
  44. log.info("send: " + packet);
  45. state = "ok";
  46. if ("1".equals(smsType)){
  47. if (null == routingTable.getClientRoute(new JID(to + "/" + resources)))
  48. sb.append(tos[i] + ",");
  49. }
  50. }
  51. }
  52. String receiveids = sb.toString();
  53. // Send SMS
  54. if (!"".equals(smsType) && receiveids.length() > 0 && null != rectype) {
  55. se.setSendid(fromid);
  56. se.setToken(token);
  57. if (",".equals(sb.substring(sb.length() - 1)))
  58. receiveids = receiveids.substring(0,receiveids.length() - 1);
  59. se.setSendtype(rectype);
  60. se.setReceiveid(receiveids);
  61. String body;
  62. try {
  63. body = java.net.URLEncoder.encode(smsBody, "UTF-8");
  64. se.setContent(body);
  65. } catch (UnsupportedEncodingException e) {
  66. log.error("send sms UnsupportedEncodingException:"+e.getMessage());
  67. }
  68. se.setSchoolid(schoolid);
  69. se.setGroupid("");
  70. se.setClassid("");
  71. se.setSerial_num(String.valueOf(System.currentTimeMillis()));
  72. SendThread.push(se);
  73. }
  74. }
  75. return state;
  76. }
  77. public  boolean isDigit(String sender, String to){
  78. return to.contains(sender) ;
  79. }
  80. /**
  81. * Send group business messages
  82. */
  83. public String sendGroupMessage(AdditionalEntities ae) {
  84. //短信发送
  85. }
  86. /**
  87. * The message format assembled
  88. */
  89. public Message assemblyMessages(String to...) {
  90. //封装消息
  91. return packet;
  92. }
  93. }

Web部分

web-custom.xml

  1. <?xml version='1.0' encoding='ISO-8859-1'?>
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  3. <web-app>
  4. <!-- Servlets -->
  5. <servlet>
  6. <servlet-name>HttpServiceServlet</servlet-name>
  7. <servlet-class>com.....httpedu.httpservlet.HttpServiceServlet</servlet-class>
  8. </servlet>
  9. <!-- Servlet mappings -->
  10. <servlet-mapping>
  11. <servlet-name>HttpServiceServlet</servlet-name>
  12. <url-pattern>/httpservice</url-pattern>
  13. </servlet-mapping>
  14. </web-app>

http-service.jsp

  1. <%@ page import="java.util.*,
  2. org.jivesoftware.openfire.XMPPServer,
  3. org.jivesoftware.util.*,
  4. com.montnets.httpedu.plugin.HttpServicePlugin"
  5. errorPage="error.jsp"
  6. %>
  7. <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
  8. <%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
  9. <%-- Define Administration Bean --%>
  10. <jsp:useBean id="admin" class="org.jivesoftware.util.WebManager"  />
  11. <c:set var="admin" value="${admin.manager}" />
  12. <% admin.init(request, response, session, application, out ); %>
  13. <%  // Get parameters
  14. boolean save = request.getParameter("save") != null;
  15. boolean success = request.getParameter("success") != null;
  16. String secret = ParamUtils.getParameter(request, "secret");
  17. boolean enabled = ParamUtils.getBooleanParameter(request, "enabled");
  18. String smsAddrs = ParamUtils.getParameter(request, "smsAddrs");
  19. //注意:这里getPlugin("httpedu")里面的参数是插件的目录名称
  20. HttpServicePlugin plugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
  21. // Handle a save
  22. Map errors = new HashMap();
  23. if (save) {
  24. if (errors.size() == 0) {
  25. plugin.setEnabled(enabled);
  26. plugin.setSecret(secret);
  27. plugin.setSmsAddrs(smsAddrs);
  28. response.sendRedirect("http-service.jsp?success=true");
  29. return;
  30. }
  31. }
  32. secret = plugin.getSecret();
  33. enabled = plugin.isEnabled();
  34. smsAddrs = plugin.getSmsAddrs();
  35. %>
  36. <html>
  37. <head>
  38. <title>HTTP Service Properties</title>
  39. <meta name="pageID" content="http-service"/>
  40. </head>
  41. <body>
  42. <p>
  43. This is an HTTP service plug-in
  44. it is mainly to complete business push message center system and off-line message interface implementation
  45. </p>
  46. <%  if (success) { %>
  47. <div class="jive-success">
  48. <table cellpadding="0" cellspacing="0" border="0">
  49. <tbody>
  50. <tr><td class="jive-icon"><img src="data:images/success-16x16.gif" width="16" height="16" border="0"></td>
  51. <td class="jive-icon-label">
  52. HTTP service properties edited successfully.
  53. </td></tr>
  54. </tbody>
  55. </table>
  56. </div><br>
  57. <% } %>
  58. <form action="http-service.jsp?save" method="post">
  59. <fieldset>
  60. <legend>HTTP Service</legend>
  61. <div>
  62. <p>
  63. This main set message center call switch, text messaging and SMS address configuration
  64. </p>
  65. <ul>
  66. <input type="radio" name="enabled" value="true" id="hrb01"
  67. <%= ((enabled) ? "checked" : "") %>>
  68. <label for="hrb01"><b>Enabled</b> - HTTP service requests will be processed.</label>
  69. <br>
  70. <input type="radio" name="enabled" value="false" id="hrb02"
  71. <%= ((!enabled) ? "checked" : "") %>>
  72. <label for="hrb02"><b>Disabled</b> - HTTP service requests will be ignored.</label>
  73. <br><br>
  74. <label for="h_text_secret">Secret key:</label>
  75. <input type="text" name="secret" value="<%= secret %>" id="h_text_secret">
  76. <br><br>
  77. <label for="h_smsAddrs">SMS address:</label>
  78. <input type="text" id="h_smsAddrs" name="smsAddrs" size="80" value="<%= smsAddrs == null ? "" : smsAddrs %>"/>
  79. </ul>
  80. </div>
  81. </fieldset>
  82. <br><br>
  83. <input type="submit" value="Save Settings">
  84. </form>
  85. </body>
  86. </html>

Plugin.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <plugin>
  3. <class>com.montnets.httpedu.plugin.HttpServicePlugin</class>
  4. <name>Http Service</name>
  5. <description>The message center services and A short letter to push</description>
  6. <author>HuWenFeng</author>
  7. <version>1.4.2</version>
  8. <date>10/7/2013</date>
  9. <minServerVersion>3.5.1</minServerVersion>
  10. <adminconsole>
  11. <tab id="tab-server">
  12. <sidebar id="sidebar-server-settings">
  13. <item id="http-service" name="Http Service" url="http-service.jsp"
  14. description="The message center services and A short letter to push" />
  15. </sidebar>
  16. </tab>
  17. </adminconsole>
  18. </plugin>

测试

TestHttpedu:

  1. public class TestHttpedu {
  2. public static void main(String[] args) throws JSONException, InterruptedException {
  3. String datetime = (new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS")).format(new Date());
  4. System.out.println(datetime);
  5. int a = 0;
  6. for (int i=0;i<1;i++){
  7. MyThread my = new MyThread(a++);
  8. my.start();
  9. my.sleep(100);
  10. }
  11. }
  12. }

MyThread:

  1. public class MyThread extends Thread{
  2. private int i;
  3. public MyThread(int i){
  4. this.i=i;
  5. }
  6. public void run(){
  7. httpedu();
  8. }
  9. public void httpedu(){
  10. JSONObject jb = new JSONObject();
  11. try {
  12. jb.put("secret", "montnets@123");//montnets@123
  13. jb.put("optType", "1");
  14. //你需要发送的参数
  15. try {
  16. testPost(jb);
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. } catch (JSONException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. public void testPost(JSONObject json) throws IOException, JSONException {
  25. URL url = new URL("http://127.0.0.1:9090/plugins/httpedu/httpservice");
  26. URLConnection connection = url.openConnection();
  27. connection.setDoOutput(true);
  28. OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
  29. String j = json.toString();
  30. out.write(j);
  31. out.flush();
  32. out.close();
  33. //返回
  34. String sCurrentLine;
  35. String sTotalString;
  36. sCurrentLine = "";
  37. sTotalString = "";
  38. InputStream l_urlStream;
  39. l_urlStream = connection.getInputStream();
  40. BufferedReader l_reader = new BufferedReader(new InputStreamReader(l_urlStream));
  41. while ((sCurrentLine = l_reader.readLine()) != null) {
  42. sTotalString += sCurrentLine;
  43. }
  44. System.out.println("返回第 " +i + " 结果:" + sTotalString);
  45. if(sTotalString.indexOf("ok")==-1){
  46. System.out.println(sTotalString+" : " + json.toString());
  47. }
  48. }

(转)OpenFire源码学习之十七:HTTP Service插件的更多相关文章

  1. (转)OpenFire源码学习之十四:插件管理

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43418433 Plugin管理 Openfire把插件模块加入到容器分为以下步骤: l  ...

  2. Qt Creator 源码学习笔记04,多插件实现原理分析

    阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...

  3. (转)OpenFire源码学习之二十七:Smack源码解析

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...

  4. (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...

  5. (转)OpenFire源码学习之十八:IOS离线推送

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...

  6. (转)OpenFire源码学习之十:连接管理(上)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...

  7. (转)OpenFire源码学习之六:用户注册

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...

  8. (转)OpenFire源码学习之四:openfire的启动流程

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...

  9. (转)即时通讯IM OpenFire源码学习之三:在Eclipse中构建源码

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43412617 源码搭建 下载地址: 地址:http://www.igniterealti ...

随机推荐

  1. 说下vue工程中代理配置proxy

    这个代理配置不需要后台进行ngnix代理跳转了,前端可以做.在vue.config.js文件中进行配置,如下: module.exports = { publicPath: process.env.V ...

  2. CSS入门之盒模型(六分之四)

    盒模型要点知识 务必注意看,这可是前端面试 必定会遇到 的问题. box-sizing 盒模型的主要CSS属性,除继承外有两个值: content-box 这里不再细说历史原因,只说其作用. cont ...

  3. ylbtech-公司-滴滴出行:滴滴出行

    ylbtech-公司-滴滴出行:滴滴出行 滴滴出行是涵盖出租车. 专车.  滴滴快车.  顺风车. 代驾及 大巴等多项业务在内的一站式出行平台,2015年9月9日由“滴滴打车”更名而来. 2月1日起, ...

  4. Python机器学习及分析工具:Scikit-learn篇

    https://www.jianshu.com/p/e0844e7cdba5 https://sklearn.apachecn.org/docs/0.21.3/62.html 中文文档

  5. Mysql create constraint foreign key faild.trouble shooting method share

    mysql> create table tb_test (id int(10) not null auto_increment primary key,action_id int(10) not ...

  6. CookieUtil.java

    package util; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.n ...

  7. MySQL全面优化,速度飞起来!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 在进行MySQL的优 ...

  8. Pytest conftest共享数据及不同层次共享

    数据共享:在 conftest.py配置里写方 法可以实现数据共享, 不需要import导入.可 以跨文件共享 1.建立一个新的文件,文件名必须叫"conftest.py",然后写 ...

  9. ArcGis 创建含孔洞面要素AO C#

    IGeometryCollection geometryCollection = new PolygonClass(); IPointCollection pointCollection_Exteri ...

  10. WPF非UI线程访问网络资源造成页面假死现象

    公司内部一个项目是用WPF作为GUI 访问web接口的形式获取数据, 但是由于数据量比较大,也没做分页,于是就需要一个loading的控件,网上查了很多资料但都比较浅.这里完成需求后,总结一下. 首先 ...