(转)OpenFire源码学习之十七:HTTP Service插件
转:http://blog.csdn.net/huwenfeng_2011/article/details/43457645
HTTP Service插件
这里的http接口插件是神马?
Openfire主要是在消息推送,那么与其他系统的的消息怎么结合呢,那么这里这个HTTP Service插件就提供了一个基于HTTP的接口。为什么要提供这样的接口?在有些互联网的场景。一个用户平台可以是web的,当然也会有移动终端的APP,那么web端要给移动终端的APP发送消息就依赖这样的接口了。当然这里只是一种实现方式。
首先查看在OF控制太的web页面
本人这里做新增了短信接口。有业务场景的不同这里就不提出来了。
接下来看看插件目录包:
下面编写一个个业务类:
JAVA部分
HttpServiceServlet:
- @SuppressWarnings("deprecation")
- public class HttpServiceServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private HttpServicePlugin plugin;
- private RoutingTable routingTable;
- private SendMessageUtil sendMessageUtil;
- private SendMessageUtil messageUtil ;
- private static XmlPullParserFactory factory = null;
- private ThreadPool threadPool;
- static {
- try {
- factory = XmlPullParserFactory.newInstance(MXParser.class.getName(), null);
- factory.setNamespaceAware(true);
- }
- catch (XmlPullParserException e) {
- Log.error("Error creating a parser factory", e);
- }
- }
- @Override
- public void init(ServletConfig servletConfig) throws ServletException {
- super.init(servletConfig);
- plugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
- AuthCheckFilter.addExclude("httpedu/httpservice");
- if (null == routingTable)
- routingTable = XMPPServer.getInstance().getRoutingTable();
- if (null == sendMessageUtil)
- sendMessageUtil = new SendMessageUtil();
- if (null == threadPool)
- threadPool = new ThreadPool(10);
- }
- @SuppressWarnings("unused")
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException
- {
- PrintWriter out = response.getWriter();
- BufferedReader reader = request.getReader();
- StringBuffer buffer = new StringBuffer();
- String string="";
- while ((string = reader.readLine()) != null) {
- String x = new String(string.getBytes("ISO-8859-1"), "UTF-8");
- buffer.append(x);
- }
- reader.close();
- // Check that our plugin is enabled.
- if (!plugin.isEnabled()) {
- Log.warn("http service plugin is disabled: " + request.getQueryString());
- replyError("Error1002",response, out);
- return;
- }
- // Check the request type and process accordingly
- try {
- JSONObject object = new org.json.JSONObject(buffer.toString());
- if(null == object){
- Log.warn("json is null " + request.getQueryString());
- replyError("Error1003",response, out);
- return;
- }
- //参数
- String secret = object.getString("secret").trim();
- String optType = object.getString("optType").trim();
- String fromid = object.getString("sender").trim();
- String domain = object.getString("domain").trim();
- String resources = object.getString("resources").trim();
- ......
- String schoolid = object.getString("schoolid").trim();
- // Check this request is authorised
- if (secret == null || !secret.equals(plugin.getSecret())){
- Log.warn("secret is error: " + request.getQueryString());
- replyError("Error1004",response, out);
- return;
- }
- ......
- if (null == messageUtil)
- messageUtil = new SendMessageUtil();
- if ("1".equals(optType)){
- //Personal business to send separately
- if(toIds == null || "".equals(toIds)){
- Log.warn("toIds is error: " + request.getQueryString());
- replyError("Error1020",response, out);
- return;
- }
- try {
- threadPool.execute(createTask(object,routingTable));
- replyMessage("ok", response, out);
- } catch (Exception e) {
- Log.warn("toIds is error: " + request.getQueryString());
- }
- }
- else {
- Log.warn("opttype is error: " + request.getQueryString());
- replyError("Error1021",response, out);
- }
- }
- catch (IllegalArgumentException e) {
- Log.error("IllegalArgumentException: ", e);
- replyError("Ex1002",response, out);
- }
- catch (Exception e) {
- Log.error("Exception: ", e);
- replyError("Ex1001",response, out);
- }
- }
- @SuppressWarnings("unused")
- private void replyMessage(String message,HttpServletResponse response, PrintWriter out){
- response.setContentType("text/xml");
- out.println("<result>" + message + "</result>");
- out.flush();
- }
- private void replyError(String error,HttpServletResponse response, PrintWriter out){
- response.setContentType("text/xml");
- out.println("<error>" + error + "</error>");
- out.flush();
- }
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- @Override
- public void destroy() {
- threadPool.waitFinish();
- threadPool.closePool();
- super.destroy();
- // Release the excluded URL
- AuthCheckFilter.removeExclude("httpedu/httpservice");
- }
- private static Runnable createTask(final JSONObject object,final RoutingTable routingTable) {
- return new Runnable() {
- public void run() {
- SendMessageUtil messageUtil = new SendMessageUtil();
- try {
- messageUtil.sendSingleMessage(object,routingTable);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- };
- }
- }
HttpServicePlugin:
- /**
- * Plugin that allows the administration of https via HTTP requests.
- *
- * @author huwf
- */
- public class HttpServicePlugin implements Plugin, PropertyEventListener {
- private XMPPServer server;
- private String secret;
- private boolean enabled;
- private String smsAddrs;
- private SendThread sendThread;
- public void initializePlugin(PluginManager manager, File pluginDirectory) {
- server = XMPPServer.getInstance();
- secret = JiveGlobals.getProperty("plugin.httpservice.secret", "");
- // If no secret key has been assigned to the http service yet, assign a random one.
- if (secret.equals("")){
- secret = StringUtils.randomString(8);
- setSecret(secret);
- }
- // See if the service is enabled or not.
- enabled = JiveGlobals.getBooleanProperty("plugin.httpservice.enabled", false);
- // Get the list of IP addresses that can use this service. An empty list means that this filter is disabled.
- smsAddrs = JiveGlobals.getProperty("plugin.httpservice.smsAddrs", "");
- // Listen to system property events
- PropertyEventDispatcher.addListener(this);
- if (null == sendThread)
- sendThread = new SendThread();
- }
- public void destroyPlugin() {
- // Stop listening to system property events
- PropertyEventDispatcher.removeListener(this);
- }
- /**
- * Returns the secret key that only valid requests should know.
- *
- * @return the secret key.
- */
- public String getSecret() {
- return secret;
- }
- /**
- * Sets the secret key that grants permission to use the httpservice.
- *
- * @param secret the secret key.
- */
- public void setSecret(String secret) {
- JiveGlobals.setProperty("plugin.httpservice.secret", secret);
- this.secret = secret;
- }
- public String getSmsAddrs() {
- return smsAddrs;
- }
- public void setSmsAddrs(String smsAddrs) {
- JiveGlobals.setProperty("plugin.httpservice.smsAddrs", smsAddrs);
- this.smsAddrs = smsAddrs;
- }
- /**
- * Returns true if the http service is enabled. If not enabled, it will not accept
- * requests to create new accounts.
- *
- * @return true if the http service is enabled.
- */
- public boolean isEnabled() {
- return enabled;
- }
- /**
- * Enables or disables the http service. If not enabled, it will not accept
- * requests to create new accounts.
- *
- * @param enabled true if the http service should be enabled.
- */
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- JiveGlobals.setProperty("plugin.httpservice.enabled", enabled ? "true" : "false");
- }
- public void propertySet(String property, Map<String, Object> params) {
- if (property.equals("plugin.httpservice.secret")) {
- this.secret = (String)params.get("value");
- }
- else if (property.equals("plugin.httpservice.enabled")) {
- this.enabled = Boolean.parseBoolean((String)params.get("value"));
- }
- else if (property.equals("plugin.httpservice.smsAddrs")) {
- this.smsAddrs = (String)params.get("smsAddrs");
- }
- }
- public void propertyDeleted(String property, Map<String, Object> params) {
- if (property.equals("plugin.httpservice.secret")) {
- this.secret = "";
- }
- else if (property.equals("plugin.httpservice.enabled")) {
- this.enabled = false;
- }
- else if (property.equals("plugin.httpservice.smsAddrs")) {
- this.smsAddrs = "";
- }
- }
- public void xmlPropertySet(String property, Map<String, Object> params) {
- // Do nothing
- }
- public void xmlPropertyDeleted(String property, Map<String, Object> params) {
- // Do nothing
- }
- }
SendThread:
- public class SendThread {
- ......
- static{
- ssu = new SendSmsUtil();
- httpServicePlugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
- client = new HttpClient();
- initialize(client);
- executor = new ThreadPoolExecutor(1, 3, 3*1000, TimeUnit.MILLISECONDS, executeQueue, new RejectedHandler());
- }
- private static void initialize(HttpClient client){
- MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
- HttpConnectionManagerParams connectionParams = connectionManager.getParams();
- connectionParams.setConnectionTimeout(2000);
- connectionParams.setDefaultMaxConnectionsPerHost(500);
- connectionParams.setMaxTotalConnections(500);
- client.setHttpConnectionManager(connectionManager);
- HttpClientParams httpParams = client.getParams();
- httpParams.setParameter(HttpMethodParams.RETRY_HANDLER, new HttpMethodRetryHandler() {
- @Override
- public boolean retryMethod(HttpMethod method, IOException exception, int executionCount) {
- if(method == null){
- return false;
- }
- if(executionCount > MAX_RETRY_COUNT){
- return false;
- }
- if(!method.isRequestSent()){
- return true;
- }
- if(exception instanceof NoHttpResponseException){
- return true;
- }
- return false;
- }
- });
- }
- public static boolean push(SmsEnity msg){
- return push(msg, false);
- }
- public static boolean push(final SmsEnity msg, boolean reliable){
- PostMethod postMethod = null;
- try {
- String urlAddrs = httpServicePlugin.getSmsAddrs();
- postMethod = createPostMethod(msg, urlAddrs);
- client.executeMethod(postMethod);
- int statusCode = postMethod.getStatusCode();
- if(statusCode == HttpStatus.SC_OK){
- String retMsg = new String(postMethod.getResponseBody());
- retMsg = URLDecoder.decode(retMsg, "UTF-8");
- if("".equals(retMsg) || null == retMsg){
- LOG.info("sms send success! sendid: " + msg.getSendid() + " Receiveid: " + msg.getReceiveid() + " Content: " + msg.getContent());
- }else{
- throw new PushException(retMsg);
- }
- return true;
- }else if(statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR){
- throw new PushException("Push server internal error: " + HttpStatus.SC_INTERNAL_SERVER_ERROR);
- }
- }catch (IOException e1) {
- if(reliable){
- try {
- failQueue.put(new Runnable() {
- public void run() {
- push(msg,true);
- }
- });
- LOG.info(Thread.currentThread().getName()+": in the queue...");
- if(!start){
- startup();
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }catch(PushException e2){
- LOG.info("The sms Push failure and throws PushException" + e2.getMessage() + "\n"
- + "sms content-> Sendid:" + msg.getSendid() + " Receiveid: " + msg.getReceiveid() +
- " Content: " + msg.getContent() + " Sendtype:" + msg.getSendtype());
- }catch(Exception e3){
- LOG.info("The sms Push failure and throws PushException" + e3.getMessage() + "\n"
- + "sms content-> Sendid:" + msg.getSendid() + " Receiveid: " + msg.getReceiveid() +
- " Content: " + msg.getContent() + " Sendtype:" + msg.getSendtype());
- }finally{
- postMethod.releaseConnection();
- }
- return false;
- }
- private static PostMethod createPostMethod(SmsEnity se, String uri) throws Exception{
- PostMethod postMethod = null;
- postMethod = new PostMethod(uri);
- if (null != se.getSendid() && !"".equals(se.getSendid()))
- postMethod.addParameter(new NameValuePair("sendid", se.getSendid()));
- if (null != se.getToken() && !"".equals(se.getSendid()))
- postMethod.addParameter(new NameValuePair("token", se.getToken()));
- postMethod.addParameter(new NameValuePair("sendtype", se.getSendtype() != null ? se.getSendtype() : ""));
- if (null != se.getReceiveid() && !"".equals(se.getReceiveid()))
- postMethod.addParameter(new NameValuePair("receiveid", se.getReceiveid()));
- if (null != se.getClassid() && !"".equals(se.getClassid()))
- postMethod.addParameter(new NameValuePair("classid", se.getClassid()));
- postMethod.addParameter(new NameValuePair("schoolid", se.getSchoolid() != null ? se.getSchoolid() : ""));
- if (null != se.getGroupid() && !"".equals(se.getGroupid()))
- postMethod.addParameter(new NameValuePair("groupid", se.getGroupid()));
- if (null != se.getSerial_num() && !"".equals(se.getSerial_num()))
- postMethod.addParameter(new NameValuePair("serial_num", se.getSerial_num()));
- if (null != se.getContent() && !"".equals(se.getContent()))
- postMethod.addParameter(new NameValuePair("content", se.getContent()));
- return postMethod;
- }
- /**
- * Start a background thread
- */
- private synchronized static void startup(){
- LOG.info(Thread.currentThread().getName()+" : Start a background thread...");
- if(!start){
- start = true;
- worker = new Thread(){
- @Override
- public void run() {
- workStart(this);
- }
- };
- worker.setName("worker thread");
- worker.start();
- }
- }
- /**
- * Submit to perform tasks
- * @param thread
- */
- private static void workStart(Thread thread){
- while(start && worker == thread){
- Runnable task = failQueue.poll();
- LOG.info(Thread.currentThread().getName()+" : The queue of the communist party of China has a number of tasks: " + failQueue.size());
- LOG.info(Thread.currentThread().getName()+" : From the queue"+task==null?"no":""+"Take out the task...");
- if(task != null){
- executor.execute(task);
- }else{
- try {
- Thread.sleep(5*1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * Denial of service processing strategy
- */
- static class RejectedHandler implements RejectedExecutionHandler{
- public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
- if(!executor.isShutdown()){
- if(!executor.isTerminating()){
- try {
- failQueue.put(task);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
ThreadPool:
- @SuppressWarnings("rawtypes")
- public class ThreadPool extends ThreadGroup {
- // thread pool closed
- private boolean isClosed = false;
- private LinkedList workQueue;
- private static int threadPoolID = 1;
- /**
- * created and started for work thread
- *
- * @param poolSize
- * the thread size in pool
- */
- public ThreadPool(int poolSize) {
- super(threadPoolID + "");
- setDaemon(true);
- workQueue = new LinkedList();
- for (int i = 0; i < poolSize; i++) {
- new WorkThread(i).start();
- }
- }
- /**
- * Work queue to add a new task, the worker thread to execute the office
- *
- * @param task
- */
- @SuppressWarnings("unchecked")
- public synchronized void execute(Runnable task) {
- if (isClosed) {
- throw new IllegalStateException();
- }
- if (task != null) {
- // Adding a task to the queue
- workQueue.add(task);
- // Wake one being getTask () method to be the work of the task
- // threads
- notify();
- }
- }
- /**
- * Removed from the work queue a task, the worker thread will call this
- * method
- *
- * @param threadid
- * @return
- * @throws InterruptedException
- */
- private synchronized Runnable getTask(int threadid)
- throws InterruptedException {
- while (workQueue.size() == 0) {
- if (isClosed)
- return null;
- System.out.println("work thread:" + threadid + "wait task...");
- // If no work queue task waits for the task
- wait();
- }
- System.out.println("work thread:" + threadid + "start run task");
- // Inverse return the first element in the queue, and removed from the
- // queue
- return (Runnable) workQueue.removeFirst();
- }
- /**
- * close thread pool
- */
- public synchronized void closePool() {
- if (!isClosed) {
- // After waiting worker threads
- waitFinish();
- isClosed = true;
- // Empty the work queue and interrupt the thread pool thread for all
- // the work,
- // this method inherited from class ThreadGroup
- workQueue.clear();
- interrupt();
- }
- }
- /**
- * Waiting for a worker to perform all tasks completed
- */
- public void waitFinish() {
- synchronized (this) {
- isClosed = true;
- // Wake up all still getTask () method to wait for the task worker
- // thread
- notifyAll();
- }
- // Return of active threads in this thread group estimates.
- Thread[] threads = new Thread[activeCount()];
- // enumerate () method inherited from ThreadGroup class,
- // according to the estimated value of active threads in the thread
- // group to get
- // all currently active worker threads
- int count = enumerate(threads);
- for (int i = 0; i < count; i++) {
- try {
- threads[i].join();
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- }
- }
- }
- /**
- * Inner classes, the worker thread is responsible for removing the task
- * from the work queue and executes
- *
- * @author huwf
- *
- */
- private class WorkThread extends Thread {
- private int id;
- public WorkThread(int id) {
- // Parent class constructor, the thread is added to the current
- // ThreadPool thread group
- super(ThreadPool.this, id + "");
- this.id = id;
- }
- public void run() {
- // isInterrupted () method inherited from the Thread class,
- // to determine whether the thread is interrupted
- while (!isInterrupted()) {
- Runnable task = null;
- try {
- task = getTask(id);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- }
- // If getTask () returns null or thread getTask () is
- // interrupted, then the end of this thread
- if (task == null)
- return;
- try {
- // run task;
- task.run();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
- }
- }
- }
SendMessageUtil:
- public class SendMessageUtil {
- private static Map<Integer, XMPPPacketReader> parsers = new ConcurrentHashMap<Integer, XMPPPacketReader>();
- private static XmlPullParserFactory factory = null;
- private static final Logger log = LoggerFactory
- .getLogger(SendMessageUtil.class);
- /**
- * Send a single message interface
- * @throws JSONException
- */
- public String sendSingleMessage(JSONObject ae,RoutingTable routingTable) throws JSONException {
- String state = "failure";
- SmsEnity se = new SmsEnity();
- String fromid = ae.getString("sender");
- String domain = ae.getString("domain");
- String resources = ae.getString("resources");
- String toId = ae.getString("toIds");
- String msgType = ae.getString("msgType");
- String msgNo = ae.getString("msgNo");
- String smsType = ae.getString("smsType");
- //RoutingTable routingTable = ae.getRoutingTable();
- String token = "";//暂时为空
- String smsBody = ae.getString("smsBody");
- String schoolid = ae.getString("schoolid");
- //0指定用户发送,1给学生发送,2全班发送,3,多个班级发送 6.发给学生家长你那发给老师是0
- String rectype = ae.getString("rectype");
- String classid = "";
- if ("10014".equals(msgType)){
- classid = ae.getString("classId");
- }
- String sender = fromid + "@" + domain + "/" + resources;
- StringBuffer sb = new StringBuffer();
- if (toId.length() > 0) {
- String tos[] = toId.split(",");
- for (int i = 0; i < tos.length; i++) {
- String to = tos[i] + "@" + domain;
- Message packet;
- if (!sender.contains(to) && !sender.equals(to)) {
- packet = assemblyMessages(to, sender, "1", msgType, msgNo,
- null, null, null,classid);
- if ("2".equals(smsType))
- sb.append(tos[i] + ",");
- PacketRouter router = XMPPServer.getInstance().getPacketRouter();
- router.route(packet);
- log.info("send: " + packet);
- state = "ok";
- if ("1".equals(smsType)){
- if (null == routingTable.getClientRoute(new JID(to + "/" + resources)))
- sb.append(tos[i] + ",");
- }
- }
- }
- String receiveids = sb.toString();
- // Send SMS
- if (!"".equals(smsType) && receiveids.length() > 0 && null != rectype) {
- se.setSendid(fromid);
- se.setToken(token);
- if (",".equals(sb.substring(sb.length() - 1)))
- receiveids = receiveids.substring(0,receiveids.length() - 1);
- se.setSendtype(rectype);
- se.setReceiveid(receiveids);
- String body;
- try {
- body = java.net.URLEncoder.encode(smsBody, "UTF-8");
- se.setContent(body);
- } catch (UnsupportedEncodingException e) {
- log.error("send sms UnsupportedEncodingException:"+e.getMessage());
- }
- se.setSchoolid(schoolid);
- se.setGroupid("");
- se.setClassid("");
- se.setSerial_num(String.valueOf(System.currentTimeMillis()));
- SendThread.push(se);
- }
- }
- return state;
- }
- public boolean isDigit(String sender, String to){
- return to.contains(sender) ;
- }
- /**
- * Send group business messages
- */
- public String sendGroupMessage(AdditionalEntities ae) {
- //短信发送
- }
- /**
- * The message format assembled
- */
- public Message assemblyMessages(String to...) {
- //封装消息
- return packet;
- }
- }
Web部分
web-custom.xml
- <?xml version='1.0' encoding='ISO-8859-1'?>
- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
- <web-app>
- <!-- Servlets -->
- <servlet>
- <servlet-name>HttpServiceServlet</servlet-name>
- <servlet-class>com.....httpedu.httpservlet.HttpServiceServlet</servlet-class>
- </servlet>
- <!-- Servlet mappings -->
- <servlet-mapping>
- <servlet-name>HttpServiceServlet</servlet-name>
- <url-pattern>/httpservice</url-pattern>
- </servlet-mapping>
- </web-app>
http-service.jsp
- <%@ page import="java.util.*,
- org.jivesoftware.openfire.XMPPServer,
- org.jivesoftware.util.*,
- com.montnets.httpedu.plugin.HttpServicePlugin"
- errorPage="error.jsp"
- %>
- <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
- <%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
- <%-- Define Administration Bean --%>
- <jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" />
- <c:set var="admin" value="${admin.manager}" />
- <% admin.init(request, response, session, application, out ); %>
- <% // Get parameters
- boolean save = request.getParameter("save") != null;
- boolean success = request.getParameter("success") != null;
- String secret = ParamUtils.getParameter(request, "secret");
- boolean enabled = ParamUtils.getBooleanParameter(request, "enabled");
- String smsAddrs = ParamUtils.getParameter(request, "smsAddrs");
- //注意:这里getPlugin("httpedu")里面的参数是插件的目录名称
- HttpServicePlugin plugin = (HttpServicePlugin) XMPPServer.getInstance().getPluginManager().getPlugin("httpedu");
- // Handle a save
- Map errors = new HashMap();
- if (save) {
- if (errors.size() == 0) {
- plugin.setEnabled(enabled);
- plugin.setSecret(secret);
- plugin.setSmsAddrs(smsAddrs);
- response.sendRedirect("http-service.jsp?success=true");
- return;
- }
- }
- secret = plugin.getSecret();
- enabled = plugin.isEnabled();
- smsAddrs = plugin.getSmsAddrs();
- %>
- <html>
- <head>
- <title>HTTP Service Properties</title>
- <meta name="pageID" content="http-service"/>
- </head>
- <body>
- <p>
- This is an HTTP service plug-in
- it is mainly to complete business push message center system and off-line message interface implementation
- </p>
- <% if (success) { %>
- <div class="jive-success">
- <table cellpadding="0" cellspacing="0" border="0">
- <tbody>
- <tr><td class="jive-icon"><img src="data:images/success-16x16.gif" width="16" height="16" border="0"></td>
- <td class="jive-icon-label">
- HTTP service properties edited successfully.
- </td></tr>
- </tbody>
- </table>
- </div><br>
- <% } %>
- <form action="http-service.jsp?save" method="post">
- <fieldset>
- <legend>HTTP Service</legend>
- <div>
- <p>
- This main set message center call switch, text messaging and SMS address configuration
- </p>
- <ul>
- <input type="radio" name="enabled" value="true" id="hrb01"
- <%= ((enabled) ? "checked" : "") %>>
- <label for="hrb01"><b>Enabled</b> - HTTP service requests will be processed.</label>
- <br>
- <input type="radio" name="enabled" value="false" id="hrb02"
- <%= ((!enabled) ? "checked" : "") %>>
- <label for="hrb02"><b>Disabled</b> - HTTP service requests will be ignored.</label>
- <br><br>
- <label for="h_text_secret">Secret key:</label>
- <input type="text" name="secret" value="<%= secret %>" id="h_text_secret">
- <br><br>
- <label for="h_smsAddrs">SMS address:</label>
- <input type="text" id="h_smsAddrs" name="smsAddrs" size="80" value="<%= smsAddrs == null ? "" : smsAddrs %>"/>
- </ul>
- </div>
- </fieldset>
- <br><br>
- <input type="submit" value="Save Settings">
- </form>
- </body>
- </html>
Plugin.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <plugin>
- <class>com.montnets.httpedu.plugin.HttpServicePlugin</class>
- <name>Http Service</name>
- <description>The message center services and A short letter to push</description>
- <author>HuWenFeng</author>
- <version>1.4.2</version>
- <date>10/7/2013</date>
- <minServerVersion>3.5.1</minServerVersion>
- <adminconsole>
- <tab id="tab-server">
- <sidebar id="sidebar-server-settings">
- <item id="http-service" name="Http Service" url="http-service.jsp"
- description="The message center services and A short letter to push" />
- </sidebar>
- </tab>
- </adminconsole>
- </plugin>
测试
TestHttpedu:
- public class TestHttpedu {
- public static void main(String[] args) throws JSONException, InterruptedException {
- String datetime = (new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS")).format(new Date());
- System.out.println(datetime);
- int a = 0;
- for (int i=0;i<1;i++){
- MyThread my = new MyThread(a++);
- my.start();
- my.sleep(100);
- }
- }
- }
MyThread:
- public class MyThread extends Thread{
- private int i;
- public MyThread(int i){
- this.i=i;
- }
- public void run(){
- httpedu();
- }
- public void httpedu(){
- JSONObject jb = new JSONObject();
- try {
- jb.put("secret", "montnets@123");//montnets@123
- jb.put("optType", "1");
- //你需要发送的参数
- try {
- testPost(jb);
- } catch (IOException e) {
- e.printStackTrace();
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- public void testPost(JSONObject json) throws IOException, JSONException {
- URL url = new URL("http://127.0.0.1:9090/plugins/httpedu/httpservice");
- URLConnection connection = url.openConnection();
- connection.setDoOutput(true);
- OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
- String j = json.toString();
- out.write(j);
- out.flush();
- out.close();
- //返回
- String sCurrentLine;
- String sTotalString;
- sCurrentLine = "";
- sTotalString = "";
- InputStream l_urlStream;
- l_urlStream = connection.getInputStream();
- BufferedReader l_reader = new BufferedReader(new InputStreamReader(l_urlStream));
- while ((sCurrentLine = l_reader.readLine()) != null) {
- sTotalString += sCurrentLine;
- }
- System.out.println("返回第 " +i + " 结果:" + sTotalString);
- if(sTotalString.indexOf("ok")==-1){
- System.out.println(sTotalString+" : " + json.toString());
- }
- }
(转)OpenFire源码学习之十七:HTTP Service插件的更多相关文章
- (转)OpenFire源码学习之十四:插件管理
转:http://blog.csdn.net/huwenfeng_2011/article/details/43418433 Plugin管理 Openfire把插件模块加入到容器分为以下步骤: l ...
- Qt Creator 源码学习笔记04,多插件实现原理分析
阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...
- (转)OpenFire源码学习之二十七:Smack源码解析
转:http://blog.csdn.net/huwenfeng_2011/article/details/43484199 Smack Smack是一个用于和XMPP服务器通信的类库,由此可以实现即 ...
- (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...
- (转)OpenFire源码学习之十八:IOS离线推送
转:http://blog.csdn.net/huwenfeng_2011/article/details/43458213 IOS离线推送 场景: 如果您有iOS端的APP,在会话聊天的时候,用户登 ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- (转)OpenFire源码学习之六:用户注册
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413509 用户注册 注册流程: 1.客户端进行握手给服务端发送连接消息: <s ...
- (转)OpenFire源码学习之四:openfire的启动流程
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...
- (转)即时通讯IM OpenFire源码学习之三:在Eclipse中构建源码
转:http://blog.csdn.net/huwenfeng_2011/article/details/43412617 源码搭建 下载地址: 地址:http://www.igniterealti ...
随机推荐
- 自己总结的CSS3中transform变换、transition过渡、animation动画的基本用法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- subsequence 2
题目链接 题意:每次给出两个字母 和 只有这两个字母的原字符串的子序列,最后让你输出原字符串. 思路:先将字符转换为hash值,然后再转换成图,就是一个拓扑排序了,然后满足不了的情况有两种,一个是构造 ...
- [CSP-S模拟测试52]题解
A.平均数 看到第K小,又确定跟平衡树/主席树没有关系,可以把问题转化为有K-1个答案比它小再考虑二分. 二分平均值x,之后将原序列统一减去x.这时序列中区间和<0的区间个数就是原序列中平均值小 ...
- ZROI week4
考试 前言 起晚了,大概10点才开始看T1,被别人问了T2有点懵逼. 和 这题看了就A掉了,感觉很像原题的样子,是我的错觉吗?? 串串 某神仙有个\(O(n)\)做法问了我一下,我当时也没怎么想(因为 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 用MyEclipse将java文件转换成UML类图
用MyEclipse将java文件转换成UML类图 参考: 用MyEclipse将java文件转换成UML类图 - 君临天下的博客 - CSDN博客 http://blog.csdn.net/dan ...
- Oracle之Group by和Having-----转了
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条 ...
- vue中按需引入mint-UI报Error: .plugins[3][1] must be an object, false, or undefined
{ "presets": ["@babel/preset-env", "@babel/preset-react"], "plugi ...
- awk 按小时 统计接口调用次数
#统计所有接口总量awk -F ' ' '{a[$7]++} END{for(i in a){print i,a[i] | "sort -r -k 7"}}' accesslog/ ...
- leetcode.矩阵.240搜索二维矩阵II-Java
1. 具体题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性:每行的元素从左到右升序排列:每列的元素从上到下升序排列. 示例: 现有矩阵 ...