static void s_broker_client_msg(broker_t *self, zframe_t *sender, zmsg_t *msg) { assert(zmsg_size(msg) >= 2); zframe_t *service_frame = zmsg_pop(msg); service_t *service = s_service_require(self, service_frame); zmsg_wrap(msg, zframe_dup(sender)); if (zframe_size(service_frame) >= 4 && memcmp(zframe_data(service_frame), "mmi.", 4) == 0){ char *return_code; if (zframe_streq(service_frame, "mmi.service")){ char *name = zframe_strdup(zmsg_last(msg)); service_t *service = (service_t *)zhash_lookup(self->services, name); return_code = service && service->workers ? "200" : "404"; free(name); } else return_code = "501"; zframe_reset(zmsg_last(msg), return_code, strlen(return_code)); zframe_t *client = zmsg_unwrap(msg); zmsg_prepend(msg, &service_frame); zmsg_pushstr(msg, MDPC_CLIENT); zmsg_wrap(msg, client); zmsg_send(&msg, self->socket); } else s_service_dispatch(service, msg); zframe_destroy(&service_frame); }
// Worker using REQ socket to do load-balancing // static void * worker_task(void *args) { zctx_t *ctx = zctx_new(); void *worker = zsocket_new(ctx, ZMQ_REQ); #if (defined (WIN32)) zsocket_connect(worker, "tcp://localhost:5673"); // backend #else zsocket_connect(worker, "ipc://backend.ipc"); #endif // Tell broker we're ready for work zframe_t *frame = zframe_new(WORKER_READY, strlen(WORKER_READY)); zframe_send(&frame, worker, 0); // Process messages as they arrive while (1) { zmsg_t *msg = zmsg_recv(worker); if (!msg) break; // Interrupted zframe_print(zmsg_last(msg), "Worker: "); zframe_reset(zmsg_last(msg), "OK", 2); zmsg_send(&msg, worker); } zctx_destroy(&ctx); return NULL; }
void SNetDistribZMQUnpack(zframe_t **srcframe, void *dst, size_t count) { if (*srcframe != NULL) { size_t dst_size = count; size_t srcframe_size = zframe_size(*srcframe); byte *srcframe_data = zframe_data(*srcframe); if(dst_size > srcframe_size) { dst = NULL; } else { memcpy(dst, srcframe_data, dst_size); if ((srcframe_size - dst_size) != 0) { byte *newdst = SNetMemAlloc(srcframe_size - dst_size); memcpy(newdst, srcframe_data + count, srcframe_size - dst_size); zframe_reset(*srcframe, newdst, srcframe_size - dst_size); SNetMemFree(newdst); } else { zframe_destroy(srcframe); *srcframe = NULL; } } } else { dst = NULL; } }
static void* worker_routine(void* arg) { zmsg_t* msg; zframe_t* frame; zctx_t* ctx = zctx_new(); void* worker = zsocket_new(ctx, ZMQ_REQ); zsocket_connect(worker, "ipc://%s-localbe.ipc", self); frame = zframe_new(WORKER_READY, 1); zframe_send(&frame, worker, 0); while (1) { msg = zmsg_recv(worker); if (!msg) break; zframe_print(zmsg_last(msg), "Worker: "); zframe_reset(zmsg_last(msg), "OK", 2); zmsg_send(&msg, worker); } zctx_destroy(&ctx); return NULL; }
JNIEXPORT void JNICALL Java_org_zeromq_czmq_Zframe__1_1reset (JNIEnv *env, jclass c, jlong self, jbyteArray data, jlong size) { jbyte *data_ = (byte *) (*env)->GetByteArrayElements (env, data, 0); zframe_reset ((zframe_t *) (intptr_t) self, data_, (size_t) size); (*env)->ReleaseByteArrayElements (env, data, (jbyte *) data_, 0); }
static VALUE rb_czmq_frame_reset(VALUE obj, VALUE data) { errno = 0; ZmqGetFrame(obj); Check_Type(data, T_STRING); zframe_reset(frame, (char *)RSTRING_PTR(data), (size_t)RSTRING_LEN(data)); ZmqAssertSysError(); return Qnil; }
/** * gpp_worker_set_task_done: * @self: A #GPPWorker. * @reply: (allow-none): A string that will be passed to the client. * @success: Whether the task was successfully handled. * * Call this function when your worker has finished handling a task. * * Returns: %TRUE if the task was marked as done, %FALSE otherwise. */ gboolean gpp_worker_set_task_done (GPPWorker *self, const gchar *reply, gboolean success) { GPPWorkerPrivate *priv = GET_PRIV (self); zframe_t *request_frame = zmsg_last (priv->current_task); if (!priv->current_task) return FALSE; if (!success) { zframe_reset (request_frame, PPP_KO, 1); } else { zframe_reset (request_frame, reply, strlen (reply) + 1); } zmsg_send (&priv->current_task, priv->frontend); priv->current_task = NULL; check_socket_activity (priv->frontend_channel, G_IO_IN, self); return TRUE; }
static void s_broker_client_msg(broker_t *self, zframe_t *sender, zmsg_t *msg) { assert (zmsg_size(msg) >= 2); // Service name + body zframe_t *service_frame = zmsg_pop(msg); service_t *service = s_service_require(self, service_frame); // Не должен создавать сервис, в случаи запроса от клиента // Set reply return identity to client sender zmsg_wrap(msg, zframe_dup(sender)); // If we got a MMI service request, process that internally if (zframe_size(service_frame) >= 4 && memcmp(zframe_data(service_frame), "mmi.", 4) == 0) { char *return_code; if (zframe_streq(service_frame, "mmi.service")) { char *name = zframe_strdup (zmsg_last (msg)); service_t *service = (service_t *) zhash_lookup(self->services, name); if (service) { if (service->workers) { return_code = "200"; } else { return_code = "404"; } } else { return_code = "401"; } free(name); } else { return_code = "501"; } zframe_reset(zmsg_last(msg), return_code, strlen(return_code)); // Remove & save client return envelope and insert the // protocol header and service name, then rewrap envelope. zframe_t *client = zmsg_unwrap (msg); zmsg_push(msg, zframe_dup(service_frame)); zmsg_pushstr(msg, MDPC_CLIENT); zmsg_wrap(msg, client); zmsg_send(&msg, self->socket); } else { // Else dispatch the message to the requested service s_service_dispatch(service, msg); } zframe_destroy(&service_frame); }
void SNetDistribZMQPack(zframe_t **dstframe, void *src, size_t count) { if (*dstframe != NULL) { size_t src_size = count; size_t dstframe_size = zframe_size(*dstframe); byte *dstframe_data = zframe_data(*dstframe); byte *newsrc = SNetMemAlloc(src_size + dstframe_size); memcpy(newsrc, dstframe_data, dstframe_size); memcpy(newsrc + dstframe_size, src, src_size); zframe_reset(*dstframe, newsrc, dstframe_size + src_size); SNetMemFree(newsrc); } else { *dstframe = zframe_new(src, count); } }
// Worker using REQ socket to do load-balancing // static void * worker_task (void *args) { zctx_t *ctx = zctx_new (); void *worker = zsocket_new (ctx, ZMQ_REQ); zsocket_connect (worker, "ipc://backend.ipc"); // Tell broker we're ready for work zframe_t *frame = zframe_new (WORKER_READY, 1); zframe_send (&frame, worker, 0); // Process messages as they arrive while (true) { zmsg_t *msg = zmsg_recv (worker); if (!msg) break; // Interrupted zframe_reset (zmsg_last (msg), "OK", 2); zmsg_send (&msg, worker); } zctx_destroy (&ctx); return NULL; }
static void s_service_internal (broker_t *self, zframe_t *service_frame, zmsg_t *msg) { char *return_code; if (zframe_streq (service_frame, "mmi.service")) { char *name = zframe_strdup (zmsg_last (msg)); service_t *service = (service_t *) zhash_lookup (self->services, name); return_code = service && service->workers? "200": "404"; free (name); } else return_code = "501"; zframe_reset (zmsg_last (msg), return_code, strlen (return_code)); // Remove & save client return envelope and insert the // protocol header and service name, then rewrap envelope. zframe_t *client = zmsg_unwrap (msg); zmsg_push (msg, zframe_dup (service_frame)); zmsg_pushstr (msg, MDPC_CLIENT); zmsg_wrap (msg, client); zmsg_send (&msg, self->socket); }
/// // Set new contents for frame void QmlZframe::reset (const void *data, size_t size) { zframe_reset (self, data, size); };
static void s_broker_client_msg (broker_t *self, zframe_t *sender, zmsg_t *msg) { assert (zmsg_size (msg) >= 2); // Service name + body zframe_t *service_frame = zmsg_pop (msg); service_t *service = s_service_require (self, service_frame); // If we got a MMI service request, process that internally if (zframe_size (service_frame) >= 4 && memcmp (zframe_data (service_frame), "mmi.", 4) == 0) { char *return_code; if (zframe_streq (service_frame, "mmi.service")) { char *name = zframe_strdup (zmsg_last (msg)); service_t *service = (service_t *) zhash_lookup (self->services, name); return_code = service && service->workers? "200": "404"; free (name); } else // The filter service that can be used to manipulate // the command filter table. if (zframe_streq (service_frame, "mmi.filter") && zmsg_size (msg) == 3) { zframe_t *operation = zmsg_pop (msg); zframe_t *service_frame = zmsg_pop (msg); zframe_t *command_frame = zmsg_pop (msg); char *command_str = zframe_strdup (command_frame); if (zframe_streq (operation, "enable")) { service_t *service = s_service_require (self, service_frame); s_service_enable_command (service, command_str); return_code = "200"; } else if (zframe_streq (operation, "disable")) { service_t *service = s_service_require (self, service_frame); s_service_disable_command (service, command_str); return_code = "200"; } else return_code = "400"; zframe_destroy (&operation); zframe_destroy (&service_frame); zframe_destroy (&command_frame); free (command_str); // Add an empty frame; it will be replaced by the return code. zmsg_pushstr (msg, ""); } else return_code = "501"; zframe_reset (zmsg_last (msg), return_code, strlen (return_code)); // Insert the protocol header and service name, then rewrap envelope. zmsg_push (msg, zframe_dup (service_frame)); zmsg_pushstr (msg, MDPC_REPORT); zmsg_pushstr (msg, MDPC_CLIENT); zmsg_wrap (msg, zframe_dup (sender)); zmsg_send (&msg, self->socket); } else { int enabled = 1; if (zmsg_size (msg) >= 1) { zframe_t *cmd_frame = zmsg_first (msg); char *cmd = zframe_strdup (cmd_frame); enabled = s_service_is_command_enabled (service, cmd); free (cmd); } // Forward the message to the worker. if (enabled) { zmsg_wrap (msg, zframe_dup (sender)); zlist_append (service->requests, msg); s_service_dispatch (service); } // Send a NAK message back to the client. else { zmsg_push (msg, zframe_dup (service_frame)); zmsg_pushstr (msg, MDPC_NAK); zmsg_pushstr (msg, MDPC_CLIENT); zmsg_wrap (msg, zframe_dup (sender)); zmsg_send (&msg, self->socket); } } zframe_destroy (&service_frame); }
int main(int argc, char **argv) { /* SETUP */ // logging setlogmask(LOG_UPTO(LOG_DEBUG)); openlog(PROGRAM_NAME, LOG_CONS | LOG_PID | LOG_PERROR, LOG_USER); syslog(LOG_INFO, "worker starting up"); // load transit data from disk tdata_t tdata; tdata_load(RRRR_INPUT_FILE, &tdata); // initialize router router_t router; router_setup(&router, &tdata); //tdata_dump(&tdata); // debug timetable file format // establish zmq connection zctx_t *zctx = zctx_new (); void *zsock = zsocket_new(zctx, ZMQ_REQ); uint32_t zrc = zsocket_connect(zsock, WORKER_ENDPOINT); if (zrc != 0) exit(1); // signal to the broker/load balancer that this worker is ready zframe_t *frame = zframe_new (WORKER_READY, 1); zframe_send (&frame, zsock, 0); syslog(LOG_INFO, "worker sent ready message to load balancer"); /* MAIN LOOP */ uint32_t request_count = 0; char result_buf[OUTPUT_LEN]; while (true) { zmsg_t *msg = zmsg_recv (zsock); if (!msg) // interrupted (signal) break; if (++request_count % 100 == 0) syslog(LOG_INFO, "worker received %d requests\n", request_count); // only manipulate the last frame, then send the recycled message back to the broker zframe_t *frame = zmsg_last (msg); if (zframe_size (frame) == sizeof (router_request_t)) { router_request_t *preq; preq = (router_request_t*) zframe_data (frame); router_request_t req = *preq; // protective copy, since we're going to reverse it D printf ("Searching with request: \n"); I router_request_dump (&router, &req); router_route (&router, &req); // repeat search in reverse to compact transfers uint32_t n_reversals = req.arrive_by ? 1 : 2; //n_reversals = 0; // DEBUG turn off reversals for (uint32_t i = 0; i < n_reversals; ++i) { router_request_reverse (&router, &req); // handle case where route is not reversed D printf ("Repeating search with reversed request: \n"); D router_request_dump (&router, &req); router_route (&router, &req); } // uint32_t result_length = router_result_dump(&router, &req, result_buf, OUTPUT_LEN); struct plan plan; router_result_to_plan (&plan, &router, &req); plan.req.time = preq->time; // restore the original request time uint32_t result_length = render_plan_json (&plan, router.tdata, result_buf, OUTPUT_LEN); zframe_reset (frame, result_buf, result_length); } else { syslog (LOG_WARNING, "worker received reqeust with wrong length"); zframe_reset (frame, "ERR", 3); } // send response to broker, thereby requesting more work zmsg_send (&msg, zsock); } /* TEAR DOWN */ syslog(LOG_INFO, "worker terminating"); // frame = zframe_new (WORKER_LEAVING, 1); // zframe_send (&frame, zmq_sock, 0); // syslog(LOG_INFO, "departure message sent to load balancer"); // zmsg_t *msg = zmsg_recv (zmq_sock); router_teardown(&router); tdata_close(&tdata); zctx_destroy (&zctx); //zmq_close(socket) necessary before context destroy? exit(EXIT_SUCCESS); }
Z K2(zframereset){zframe_reset(VSK(x), yG, N(y)); RZ;}